TLS는 안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜이다. 보안 소켓 계층(Secure Socket Layer, SSL)은 원래 HTTP용으로 개발된 암호화 프로토콜이었으나, SSL이 오래 전에 전송 계층 보안(Transport Layer Security, TLS)으로 대체되었다.
TLS 핸드셰이크는 브라우저와 서버가 TLS 프로토콜을 통해 암호화된 통신을 시작하기 전, 안전하게 연결을 설정하는 절차이다. 이 절차는 보통 다음과 같은 흐름으로 이뤄진다.
먼저 브라우저는 Client Hello
메세지를 보낸다. 여기에는 브라우저가 지원하는 TLS 버전, 사용할 수 있는 암호화 알고리즘 목록, 세션 ID, 그리고 Client Random이라는 난수가 포함되어 있다.
서버는 이에 대해 Server Hello
로 응답하면서, 서버가 선택한 암호화 방식, 자신의 Server Random 값, 그리고 디지털 인증서를 함께 보낸다. 이 인증서 안에는 서버의 공개키와 CA의 서명이 포함되어 있으며, 브라우저는 이걸 통해 서버의 신원을 검증한다.
검증이 완료되면 브라우저는 서버의 공개키로 Pre-Master Secret이라는 임시 비밀값을 암호화해서 전송한다. 서버는 자신의 개인키로 이를 복호화해 Pre-Master Secret 값을 복원하고, 이제 클라이언트와 서버는 서로 갖고 있는 Client Random, Server Random, 그리고 Pre-Master Secret을 기반으로 동일한 대칭키를 생성한다. 이 대칭키는 이후 주고 받는 데이터를 암호화하고 복호화하는 데 사용된다.
마지막으로 서로 Finished
메세지를 교환하면서 대칭키로 암호화된 통신이 잘 되는지 확인하고 나면, 정상적인 HTTPS 통신이 시작된다.
TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹사이트의 원본 서버를 쿼리하기 시작할 때마다 발생한다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 매번 TLS 핸드셰이크가 발생한다. 또한 TLS 핸드셰이크는 TCP 연결이 핸드셰이크를 통해 열린 후에 발생한다.
TLS 0-RTT(단축 협상)는 TLS 1.3에서 새롭게 도입된 기능으로, 이전에 통신한 적 있는 서버와의 재접속 시 암호화된 데이터를 핸드셰이크 없이 즉시 전송할 수 있게 해주는 기능이다.
이름 그대로 0-RTT(Zero Round Trip Time) - 즉, 데이터를 서버에 보내기까지 왕복 지연이 0번이라는 의미이다. 빠른 재접속을 위해 사용되는 TLS 1.3의 기능이다.
PSK, pre-shared key
)를 재사용해야 한다.➡️ TLS 0-RTT는 TLS 1.3에서 도입된 기능으로, 클라이언트가 이전에 연결했던 서버에 재접속할 때 지연 없이 바로 데이터를 전송할 수 있는 방식이다.
덕분에 사용자는 더 빠르게 페이지를 요청할 수 있으며, 특히 모바일이나 HTTP/3 환경에서 체감 성능을 크게 향상시킬 수 있다.
하지만 0-RTT는 재전송 공격에 취약하고, 서버가 클라이언트의 세션 정보를 기억해야 한다는 부담이 있어 사용 시 주의가 필요하다.
📄 매일메일 - TLS handshake 과정에 대해 설명해주세요.
🔖 TLS 핸드셰이크란? | 세션키 교환 | Cloudflare
✍🏻 TLS1.3 (8) - TLS1.3 Handshake / 1-RTT&0-RTT / 완전 협상&단축 협상
HTTPS의 보안 연결 방식인 TLS에 대해 대략적으로만 알았는데, 포스팅을 통해서 더 자세히 알게 되었습니다! 👍🏻