TLS(Transport Layer Security) 란?
TLS란 인터넷에서의 개인 정보와 데이터 보안을 위해 설계되어 널리 채택된 보안 프로토콜로, 클라이언트와 서버 간에 보안 연결을 설정하는 초기 절차이다.
TLS는 SSL(Secure Sockets Layer)이라는 이전의 암호화 프로토콜에서 발전한 형태이다.
HTTPS는 HTTP 프로토콜 상위에서 TLS 암호화를 구현한 것으로, HTTPS를 사용하는 웹사이트에서는 TLS 암호화를 사용한다.
TLS의 역할
- 암호화 : 제 3자가 통신 내용을 볼 수 없도록 암호화한다.
- 무결성 : 데이터가 전송 중에 변조되지 않았음을 보장한다.
- 인증 : 서버(경우에 따라서는 클라이언트)의 신원을 검증한다.
TLS Handshake
- TLS 연결은 TLS Handshake를 사용한다. 하지만, TLS 자체가 Transport Layer에서 일어나므로 TCP 연결을 3-way handshake를 통해 맺은 후에 일어나게 된다.
TLS Handshake 과정
1. Client Hello
클라이언트가 서버로 메세지를 전송한다. 이 때 같이 전송하는 정보는 다음과 같다.
- 사용 가능한 TLS 버젼
- Client가 지원하는 암호화 방식 리스트
- 클라이언트에서 랜덤으로 생성한 난수(대칭키를 만들 때 사용)
- 세션 ID
- SNI(서버 명) 등
이 때, 세션 ID를 보내는 것은 매번 연결을 맺을 때마다 TLS Handshake를 거치는 것이 비효율적이므로, 한 번 핸드쉐이크 과정을 거친 후에 갖게 되는 세션 ID를 통해 같은 과정을 반복하지 않는 것이다.
최초 세션 ID는 0이지만, 서버로부터 세션 ID를 받아 로컬에 저장해둔다. 다시 연결을 위해 세션 ID를 패킷에 담아 전송하게 되는데, 이 세션 ID가 유효하다면 동일한 세션 ID를 서버에서 클라이언트로 전송한다.
2. Server Hello
클라에서 보낸 Client Hello에 대한 응답이다. 이 때 같이 보내는 정보는 다음과 같다.
- TLS 버젼
- 암호화 방식(클라가 보낸 리스트 중 서버가 사용 가능한 것 선택)
- 서버에서 랜덤으로 생성한 난수(대칭키를 만들 때 사용)
- 세션 ID(유효한 세션 ID)
- 인증서(서버의 공개키를 포함)
3. 서버 인증 및 키 교환
서버에서 보낸 인증서를 클라이언트에서 유효한지 확인한다.(올바른 CA로부터 발급된 인증서인지 등을 확인)
인증서가 유효한지 검증되었으면 클라이언트에서의 난수와 서버에서의 난수를 조합하여 대칭키를 생성한다. 그리고 이 대칭키를 서버의 공개키로 암호화하여 서버에게 전송한다.
정확하게는 클라이언트의 난수와 서버의 난수를 서버에서 선택한 암호화 알고리즘으로 조합하여 Pre-Master Secret이라 불리는 대칭키를 만들 때 사용되는 정보를 생성한다. 이 정보를 서버의 공개키로 암호화하여 서버에 전송하면, 서버의 개인키로만 복호화가 가능하다.
그렇게 되면 이 정보를 클라와 서버 모두에서 갖고 있게 되고, 이 것을 통해 세션에서 사용될 대칭키를 만든다.
4. 클라이언트 & 서버 Change Cipher Spec
클라이언트가 이제부터 암호화된 통신을 시작하겠다는 의미로 서버로 ChangeCipherSpec 메세지를 보내게 된다.
서버도 동일하게 해당 메세지를 클라이언트로 보내며 응답한다.
5. Finished
위 과정 직후 클라이언트는 암호화된 Finishied 메세지를 서버로 보낸다. 이때, 지금까지의 핸드쉐이크 전체가 무결하게 진행되었는지 검증하는 값을 포함하게 된다.
서버도 해당 메세지를 받고 동일한 방식으로 암호화된 Finished 메세지를 클라이언트에게 보낸다.
'네트워크' 카테고리의 다른 글
[네트워크] HTTP와 HTTPS (0) | 2025.05.04 |
---|