Skip to content
난이도 면접 빈출문제은행 3

HTTPS와 TLS 2 ​

HTTPS와 TLS에서 본 대칭 키(symmetric key), 공개 키(public key), 인증서(certificate)가 실제 연결에서 어떻게 맞물리는지 이어서 다룬다. HTTPS(HTTP Secure, 보안 HTTP)는 연결을 열 때 TLS(Transport Layer Security, 전송 계층 보안) 핸드셰이크(handshake)로 대칭 키를 합의하고 서버를 인증한다. 현재 규격인 TLS 1.3의 순서를 보고, TLS 1.2와 무엇이 달라졌는지, TLS의 전신은 무엇이었는지까지 정리한다.

TLS 1.3 핸드셰이크 ​

TLS 연결은 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 연결을 맺은 뒤 핸드셰이크로 시작한다. 이 과정에서 버전과 암호 방식을 고르고, 대칭 키를 만들고, 서버를 인증한다. 현재 규격인 TLS 1.3의 흐름은 다음과 같다. TLS 1.3은 RFC(Request for Comments, 인터넷 표준 문서) 8446번에 정의돼 있다.

다이어그램 로딩…
  1. ClientHello: 클라이언트가 지원하는 TLS 버전과 암호 방식 목록, 그리고 키 공유(key share) 값을 보낸다. 키 공유 값은 이번 연결에만 쓰려고 임시로 만든 공개 값이다.
  2. ServerHello: 서버가 암호 방식을 고르고 자기 키 공유 값을 보낸다. 이제 양쪽은 상대의 공개 값과 자기 비밀 값을 조합해 같은 비밀을 계산하고, 여기서 대칭 키를 뽑는다. 이 방식을 디피-헬먼 키 교환(Diffie-Hellman key exchange)이라고 부른다. 대칭 키 자체는 네트워크로 한 번도 오가지 않는다.
  3. 인증서와 서명: 서버는 인증서를 보내고, 지금까지 주고받은 핸드셰이크 내용에 자기 개인 키(private key)로 서명해 보낸다. 클라이언트는 인증서 체인(certificate chain)을 검증하고, 인증서 속 공개 키로 이 서명을 확인해 서버가 개인 키의 주인임을 확인한다.
  4. Finished: 양쪽이 핸드셰이크 전체가 변조되지 않았음을 확인하는 값을 주고받고, 이후 HTTP 메시지를 대칭 키로 암호화해 보낸다.

클라이언트는 첫 왕복 한 번 만에 요청을 보낼 수 있다. 이를 RTT(Round-Trip Time, 왕복 시간) 기준으로 1-RTT 핸드셰이크라고 한다. 예전에 접속했던 서버라면 미리 받아 둔 정보로 첫 메시지에 데이터를 실어 보내는 0-RTT도 있지만, 공격자가 그 메시지를 다시 보내는 재생 공격(replay attack)에 약하다. 그래서 같은 요청이 두 번 도착해도 결과가 같은 멱등성(idempotency) 있는 요청에만 써야 한다.

TLS 1.2와의 차이 ​

TLS 1.2의 기본 핸드셰이크는 요청을 보내기까지 두 번 왕복했다. 또 클라이언트가 만든 비밀을 서버 인증서의 RSA(Rivest–Shamir–Adleman) 공개 키로 암호화해 보내는 RSA 키 교환을 허용했다. 이 방식은 나중에 서버 개인 키가 유출되면 과거에 녹화해 둔 통신까지 풀린다는 약점이 있다. TLS 1.3은 RSA 키 교환을 없애고, 공개 키 기술로 키를 교환할 때는 매 연결 임시 키를 쓰는 디피-헬먼 방식만 쓰게 했다. 그래서 서버 개인 키가 유출돼도 지난 통신은 안전하다. 이 성질을 순방향 비밀성(forward secrecy)이라 한다. 단 예전 연결에서 받아 둔 키만으로 새 디피-헬먼 교환 없이 연결을 재개하는 경우와 0-RTT 데이터는, 그 저장된 키가 새면 함께 풀리므로 순방향 비밀성이 없다. 인증서도 암호화된 상태로 보내고, 오래되고 약한 암호 방식을 목록에서 뺐다.

SSL이라는 이름과 443번 포트 ​

SSL(Secure Sockets Layer, 보안 소켓 계층)은 TLS의 전신이다. SSL 3.0 다음 버전이 이름을 바꿔 TLS 1.0이 됐고, SSL은 보안 결함 때문에 모두 폐기됐다. TLS 1.0과 1.1도 RFC 8996으로 폐기돼 지금은 TLS 1.2와 1.3을 쓴다. 그런데도 "SSL 인증서"처럼 옛 이름이 관용적으로 남아 있다.

HTTPS의 기본 포트(port)는 443이다. 암호화하지 않은 평문(plaintext) HTTP의 80과 구분되므로, 주소에 포트를 적지 않아도 https://로 시작하면 브라우저는 443으로 접속한다.

면접 포인트 ​

  • "TLS 1.3 핸드셰이크 과정은?" → ClientHello·ServerHello로 키 공유 값 교환 → 양쪽이 대칭 키를 각자 계산 → 인증서·서명 검증 → Finished. 1-RTT.
  • "TLS 1.3이 1.2보다 나은 점은?" → 1-RTT, RSA 키 교환 제거로 순방향 비밀성, 인증서 암호화.
  • 흔한 오답: "TLS 1.3에서도 클라이언트가 대칭 키를 서버 공개 키로 암호화해 보낸다" → 그건 TLS 1.2의 RSA 키 교환이다.

관련 문서