TLS 핸드셰이크란 무엇일까요?
TLS는 안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜입니다. TLS 핸드셰이크는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스입니다. TLS 핸드셰이크 중에, 통신하는 양측에서는 메시지를 교환하여 서로를 인식하고 서로를 검증하며 사용할 암호화 알고리즘을 구성하고 세션 키에 합의합니다. TLS 핸드셰이크는 HTTPS 작동 원리의 근간을 이룹니다.
TLS 핸드셰이크와 SSL 핸드셰이크
보안 소켓 계층(SSL)은 원래 HTTP용으로 개발된 암호화 프로토콜이었습니다. SSL은 오래 전에 전송 계층 보안(TLS)으로 대체되었습니다. SSL 핸드셰이크는 "SSL"이라는 이름이 아직도 널리 사용되지만, 이제는 TLS 핸드셰이크로 불립니다.
가이드
앱 액세스 보호를 위한 Zero Trust 가이드
TLS 핸드셰이크는 언제 발생할까요?
TLS 핸드셰이크는 사용자가 HTTPS를 통해 웹 사이트를 탐색하고 브라우저가 처음 해당 웹 사이트의 원본 서버를 쿼리하기 시작할 때마다 발생합니다. 다른 통신이 API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 매번 TLS 핸드셰이크가 발생합니다.
TLS 핸드셰이크는 TCP 연결이 TCP 핸드셰이크를 통해 열린 후에 발생합니다.
보안 SSL
모든 Cloudflare 요금제에 포함된 무료 SSL
TLS 핸드셰이크 중에는 어떤 일이 발생할까요?
TLS 핸드셰이크 과정 중에는 클라이언트와 서버가 함께 다음을 수행합니다.
- 사용할 TLS 버전(TLS 1.0, 1.2, 1.3 등)을 지정합니다
- 사용할 암호 제품군(아래 참조)을 결정합니다
- 서버의 공개 키와 SSL 인증서 기관의 디지털 서명을 통해 서버의 ID를 인증합니다
- 핸드셰이크가 완료된 후에 대칭 암호화를 사용하기 위하여 세션 키를 생성합니다
TLS 핸드셰이크가 이루어지는 단계는 어떻게 될까요?
TLS 핸드셰이크는 클라이언트와 서버가 교환하는 일련의 데이터그램, 즉 메시지입니다. TLS 핸드셰이크는 여러 단계로 이루어집니다. 그 과정에서 클라이언트와 서버는 핸드셰이크를 완료하고 추가 대화를 가능하게 하는 데 필요한 정보를 교환합니다.
TLS 핸드셰이크의 정확한 단계는 사용되는 키 교환 알고리즘의 종류와 양측에서 지원하는 암호 모음에 따라 달라집니다. RSA 키 교환 알고리즘은 지금은 안전하지 않은 것으로 간주되지만, 1.3 이전 버전의 TLS에서 사용되었습니다. 이 알고리즘은 대략 다음과 같이 진행됩니다.
- '클라이언트 헬로' 메시지: 클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 개시합니다. 이 메시지에는 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함됩니다.
- '서버 헬로' 메시지: 클라이언트 헬로 메시지에 대한 응답으로 서버가 서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송합니다.
- 인증: 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증합니다. 이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인합니다.
- 예비 마스터 암호: 클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송합니다. 예비 마스터 암호는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있습니다. (클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받습니다.)
- 개인 키 사용: 서버가 예비 마스터 암호를 해독합니다.
- 세션 키 생성: 클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성합니다. 모두 같은 결과가 나와야 합니다.
- 클라이언트 준비 완료: 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
- 서버 준비 완료: 서버가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
- 안전한 대칭 암호화 성공: 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행됩니다.
모든 TLS 핸드셰이크가 비대칭 암호화(공개 키와 개인 키)를 사용하지만, 세션 키를 생성하는 과정에서 모두가 개인 키를 사용하는 것은 아닙니다. 예를 들어, 임시 Diffie-Hellman 핸드셰이크는 다음과 같이 진행됩니다.
- 클라이언트 헬로: 클라이언트가 프로토콜 버전, 클라이언트 무작위, 암호 제품군 목록을 포함하는 클라이언트 헬로 메시지를 전송합니다.
- 서버 헬로: 서버가 SSL 인증서, 선택한 암호 제품군, 서버 무작위를 포함하는 응답을 전송합니다. 위에 설명한 RSA 핸드셰이크와 달리, 서버는 이 메시지에 다음 내용도 포함합니다(단계 3).
- 서버의 디지털 서명: 서버에서는 이 시점까지의 모든 메시지에 대한 디지털 서명을 계산합니다.
- 디지털 서명 확인: 클라이언트는 서버의 디지털 서명을 확인하여 서버가 자칭하는 사람이 맞는지 확인합니다.
- 클라이언트 DH 매개변수: 클라이언트가 DH 매개변수를 서버로 전송합니다.
- 클라이언트와 서버가 예비 마스터 암호를 계산: RSA 핸드셰이크의 경우에서처럼 클라이언트가 예비 마스터 암호를 생성하여 서버로 전송하는 대신, 클라이언트와 서버가 서로 교환한 DH 매개변수를 사용하여 일치하는 예비 마스터 암호를 별도로 계산합니다.
- 세션 키 생성: 이제 클라이언트와 서버가 RSA 핸드셰이크에서와 마찬가지로 예비 마스터 암호, 클라이언트 무작위, 서버 무작위를 사용하여 세션 키를 계산합니다.
- 클라이언트 준비 완료: RSA 핸드셰이크와 동일합니다.
- 서버 준비 완료
- 안전한 대칭 암호화 성공
*DH 매개변수: DH는 Diffie-Hellman을 의미합니다. Diffie-Hellman 알고리즘은 지수 계산을 이용해 동일한 예비 마스터 암호를 생성합니다. 서버와 클라이언트가 각자 계산을 위한 매개변수를 제공하고, 각자 서로 다른 계산 결과가 나오지만, 합치면 결과가 동일해집니다.
임시 Diffie-Hellman 핸드셰이크와 다른 유형의 핸드셰이크 간 차이, 그리고 이들 핸드셰이크가 FS(Forward Secrecy, 순방향 비밀성)에 도달하는 방식에 대한 자세한 내용은 Keyless SSL이란 무엇일까요?를 참고하세요.
TLS 1.3의 핸드셰이크는 어떤 점이 다를까요?
TLS 1.3은 RSA나 공격에 취약한 기타 암호 제품군 및 매개변수를 지원하지 않습니다. 또한 TLS 핸드셰이크가 단축되어 TLS 1.3 핸드셰이크가 더 빠르고 안전해집니다.
TLS 1.3 핸드셰이크의 기본 단계는 다음과 같습니다.
- 클라이언트 헬로(client hello): 클라이언트는 프로토콜 버전, 클라이언트 무작위, 암호 모음 목록이 포함된 클라이언트 헬로 메시지를 보냅니다.안전하지 않은 암호 모음에 대한 지원이 TLS 1.3에서 제거되었으므로 사용 가능한 암호 모음의 수가 크게 줄었습니다.클라이언트 헬로에는 예비 마스터 암호를 계산하는 데 사용되는 매개변수도 포함되어 있습니다.기본적으로 클라이언트는 서버가 선호하는 키 교환 방법을 알고 있다고 가정합니다(단순화된 암호 제품군 목록으로 인해 아마도 알고 있을 것입니다).이렇게 하면 핸드셰이크의 전체 길이가 줄어드는데, 이는 TLS 1.3 핸드셰이크와 TLS 1.0, 1.1, 1.2 핸드셰이크의 중요한 차이점 중 하나입니다.
- 서버가 마스터 암호를 생성: 이 시점에서 서버는 클라이언트 무작위, 클라이언트의 매개변수, 암호 그룹을 받았습니다.서버는 이미 서버 무작위를 자체적으로 생성할 수 있으므로 이미 서버 무작위를 보유하고 있습니다.따라서 서버는 마스터 암호를 생성할 수 있습니다.
- 서버 헬로(server hello) 및 "완료됨": 서버 헬로에는 서버의 인증서, 디지털 서명, 서버 무작위, 선택한 암호 그룹이 포함됩니다.서버는 이미 마스터 암호를 가지고 있으므로 "완료됨" 메시지도 전송합니다.
- 마지막 단계 및 클라이언트 "완료됨": 클라이언트가 서명 및 인증서를 확인하고 마스터 암호를 생성한 후 "완료됨" 메시지를 전송합니다.
- 안전한 대칭 암호화 성공
세션 재개를 위한 0-RTT 모드
또한 TLS 1.3은 클라이언트와 서버 간의 왕복 또는 주고받는 통신이 전혀 필요 없는 더욱 빠른 버전의 TLS 핸드셰이크를 지원합니다. 클라이언트와 서버가 이전에 서로 연결된 적이 있는 경우(예: 사용자가 이전에 웹 사이트를 방문한 적이 있는 경우) 첫 번째 세션에서 "재개 주 암호"라고 하는 또 다른 공유 암호를 각각 도출할 수 있습니다. 또한 서버에서는 이 첫 번째 세션 중에 세션 티켓이라고 불리는 것을 클라이언트에게 보냅니다. 클라이언트는 이 공유 암호를 사용하여 다음 세션의 첫 번째 메시지에서 해당 세션 티켓과 함께 암호화된 데이터를 서버로 전송할 수 있습니다. 그리고 클라이언트와 서버 간에 TLS가 재개됩니다.
암호 제품군이란 무엇일까요?
암호 제품군은 안전한 통신 연결을 수립하는 데 사용하는 알고리즘 세트입니다. 현재 널리 사용되는 여러 암호 제품군이 있으며, TLS 핸드셰이크에서는 핸드셰이크에 어떤 암호 제품군을 사용할지 합의하는 것이 반드시 필요합니다.
TLS/SSL에 대한 자세한 알아보려면 SSL의 작동 원리는?을 참고하세요.