TLS 핸드셰이크 (TLS Handshake)

한눈에 보기

TLS 핸드셰이크는 암호 알고리즘 협상, 인증서 검증, 키 합의를 수행하는 절차이다. TLS 1.3의 1-RTT 과정을 단계별로 살피고 1.2와의 차이, 0-RTT 재개와 위험까지 정리한다.

최종 업데이트 2026.09.17

TLS 핸드셰이크(TLS handshake)는 클라이언트와 서버가 암호화 통신을 시작하기 전에 사용할 알고리즘을 협상하고, 서버의 신원을 인증서로 확인하며, 세션을 암호화할 키를 안전하게 합의하는 절차이다. 현재 표준인 TLS 1.3은 이 모든 과정을 왕복 한 번(1-RTT)에 끝내고, 재접속 시에는 0-RTT로 데이터를 함께 보낼 수도 있다. HTTPS 접속에서 브라우저 자물쇠 아이콘 뒤에 실제로 일어나는 일이 바로 이 핸드셰이크이며, 웹 보안의 사실상 출발점이라고 할 수 있다.

핸드셰이크가 해결하는 세 가지 문제

암호화 통신을 시작하려면 세 가지가 먼저 해결되어야 한다. 첫째, 양쪽이 지원하는 TLS 버전과 암호 스위트(cipher suite) 중 무엇을 쓸지 합의해야 한다. 둘째, 지금 대화하는 상대가 정말 그 도메인의 서버인지 확인해야 한다. 이것이 없으면 중간자 공격(man-in-the-middle attack)으로 공격자가 서버 행세를 할 수 있다. 셋째, 도청자가 있어도 둘만 아는 대칭키를 만들어야 한다. 핸드셰이크는 협상, 인증, 키 교환이라는 이 세 문제를 한 절차에 묶은 것이다. 키 교환의 핵심은 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)로, 서로의 공개값만 주고받고도 제3자는 계산할 수 없는 공유 비밀을 양쪽이 각자 유도할 수 있다. 비밀 자체는 회선에 실리지 않으므로 전 구간을 도청당해도 안전하다는 점이 이 수학의 묘미다.

TLS 1.3 핸드셰이크의 과정

  1. ClientHello: 클라이언트가 지원하는 암호 스위트 목록, 랜덤 값, 그리고 미리 만들어 둔 ECDHE 공개값(key share)을 함께 보낸다. 접속하려는 도메인은 SNI(Server Name Indication) 확장에 담긴다.
  2. ServerHello: 서버가 암호 스위트를 선택하고 자신의 ECDHE 공개값과 랜덤 값을 보낸다. 이 시점에 양쪽 모두 공유 비밀을 계산할 수 있으므로, 이후 서버가 보내는 메시지부터 이미 암호화된다.
  3. 서버 인증: 서버가 암호화된 채널로 인증서 체인을 보내고, 자신의 개인키로 핸드셰이크 내용 전체에 서명한 CertificateVerify를 보낸다. 클라이언트는 CA(Certificate Authority) 서명 사슬과 도메인 일치, 유효 기간을 검증하고 서명을 확인해 서버가 인증서의 개인키를 실제로 보유함을 확인한다.
  4. Finished: 양쪽이 지금까지의 핸드셰이크 전체에 대한 검증값을 교환해 협상 과정이 변조되지 않았음을 확인한다. 여기까지 왕복 1회이며, 클라이언트는 Finished와 함께 첫 애플리케이션 데이터를 바로 실어 보낼 수 있다.
  5. 이후 공유 비밀에서 파생한 세션 키와 AEAD(Authenticated Encryption with Associated Data) 알고리즘으로 데이터를 주고받는다.

세션 키는 방향별, 용도별로 여러 개가 파생되며, 핸드셰이크용 키와 애플리케이션 데이터용 키도 분리되어 있어 한 키가 노출되어도 피해 범위가 제한된다.

TLS 1.2와 무엇이 달라졌나

TLS 1.2는 협상을 마친 뒤에야 키 교환을 시작하므로 왕복 2회가 필요했고, RSA로 클라이언트가 만든 비밀을 서버 공개키로 암호화해 보내는 정적 키 교환도 허용했다. 이 방식은 서버 개인키가 유출되면 저장해 둔 과거 트래픽까지 복호화되는 약점이 있다. TLS 1.3은 클라이언트가 첫 메시지에 키 교환 재료를 미리 실어 보내는 낙관적 설계로 왕복을 하나 줄였고, 키 교환은 일회용 ECDHE만 허용해 순방향 비밀성(forward secrecy)을 의무화했다. 또한 RC4, 3DES, CBC 모드, 압축처럼 실제 공격에 악용된 오래된 알고리즘을 표준에서 제거해, 잘못된 설정으로 취약한 조합이 협상될 여지 자체를 없앴다. 만약 서버가 클라이언트가 보낸 키 교환 방식을 지원하지 않으면 HelloRetryRequest로 다른 방식을 요청하는 예외 경로가 한 번 더 돌 수 있다.

구분TLS 1.2TLS 1.3
첫 연결 왕복 수2-RTT1-RTT
키 교환RSA 정적 교환 허용일회용 (EC)DHE만 허용
순방향 비밀성구성에 따라 다름항상 보장
암호 스위트수십 종, 취약 조합 존재AEAD 5종으로 정리
핸드셰이크 암호화대부분 평문ServerHello 이후 암호화(인증서도 은닉)
세션 재개세션 ID, 세션 티켓PSK 기반, 0-RTT 지원

세션 재개와 0-RTT

한 번 접속한 서버에 다시 연결할 때는 이전 세션에서 발급받은 PSK(Pre-Shared Key) 티켓으로 인증서 검증 과정을 생략하고 빠르게 재개할 수 있다. 웹 브라우징처럼 같은 서버에 반복 접속하는 사용 패턴에서는 이 재개 경로가 체감 성능에 큰 몫을 차지한다. 나아가 0-RTT 모드에서는 클라이언트가 첫 패킷에 애플리케이션 데이터까지 실어 보내 지연을 완전히 없앤다. 다만 0-RTT 데이터는 공격자가 가로채 그대로 다시 보내는 재전송 공격(replay attack)에 취약하므로, 결제처럼 중복 실행되면 안 되는 요청에는 쓰지 말고 GET 같은 멱등(idempotent) 요청으로 제한해야 한다. 한편 HTTP/3에서는 TLS 1.3 핸드셰이크가 QUIC 연결 수립에 내장되어 전송 계층과 보안 계층의 협상이 한 번에 끝나고, SNI에 남아 있던 평문 도메인 노출도 ECH(Encrypted Client Hello)로 가리는 작업이 진행 중이다.

면접에서 이렇게 물어본다

  • TLS 핸드셰이크가 협상, 인증, 키 교환의 세 가지 문제를 각각 어떻게 해결하는지 설명해 보라.
  • TLS 1.3이 1.2보다 빠르고 안전해진 구체적인 이유는 무엇인가.
  • 클라이언트는 서버 인증서를 어떤 순서로 검증하는가.
  • 순방향 비밀성이란 무엇이고 ECDHE가 이를 어떻게 보장하는가.
  • 0-RTT 재개의 이점과 재전송 공격 위험, 그리고 안전한 사용 조건을 설명해 보라.
네트워크 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기