[TIL] 250521_Network: TLS handshake와 TLS 0-RTT

지코·2025년 5월 21일
1

Today I Learned

목록 보기
68/74
post-thumbnail

📌 TLS(Transport Layer Security)

TLS는 안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜이다. 보안 소켓 계층(Secure Socket Layer, SSL)은 원래 HTTP용으로 개발된 암호화 프로토콜이었으나, SSL이 오래 전에 전송 계층 보안(Transport Layer Security, TLS)으로 대체되었다.


📌 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 핸드셰이크는 언제 발생하는가?

TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹사이트의 원본 서버를 쿼리하기 시작할 때마다 발생한다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 매번 TLS 핸드셰이크가 발생한다. 또한 TLS 핸드셰이크는 TCP 연결이 핸드셰이크를 통해 열린 후에 발생한다.


📌 TLS 0-RTT는 무엇인가?

TLS 0-RTT(단축 협상)는 TLS 1.3에서 새롭게 도입된 기능으로, 이전에 통신한 적 있는 서버와의 재접속 시 암호화된 데이터를 핸드셰이크 없이 즉시 전송할 수 있게 해주는 기능이다.
이름 그대로 0-RTT(Zero Round Trip Time) - 즉, 데이터를 서버에 보내기까지 왕복 지연이 0번이라는 의미이다. 빠른 재접속을 위해 사용되는 TLS 1.3의 기능이다.

TLS 0-RTT의 장점

  • 첫 요청에서 지연 없이 데이터를 전송하는 것이 가능하다.
  • 모바일 환경이나 재방문 페이지에서 체감 속도를 개선할 수 있으며, 리소스 절약이 가능하다.
  • HTTP/3, QUIC와 함께 사용할 때 시너지가 크다.

0-RTT는 왜 항상 사용되지는 않는가? (단점 / 주의점)

  • 0-RTT는 재전송 공격(Replay Attack)에 취약하다.
  • 서버가 클라이언트의 이전 세션 정보를 기억해야 한다는 부담이 있어, 서버 부하가 일어날 수 있다.
  • 암호화는 되어 있지만, 완전한 보안이 보장되는 것은 아니다. 이렇기에 TLS 1.3을 지원하는 웹 서버에서 0-RTT 설정은 기본 off로 설정되어 있다.

0-RTT는 어떤 조건에서 사용 가능한가?

  • 이전에 같은 서버와 1-RTT로 연결을 성공한 적이 있어야 한다.
  • 그 연결로부터 세션 복원 정보(PSK, pre-shared key)를 재사용해야 한다.

➡️ TLS 0-RTT는 TLS 1.3에서 도입된 기능으로, 클라이언트가 이전에 연결했던 서버에 재접속할 때 지연 없이 바로 데이터를 전송할 수 있는 방식이다.

덕분에 사용자는 더 빠르게 페이지를 요청할 수 있으며, 특히 모바일이나 HTTP/3 환경에서 체감 성능을 크게 향상시킬 수 있다.

하지만 0-RTT는 재전송 공격에 취약하고, 서버가 클라이언트의 세션 정보를 기억해야 한다는 부담이 있어 사용 시 주의가 필요하다.

Reference

📄 매일메일 - TLS handshake 과정에 대해 설명해주세요.
🔖 TLS 핸드셰이크란? | 세션키 교환 | Cloudflare
✍🏻 TLS1.3 (8) - TLS1.3 Handshake / 1-RTT&0-RTT / 완전 협상&단축 협상

profile
꾸준하고 성실하게, FE 개발자 역량을 키워보자 !

1개의 댓글

comment-user-thumbnail
2025년 5월 28일

HTTPS의 보안 연결 방식인 TLS에 대해 대략적으로만 알았는데, 포스팅을 통해서 더 자세히 알게 되었습니다! 👍🏻

답글 달기