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은 어떤 마법을 부리는지 아주 깊게 파고들어 보겠습니다.

디지털 네트워크의 SSL/TLS

1. HTTP는 왜 위험한가? (Wireshark로 본 세상)

HTTP는 기본적으로 평문(Plain Text) 통신입니다. 여러분이 카페 공용 와이파이에서 HTTP로 된 쇼핑몰에 로그인한다고 가정해 봅시다. 해커가 같은 와이파이 망에서 Wireshark 같은 패킷 스니핑 툴을 켜면 어떻게 될까요?

POST /login HTTP/1.1 Host: insecure-shop.com Content-Type: application/x-www-form-urlencoded id=myuser&password=I_love_cat_1234

보시는 것처럼 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 교환 (핵심)

이 단계가 가장 중요합니다.

  1. 브라우저는 내장된 CA(Root Certificate Authority) 리스트를 통해 서버가 보낸 인증서가 진짜인지 검증합니다.
  2. 검증이 끝나면, 브라우저는 Pre-Master Secret이라는 임시 비밀 키를 생성합니다.
  3. 이 비밀 키를 서버의 공개키로 암호화해서 서버에게 보냅니다. (이제 이 키는 오직 서버의 개인키를 가진 서버만 풀 수 있습니다. 해커는 못 풉니다.)

Step 4. Session Key 생성 & 통신 시작

서버는 암호화된 Pre-Master Secret을 자신의 개인키로 복호화합니다. 이제 클라이언트와 서버는 모두 다음 3가지를 똑같이 가지고 있습니다.

Client Random + Server Random + Pre-Master Secret
⬇️
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까지 거슬러 올라갑니다. 만약 사슬 중 하나라도 끊어지거나 신뢰할 수 없다면, 브라우저는 그 무서운 "연결이 비공개로 설정되어 있지 않습니다"라는 빨간 경고창을 띄웁니다.

이 블로그의 인기 게시물

Docker 컨테이너 'Connection Refused' (Errno 111) 오류 해결 가이드

Redis 캐싱 전략 완벽 가이드: Look Aside부터 Write Back까지 (DB 부하 줄이기)

브라우저 렌더링 원리: Reflow와 Repaint 최적화 가이드 (CRP 심층 분석)