TLS(Transport Layer Security)의 핸드쉐이킹(Handshake) 과정은 클라이언트와 서버가 보안 연결을 수립하기 위해 수행하는 초기 통신 절차입니다. 이 과정에서 암호화 알고리즘, 세션 키, 인증서 등을 협의하고 교환합니다.
✅ TLS 핸드쉐이킹 절차 (TLS 1.2 기준)
1. ClientHello (클라이언트 → 서버)
- 클라이언트가 서버에게 다음 정보를 보냄:
- 지원하는 TLS 버전
- 클라이언트 랜덤값 (client_random)
- 지원하는 암호 스위트 목록 (Cipher Suites)
- 확장정보 (예: SNI - Server Name Indication)
2. ServerHello (서버 → 클라이언트)
- 서버가 다음 정보로 응답함:
- 선택된 TLS 버전
- 서버 랜덤값 (server_random)
- 선택한 암호 스위트
- 세션 ID
- 서버 인증서 (공개키 포함)
- (선택) 서버 키 교환 메시지
- (선택) 클라이언트 인증 요청
3. 서버 인증 및 키 교환
- 클라이언트는 서버 인증서를 검증함 (인증서 체인 → 루트CA)
- 서버가 선택한 키 교환 방식(Diffie-Hellman, RSA 등)에 따라,
- RSA: 클라이언트는 서버의 공개키로 Premaster Secret을 암호화
- DH/ECDHE: 서버와 클라이언트가 각각 공개키/비밀키 기반으로 키 교환
4. ClientKeyExchange (클라이언트 → 서버)
- 클라이언트가 암호화된 Premaster Secret을 보냄
5. 세션 키 생성
- 양측은 다음 정보를 바탕으로 대칭키(Session Key) 생성:
- client_random
- server_random
- premaster secret
6. ChangeCipherSpec & Finished
- 클라이언트 → 서버:
- "이제부터는 암호화 통신 시작할게요" (ChangeCipherSpec)
- Finished 메시지를 암호화해서 전송
- 서버 → 클라이언트:
- ChangeCipherSpec
- Finished 메시지를 암호화해서 전송
🚀 TLS 1.3 변화 및 최적화
주요 특징
- 핸드쉐이크 라운드 수 감소 (1 RTT)
- RSA 키 교환 제거 → Forward Secrecy 필수
ChangeCipherSpec
메시지 제거
- 클라이언트 인증은 선택적으로 지원
- 세션 재사용 대신 0-RTT 데이터 전송 지원
📊 TLS 1.2 vs TLS 1.3 비교표
항목 |
TLS 1.2 |
TLS 1.3 |
핸드쉐이크 라운드 |
최소 2 RTT |
1 RTT |
키 교환 방식 |
RSA, DH, ECDHE |
ECDHE (Forward Secrecy 필수) |
암호화 시작 시점 |
Finished 메시지 이후 |
서버 Finished 직후 |
인증서 암호화 |
평문 전송 |
암호화 가능 |
지원 암호 알고리즘 |
다양한 (RC4, 3DES 등 포함) |
보안 강화된 알고리즘만 |
세션 재사용 방식 |
세션 ID / 세션 재개 |
PSK + 0-RTT |
보안성 |
중간자 공격 우려 존재 |
향상된 보안, PFS 필수 적용 |
설정 복잡도 |
상대적으로 복잡 |
간소화됨 |
✅ 참고
- TLS 1.3은 HTTPS 성능 향상에 크게 기여
- Wireshark에서 TLS 1.3 패킷은
EncryptedExtensions
, Finished
등이 첫 패킷에 포함됨