137. TLS 1.3 핸드셰이크 (1-RTT, 0-RTT, PSK)
⚠️ 이 문서는 웹 브라우저와 서버가 "어떤 암호를 쓸지 정하고 비밀번호를 교환하는 과정(핸드셰이크)"을 혁명적으로 다이어트시켜, 과거 TLS 1.2의 느려터진 접속 지연(Latency)을 반 토막 내고 보안 구멍까지 싹 다 메워버린 현대 인터넷의 헌법, TLS 1.3의 초고속 접속 아키텍처를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: TLS 1.3 핸드셰이크는 클라이언트와 서버가 암호 통신(HTTPS)의 뼈대를 맞추는 협상 과정에서, 쓸데없는 인사치레를 생략하고 한 번의 왕복(1-RTT)만으로 마스터키 세팅을 끝내는 최적화된 프로토콜이다.
- 가치: 과거 TLS 1.2는 브라우저가 통신을 시작하려면 무조건 두 번 왔다 갔다(2-RTT) 해야 해서 로딩 속도가 느렸다. 1.3은 한 번의 왕복으로 속도를 극대화했으며, 이전에 접속했던 서버라면 아예 인사도 생략하고 0.00초 만에 바로 암호화 데이터를 쏘는 **0-RTT(Zero Round Trip Time)**의 기적을 달성했다.
- 융합: 이 미친 속도전은 취약한 구형 RSA 키 교환을 버리고, 오직 1회용 타원곡선 **ECDHE(키 교환)**와 **PSK(사전 공유 키)**만을 절대 뼈대로 강제 융합했기에 가능해진 보안 공학의 대수술 결과다.
Ⅰ. 개요 및 왜 TLS 1.3이 혁명인가? (Context & Necessity)
우리가 네이버에 접속할 때, 주소창에 자물쇠(HTTPS)가 뜨기 전까지 내 스마트폰과 네이버 서버 사이에는 눈에 보이지 않는 엄청난 면접(Handshake)이 일어난다.
-
과거 (TLS 1.2의 2-RTT 거북이 인사)
- 폰: "안녕? 우리 암호 통신할래?" $\rightarrow$ 서버: "그래, 우리 AES 암호랑 RSA 쓰자." (1왕복 끝: 1-RTT)
- 폰: "오케이! 그럼 이제 열쇠 섞는다! 이거 받아!" $\rightarrow$ 서버: "오케이, 풀었어. 이제 진짜 데이터 보내봐." (2왕복 끝: 2-RTT)
- 이 과정에 무려 0.2초 이상이 버려졌다. 5G 시대에 인터넷 창이 1초 늦게 뜨면 고객 10%가 이탈한다. 브라우저 개발사들은 분노했다.
-
대수술 (TLS 1.3의 1-RTT 혁명) "야! 첫 번째 인사할 때 서로 간 볼 거 없어! 묻지도 따지지도 말고 그냥 대중적으로 제일 많이 쓰는 열쇠 찌꺼기(ECDHE $X$좌표)부터 같이 묶어서 냅다 쏴버려!" 과거엔 '협상 $\rightarrow$ 키 교환'으로 두 번에 걸쳐 하던 짓을, 봉투 하나에 다 쑤셔 넣고 한 방에(1-RTT) 던져버려 속도를 2배로 폭증시킨 것이 TLS 1.3의 위대한 혁명이다.
📢 섹션 요약 비유: TLS 1.2는 중국집에 전화해서 "여보세요, 거기 짜장면 파나요?" 물어보고 "네 팝니다" 하면 "그럼 짜장면 1그릇 가져다주세요" 하는 두 번의 통화(2-RTT)입니다. TLS 1.3은 전화를 걸자마자 "여보세요 짜장면 1그릇 우리 집으로 배달이요 뚝!" 하고 한 번에 통화를 끝내는(1-RTT) 극강의 스피드 주문입니다.
Ⅱ. TLS 1.3의 3대 접속 마법 심층 해부
TLS 1.3은 상황에 따라 가장 빠른 로켓을 선택해 접속을 처리한다.
1. 1-RTT (기본 핸드셰이크) - "만나서 반가워, 열쇠 받아!"
처음 만나는 서버와 통신할 때 일어난다.
- Client Hello (1/2 왕복): 브라우저가 인사말과 함께, **"내 타원곡선(X25519) 1회용 당구공 좌표는 이거야!(Key Share)"**라고 키 교환 재료를 아예 첫 편지에 동봉해서 서버로 쏜다.
- Server Hello (1 왕복 끝!): 서버는 브라우저가 보낸 좌표를 받고 즉시 자기 좌표를 튕겨서 마스터키 조립을 끝내버린다. 그리고 **"네 좌표 잘 받았고 나도 내 좌표 보낸다. 우리 암호키 완성됐으니 바로 지금 이 순간부터 내 말은 다 암호화(AES)해서 보낼게!"**라며 서버의 신분증(인증서 서명)조차 암호화해서 던져준다. (과거 1.2는 신분증을 평문으로 보내 해커가 다 봤음).
- 클라이언트도 마스터키 조립이 끝나자마자 바로 암호화된 진짜 데이터(HTTP GET /)를 서버로 쏜다. 정확히 1번 왕복 만에 암호화 터널이 완성되었다.
2. PSK (Pre-Shared Key) - "우리 어제 맞춘 비밀번호 기억하지?"
네이버에 어제 접속했던 사람이 오늘 또 접속한다. 매번 저 당구공 튕기기(ECDHE)를 다시 해야 할까?
- 1.3은 어제 통신을 끝낼 때, 서버가 브라우저에게 "내일 또 올 때 이 티켓(Ticket)을 보여주면 당구 안 쳐도 바로 통과시켜 줄게"라며 **세션 복구용 비밀번호(PSK, 사전 공유 키)**를 몰래 하나 쥐여주고 보낸다.
- 오늘 다시 접속할 때, 브라우저는 복잡한 계산 없이 주머니에서 이 티켓(PSK)을 꺼내 서버에 던진다.
- 서버는 티켓을 확인하고 "어! 어제 그놈이네. 암호화 바로 켜자!" 하고 0.01초 만에 세션을 복구한다.
3. 0-RTT (Zero-RTT) - "인사도 사양한다. 본론부터 들어간다"
TLS 1.3의 가장 미친 최적화이자 양날의 검이다.
- 어제 네이버에서 받은 **티켓(PSK)**이 있으니까, 앨리스는 다음 날 접속할 때 인사말(Client Hello)을 보내면서 그 편지 봉투에 **암호화된 첫 번째 진짜 요청 데이터(예: "내 장바구니 목록 내놔!")**를 무작정 같이 구겨 넣고 쏴버린다.
- 왕복(RTT)이 한 번도 끝나지 않았는데(0-RTT), 서버는 첫 인사말을 뜯자마자 티켓을 확인하고 바로 데이터(장바구니 목록)를 읽어버린다. 인터넷 접속 대기 시간(Latency)이 수학적으로 아예 소멸(0초)해 버린 것이다!
┌──────────────────────────────────────────────────────────────────────────────┐
│ TLS 1.2 거북이 vs TLS 1.3(1-RTT) 로켓의 핸드셰이크 비교 시각화 │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ 🐢 [ TLS 1.2 (2-RTT) : 답답한 탁구 게임 ] │
│ 👨 폰: "안녕? 나 크롬이야. 뭐 쓸래?" ────▶ │
│ ◀──── 🏢 서버: "응, AES 쓸게." │
│ 👨 폰: "그래, 그럼 내 1회용 키 여깄어." ──▶ │
│ ◀──── 🏢 서버: "받았어. 내 키 여깄고 도장 찍음." │
│ 👨 폰: (드디어 완성) "장바구니 보여줘!" ──▶ [총 0.2초 낭비] │
│ │
│ 🚀 [ TLS 1.3 (1-RTT) : 쿨한 상남자 거래 ] │
│ 👨 폰: "안녕, 나 크롬이고 내 1회용 키 여기 다 넣었어! 알아서 받아!" ──▶ │
│ ◀──── 🏢 서버: "오케이 키 조립 완료! 내 키 여깄고 │
│ (이후부터 완벽한 암호화 발동) │
│ 도장 찍었어. 이제 안전하다." │
│ 👨 폰: (1왕복 만에 완성) "장바구니 보여줘!" ──▶ [총 0.1초 컷!] │
└──────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] "어? 만약 브라우저가 던진 1회용 키 맵(예: X25519)을 서버가 지원 안 하는 구형 서버면 어떡해요?" 좋은 질문이다. 이때는 서버가 "야, 나 X25519 맵 안 깔려있어. P-256 맵으로 다시 공 튕겨서 보내봐"라고 **재요청(Hello Retry Request)**을 때린다. 이때만 예외적으로 옛날처럼 1번 왕복이 추가로 소모(2-RTT)된다. 하지만 구글 크롬이 쓰는 X25519 같은 국민 맵을 거부하는 웹 서버는 요즘 지구상에 거의 없으므로, 99%의 확률로 1-RTT 쾌속 접속이 성공한다.
- 📢 섹션 요약 비유: 0-RTT는 어제 햄버거집을 나갈 때 사장님이 준 '프리패스 쿠폰(PSK)'을 써먹는 겁니다. 다음날 햄버거집 문을 열고 들어가자마자 사장님과 인사도 안 나누고(0번 왕복), 문 앞 박스에 쿠폰과 쪽지("불고기버거 세트요!")를 동시에 던지고 자리에 앉아버리는, 한국인이 가장 사랑하는 궁극의 초스피드 주문법입니다.
Ⅲ. 0-RTT의 치명적 독: 재전송 공격 (Replay Attack)
0-RTT는 너무 빠르고 쿨해서 해커에게 빈틈을 줬다. 해커 다스(Darth)가 공중에 엎드려 있다가, 앨리스가 네이버에 처음 던진 **"0-RTT 인사말 봉투(티켓 + 암호화된 '통장 100만 원 송금' 요청)"**을 그대로 통째로 캡처(복사)해 둔다. 해커는 이 봉투 안에 든 비밀번호를 풀 실력은 없다. 하지만 이 봉투 껍데기 그대로를 1초 뒤에 네이버 서버에 다시 복붙해서 던진다. 네이버 서버는? "어? 티켓 맞고 요청 맞네. 또 100만 원 송금해 줘야지!" 하고 앨리스 계좌에서 돈을 2중으로 빼가는 **재전송 공격(Replay Attack)**이 성립해 버린다!
- 실무적 타협안 (방어책):
- 0-RTT의 첫 봉투에 담아 보내는 데이터는 절대 "돈 보내!", "게시글 삭제해!" 같이 상태를 변경하는 위험한 요청(HTTP POST/PUT)을 넣으면 안 된다.
- 무조건 "첫 페이지 그림 보여줘!", "내 프로필 보여줘!" 같은, 해커가 100번 재전송해 봤자 아무런 피해가 없는 밍밍한 단순 조회 요청(HTTP GET)만 안전하게 0-RTT 봉투에 담아 보내도록 프로토콜 설계자와 브라우저가 철저히 막아두었다.
Ⅳ. 결론
"보안과 속도는 결코 제로섬 게임이 아니다. 버릴 것을 쳐낼 용기가 있다면." TLS 1.3은 과거 암호학의 쓰레기더미를 치우는 대청소였다. 속도를 갉아먹고 백도어 논란이 있던 RSA 키 교환과 구형 암호들을 과감하게 도려냈다. 그 빈자리를 1-RTT와 0-RTT라는 극한의 효율성으로 채웠고, PSK(사전 공유 키)라는 티켓 제도로 모바일 시대의 재접속 스트레스를 지워버렸다. TLS 1.3은 해커에게 1비트의 틈도 내어주지 않으면서도 인간의 체감 속도를 한계까지 끌어올린 보안 공학 아키텍처의 찬란한 진화다.
📌 관련 개념 맵
- 전체 분류: TLS (Transport Layer Security) 버전 1.3 핸드셰이크 규격
- 키 교환 핵심 엔진: ECDHE (1-RTT를 위한 1회용 타원곡선 키 묶음 전송)
- 재접속 최적화: PSK (Pre-Shared Key), 0-RTT (Early Data 전송)
- 보안 취약점 (0-RTT 한정): 재전송 공격 (Replay Attack - Idempotent한 GET 요청으로만 방어)
👶 어린이를 위한 3줄 비유 설명
- 옛날 인터넷(TLS 1.2)은 네이버에 접속할 때 "안녕!" -> "안녕!" -> "암호 이거 쓰자!" -> "그래!" 하고 인사를 4번(2왕복)이나 하느라 로딩이 느렸어요.
- 최신 인터넷(TLS 1.3)은 "안녕 나 크롬이야 내 암호 조각 여깄어!" 하고 한 번에 다 던지니까(1왕복, 1-RTT) 사이트가 번개처럼 휙! 하고 열리죠.
- 어제 접속했던 단골손님은 아예 가게 문을 열면서 인사도 없이(0왕복, 0-RTT) "국밥 한 그릇 주소!" 하고 바로 주문을 갈겨버리는 한국인 맞춤형 초스피드 인터넷 규격이랍니다!