HTTPS의 모든 것
📌 이 글에서 다루는 깊이 있는 내용
- HTTP가 위험한 이유: Wireshark 패킷 캡처로 보는 평문 전송의 위험성
- 대칭키 & 비대칭키의 하이브리드 전략: 왜 두 가지를 섞어서 쓰는가?
- SSL/TLS Handshake 심층 분석:
Client Hello부터Finished까지 4단계 해부 - TLS 1.2 vs 1.3: 핸드쉐이크 횟수(RTT) 단축을 통한 성능 최적화
- Chain of Trust: 루트 CA부터 내 브라우저까지의 신뢰 검증 과정
신입 개발자 면접에서 "주소창에 google.com을 치면 일어나는 일" 다음으로 많이 나오는 질문이 바로 "HTTPS의 동작 원리"입니다. 단순히 "보안이 강화된 HTTP입니다"라고 답한다면 좋은 점수를 받기 어렵습니다.
이 글에서는 HTTPS가 어떻게 데이터를 암호화하는지, 그리고 그 과정에서 발생하는 성능 저하를 막기 위해 최신 TLS 1.3은 어떤 마법을 부리는지 아주 깊게 파고들어 보겠습니다.
1. HTTP는 왜 위험한가? (Wireshark로 본 세상)
HTTP는 기본적으로 평문(Plain Text) 통신입니다. 여러분이 카페 공용 와이파이에서 HTTP로 된 쇼핑몰에 로그인한다고 가정해 봅시다. 해커가 같은 와이파이 망에서 Wireshark 같은 패킷 스니핑 툴을 켜면 어떻게 될까요?
보시는 것처럼 ID와 비밀번호가 아무런 보호 장치 없이 그대로 노출됩니다. 이를 막기 위해 데이터를 알아볼 수 없게 암호화(Encryption)하는 계층인 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security)를 HTTP 위에 얹은 것이 바로 HTTPS입니다.
2. 암호화 전략: 속도와 보안의 줄타기
암호화 방식에는 크게 두 가지가 있습니다. HTTPS는 이 둘의 장점만을 취하는 하이브리드 방식을 사용합니다.
① 대칭키 (Symmetric Key)
- 원리: 암호화할 때 쓰는 키와 복호화할 때 쓰는 키가 같습니다. (예: AES 알고리즘)
- 장점: 연산 속도가 매우 빠릅니다. 대용량 데이터를 전송하기 적합합니다.
- 단점: "키 배송 문제"가 발생합니다. 이 키를 상대방에게 어떻게 안전하게 전달할까요? 키를 보내는 과정에서 해커가 가로채면 끝입니다.
② 비대칭키 (Asymmetric Key / 공개키)
- 원리: 공개키(Public Key)로 잠그고, 개인키(Private Key)로만 열 수 있습니다. (예: RSA 알고리즘)
- 장점: 키 배송 문제가 해결됩니다. 공개키는 만천하에 공개해도 상관없습니다.
- 단점: 대칭키 방식보다 연산이 훨씬 복잡하고 느립니다. 모든 통신을 이걸로 하면 서버 CPU가 터집니다.
💡 HTTPS의 결론 (하이브리드 암호화)
"처음 만날 때(Handshake)만 비대칭키를 써서 서로의 '대칭키(세션 키)'를 안전하게 교환하고,
그 이후 실제 데이터 전송은 빠른 대칭키를 사용하자!"
3. SSL/TLS Handshake 심층 분석 (4-Way)
브라우저(Client)와 서버(Server)가 보안 통신을 시작하기 위해 서로를 확인하고 키를 교환하는 과정을 핸드쉐이크라고 합니다. TCP 3-Way Handshake가 끝난 직후에 일어납니다.
Step 1. Client Hello (탐색)
클라이언트가 서버에게 접속을 요청하며 다음 정보를 보냅니다.
- Cipher Suite: "난 RSA랑 AES 암호화 방식을 지원해." (지원 가능한 암호화 리스트)
- Client Random: 나중에 대칭키를 만들 때 쓸 난수 문자열 ①
- Session ID: 이미 연결된 적이 있다면 재사용하기 위함.
Step 2. Server Hello (응답 & 인증서 전달)
서버는 클라이언트의 제안 중 가장 강력한 암호화 방식을 선택하고 답장을 보냅니다.
- Selected Cipher Suite: "그래, 우리 TLS 1.2에 RSA 방식으로 하자."
- Server Random: 나중에 대칭키를 만들 때 쓸 난수 문자열 ②
- Certificate: 서버의 공개키(Public Key)가 포함된 SSL 인증서.
Step 3. 인증서 검증 & Pre-Master Secret 교환 (핵심)
이 단계가 가장 중요합니다.
- 브라우저는 내장된 CA(Root Certificate Authority) 리스트를 통해 서버가 보낸 인증서가 진짜인지 검증합니다.
- 검증이 끝나면, 브라우저는 Pre-Master Secret이라는 임시 비밀 키를 생성합니다.
- 이 비밀 키를 서버의 공개키로 암호화해서 서버에게 보냅니다. (이제 이 키는 오직 서버의 개인키를 가진 서버만 풀 수 있습니다. 해커는 못 풉니다.)
Step 4. Session Key 생성 & 통신 시작
서버는 암호화된 Pre-Master Secret을 자신의 개인키로 복호화합니다. 이제 클라이언트와 서버는 모두 다음 3가지를 똑같이 가지고 있습니다.
⬇️
Session Key (대칭키) 완성!
이후부터는 이 Session Key를 이용해 데이터를 AES 등으로 빠르게 암호화하여 주고받습니다.
4. TLS 1.2 vs TLS 1.3: 속도 혁명
위에서 설명한 과정(TLS 1.2)은 안전하지만, 데이터를 보내기 전까지 2번의 왕복(2-RTT: Round Trip Time)이 필요합니다. 서울-뉴욕 간 통신이라면 핸드쉐이크에만 수백 밀리초가 소요됩니다.
최신 TLS 1.3은 이를 획기적으로 개선했습니다.
| 구분 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 핸드쉐이크 RTT | 2 RTT (느림) | 1 RTT (빠름) |
| 키 교환 방식 | RSA (느림) | Diffie-Hellman (빠름, 기본값) |
| 보안 강도 | 취약한 암호화 알고리즘 지원 | 취약한 알고리즘(SHA-1 등) 전면 삭제 |
TLS 1.3은 Client Hello 단계에서 "서버가 뭘 쓸지 예상해서" 키 교환 정보를 미리 보내버립니다. 덕분에 한 번의 왕복만으로 통신 준비가 끝납니다. 심지어 0-RTT(이전에 접속했던 사이트라면 핸드쉐이크 없이 바로 데이터 전송)까지 지원합니다.
5. Chain of Trust (신뢰의 사슬)
마지막으로, 브라우저는 어떻게 네이버의 인증서가 진짜인지 알 수 있을까요?
- Root CA: 최상위 인증 기관(VeriSign, DigiCert 등). 이들의 공개키는 OS나 브라우저 설치 시 이미 내장되어 있습니다.
- Intermediate CA: Root CA가 "얘는 믿을만해"라고 서명해 준 중간 관리자.
- Leaf Certificate: 우리가 발급받은 도메인 인증서.
브라우저는 인증서를 받으면 상위 기관의 서명을 확인하며 Root CA까지 거슬러 올라갑니다. 만약 사슬 중 하나라도 끊어지거나 신뢰할 수 없다면, 브라우저는 그 무서운 "연결이 비공개로 설정되어 있지 않습니다"라는 빨간 경고창을 띄웁니다.