한양과학기술고등학교

에듀테크 프로젝트 대시보드

TLS 핸드셰이크 (HTTPS)

TLS 핸드셰이크 (HTTPS 자물쇠)

브라우저 주소창의 자물쇠 아이콘은 이 사이트와 나 사이의 통신이 암호화되어 있고, 상대가 진짜 그 사이트임을 확인했다는 뜻이다. https:// 로 접속하면 실제 데이터를 주고받기 전에 TLS 핸드셰이크라는 짧은 대화가 먼저 오간다. 이 과정에서 ① 서버 신원을 인증서로 검증하고 ② 둘만 아는 세션 키를 안전하게 만든다. 아래에서 한 메시지씩 따라가 보자.

핸드셰이크 단계별 시뮬레이터 (TLS 1.2 기준)

클라이언트내 브라우저
서버offset0xf.com
세션 성립 — 이제부터 대칭키로 빠르게 암호화 통신

왜 두 종류의 암호를 섞어 쓸까?

비대칭키 (공개키)

공개키로 잠그고 개인키로만 연다. 키를 미리 나눠 갖지 않아도 되지만 수학 연산이 무거워 느리다. 핸드셰이크에서 딱 한 번, 세션 키를 안전하게 합의하는 데만 쓴다. RSA, ECDHE

대칭키 (세션 키)

잠그는 키 = 여는 키. 매우 빠르지만 그 키를 상대에게 안전하게 전달하는 게 문제. 핸드셰이크로 키를 합의한 뒤, 실제 HTTP 데이터 전부를 이 키로 암호화한다. AES-256-GCM

즉 느리지만 안전한 비대칭키로 "빠른 대칭키"를 배달하고, 이후 통신은 대칭키로 처리한다. 두 방식의 장점만 취하는 하이브리드 암호다.

인증서 검증 — "진짜 그 서버가 맞나?"

  • 서버 인증서에는 도메인 이름, 서버의 공개키, 유효기간, 그리고 이 내용에 대한 CA(인증기관)의 디지털 서명이 담겨 있다.
  • 브라우저는 운영체제/브라우저에 미리 심어진 신뢰 루트 CA 목록으로 서명을 검증한다. 루트 CA → 중간 CA → 서버 로 이어지는 인증서 체인을 한 단계씩 확인한다.
  • 검증 항목: 서명이 유효한가 · 도메인이 주소창과 일치하는가 · 기간이 안 지났는가 · 폐기(revoke)되지 않았는가.
  • 하나라도 실패하면 브라우저는 NET::ERR_CERT_* 경고 화면을 띄운다. 이 사이트 인증서는 Let's Encrypt가 발급한 무료 인증서다.
# 서버가 실제로 보내는 인증서 들여다보기
openssl s_client -connect offset0xf.com:443 -servername offset0xf.com

# 요약 정보만
echo | openssl s_client -connect offset0xf.com:443 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates

알아두면 좋은 것

  • TLS 1.3(2018~)은 왕복 횟수를 줄여 핸드셰이크가 1-RTT로 끝난다. 옛 이름 SSL은 취약점 때문에 폐기됐고, 지금은 전부 TLS다.
  • 순방향 비밀성(Forward Secrecy): ECDHE 방식은 매 접속마다 임시 키를 새로 만들어, 나중에 서버 개인키가 유출돼도 과거에 녹음된 트래픽은 못 푼다.
  • SNI: 한 IP에 여러 사이트가 있을 때, 클라이언트가 ClientHello에 "어느 도메인에 접속하려는지"를 알려줘야 서버가 맞는 인증서를 고른다.
  • 핸드셰이크가 끝나면 Finished 메시지로 지금까지 주고받은 모든 메시지가 위변조되지 않았는지 서로 확인한다(중간자 공격 방지).
구분HTTPHTTPS (TLS)
도청평문 그대로 노출암호문만 보임
위변조중간에서 조작 가능무결성 검증
신원알 수 없음인증서로 확인
포트80443