TLS 핸드셰이크의 원리는 무엇일까요?  | SSL 핸드셰이크

TLS/SSL 핸드셰이크에서는 클라이언트�� 서버가 SSL 인증서, 암호 제품군 요구 사항, 무작위로 생성된 데이터를 교환하여 세션 키를 생성합니다.

학습 목표

이 글을 읽은 후에 다음을 할 수 있습니다:

  • TLS 핸드셰이크가 무엇인지 이해합니다
  • TLS 핸드셰이크가 무엇을 수행하는지 이해합니다
  • TLS 핸드셰이크의 단계 설명합니다
  • 다양한 TLS 핸드셰이크 유형 간 차이 이해합니다

글 링크 복사

TLS 핸드셰이크란 무엇일까요?

TLS는 안전한 인터넷 통신을 위한 암호화 프로토콜입니다. 그리고 TLS 핸드셰이크는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스입니다. 통신 양측은 TLS 핸드셰이크 중에 메시지를 교환하여 서로를 인식하고, 서로를 검증하며, 사용할 암호화 알고리즘을 구성하고, 세션 키를 합의합니다. TLS 핸드셰이크는 HTTPS 작동 원리의 근간을 이룹니다.

TLS 핸드셰이크와 SSL 핸드셰이크

SSL(Secure Sockets Layer)은 원래 HTTP용으로 개발된 암호화 프로토콜이었습니다. 그리고 SSL은 오래 전에 TLS(Transport Layer Security)로 대체되었습니다. SSL 핸드셰이크는 "SSL"이라는 이름이 아직 널리 사용되고 있지만, 이제는 TLS 핸드셰이크로 불립니다.

TLS 핸드셰이크는 언제 발생할까요?

TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 쿼리하기 시작할 때마다 발생합니다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 항상 TLS 핸드셰이크가 발생합니다.

TLS 핸드셰이크는 TCP 연결이 TCP 핸드셰이크를 통해 열린 후에 발생합니다.

TLS 핸드셰이크 중에는 어떤 일이 발생할까요?

TLS 핸드셰이크 과정 중에는 클라이언트와 서버가 함께 다음을 수행합니다.

  • 사용할 TLS 버전(TLS 1.0, 1.2, 1.3 등)을 지정합니다
  • 사용할 암호 제품군(아래 참조)을 결정합니다
  • 서버의 공개 키와 SSL 인증서 기관의 디지털 서명을 통해 서버의 ID를 인증합니다
  • 핸드셰이크가 완료된 후에 대칭 암호화를 사용하기 위하여 세션 키를 생성합니다

TLS 핸드셰이크가 이루어지는 단계는 어떻게 될까요?

TLS 핸드셰이크는 클라이언트와 서버가 교환하는 일련의 ���이터그램, 즉 메시지입니다. TLS 핸드셰이크는 여러 단계로 이루어집니다. 그 과정에서 클라이언트와 서버는 핸드셰이크를 완료하고 추가 대화를 가능하게 하는 데 필요한 정보를 교환합니다.

TLS 핸드셰이크의 정확한 단계는 사용되는 키 교환 알고리즘의 유형과 커뮤니케이션 양측에서 모두 지원하는 암호 제품군의 유형에 따라 달라집니다. 대부분 RSA 키 교환 알고리즘이 사용됩니다. 그 원리는 다음과 같습니다.

  1. '클라이언트 헬로' 메시지: 클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 개시합니다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함됩니다.
  2. '서버 헬로' 메시지: 클라이언트 헬로 메시지에 대한 응답으로 서버가 서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송합니다.
  3. 인증: 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증합니다. 이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인합니다.
  4. 예비 마스터 암호: 클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송합니다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있습니다. (클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받습니다.)
  5. 개인 키 사용: 서버가 예비 마스터 암호를 해독합니다.
  6. 세션 키 생성: 클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성합니다. 모두 같은 결과가 나와야 합니다.
  7. 클라이언트 준비 완료: 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
  8. 서버 준비 완료: 서버가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
  9. 안전한 대칭 암호화 성공: 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행됩니다.

모든 TLS 핸드셰이크가 비대칭 암호화(공개 키와 개인 키)를 사용하지만, 세션 키를 생성하는 과정에서 모두가 개인 키를 사용하는 것은 아닙니다. 예를 들어, 임시 Diffie-Hellman 핸드셰이크는 다음과 같이 진행됩니다.

  1. 클라이언트 헬로: 클라이언트가 프로토콜 버전, 클라이언트 무작위, 암호 제품군 목록을 포함하는 클라이언트 헬로 메시지를 전송합니다.
  2. 서버 헬로: 서버가 SSL 인증서, 선택한 암호 제품군, 서버 무작위를 포함하는 응답을 전송합니다. 위에 설명한 RSA 핸드셰이크와 달리, 서버는 이 메시지에 다음 내용도 포함합니다(단계 3).
  3. 서버의 디지털 서명: 서버가 개인 키를 사용하여 클라이언트 무작위, 서버 무작위, 서버의 DH 매개변수를 암호화합니다*. 이 암호화된 데이터가 서버의 디지털 서명 역할을 하면서 서버가 SSL 인증서의 공개 키와 일치하는 개인 키를 보유하고 있다는 것을 증명합니다.
  4. 디지털 서명 확인: 클라이언트가 공개 키를 사용하여 서버의 디지털 서명을 해독하고, 서버가 해당 개인 키를 관리하고 있으며 인증서에 명시된 서버가 맞다는 것을 검증합니다. 클라이언트 DH 매개변수: 클라이언트가 DH 매개변수를 서버로 전송합니다.
  5. 클라이언트와 서버가 예비 마스터 암호를 계산: RSA 핸드셰이크의 경우에서처럼 클라이언트가 예비 마스터 암호를 생성하여 서버로 전송하는 대신, 클라이언트와 서버가 서로 교환한 DH 매개변수를 사용하여 일치하는 예비 마스터 암호를 별도로 계산합니다.
  6. 세션 키 생성: 이제 클라이언트와 서버가 RSA 핸드셰이크에서와 마찬가지로 예비 마스터 암호, 클라이언트 무작위, 서버 무작위를 사용하여 세션 키를 계산합니다.
  7. 클라이언트 준비 완료: RSA 핸드셰이크와 동일합니다.
  8. 서버 준비 완료
  9. 안전한 대칭 암호화 성공

*DH 매개변수: DH는 Diffie-Hellman을 의미합니다. Diffie-Hellman 알고리즘은 지수 계산을 이용해 동일한 예비 마스터 암호를 생성합니다. 서버와 클라이언트가 각자 계산을 위한 매개변수를 제공하고, 각자 서로 다른 계산 결과가 나오지만, 합치면 결과가 동일해집니다.

임시 Diffie-Hellman 핸드셰이크와 다른 유형의 핸드셰이크 간 차이, 그리고 이들 핸드셰이크가 FS(Forward Secrecy, 순방향 비밀성)에 도달하는 방식에 대한 자세한 내용은 Keyless SSL이란 무엇일까요?를 참고하세요.

암호 제품군이란 무엇일까요?

암호 제품군은 안전한 통신 연결을 수립하는 데 사용하는 암호화 알고리즘 세트입니다. (암호화 알고리즘은 데이터에 대해 수행하여 데이터를 무작위로 표시하는 수학 연산 세트입니다.) 현재 널리 사용되는 여러 암호 제품군이 있으며, TLS 핸드셰이크에서는 핸드셰이크에 어떤 암호 제품군을 사용할지 합의하는 것이 반드시 필요합니다.

TLS/SSL에 대한 자세한 내용은 SSL의 작동 원리는 무엇일까요?를 참고하세요. 웹 사이트가 TLS를 올바로 사용 중인지 테스트하려면 Cloudflare 진단 센터를 방문하세요.