TLS는 안전한 인터넷 통신을 위한 암호화 및 인증 프로토콜입니다.
주요 사용 사례는 클라이언트와 서버 간의 통신을 암호화하여 보호하는 것이지만, 보호되지 않은 네트워크를 통한 이메일, VoIP, 기타 통신을 보호하는 곳에도 사용 가능합니다.
TLS 핸드셰이크는 TLS 암호화를 사용하는 통신 세션을 실행하는 프로세스입니다.
TLS 핸드셰이크 중에 양측에서는 메시지를 교환하고 서로를 검증하며 사용할 암호화 알고리즘을 구성하고 세션 키에 합의합니다.
TLS 핸드셰이크는 HTTPS 작동 원리의 근간을 이룹니다.
TLS Handshake는 위 사진과 같이 일반적으로 알고 있는 TCP 3-way-handshake가 성립된 이후에 진행이 됩니다.
TLS Handshake는 HTTPS를 통해 브라우저가 처음 요청 서버를 쿼리할 때 발생하며 이후에는 생성된 세션을 활용하므로 추가적인 Handshake를 진행하지 않습니다.
API 호출 및 HTTPS를 통한 DNS 쿼리를 포함하는 HTTPS를 사용할 때에도 TLS 핸드셰이크가 발생합니다.
'클라이언트 헬로' 메시지
클라이언트가 서버로 "헬로" 메시지를 전송하면서 핸드셰이크를 개시합니다.
이 과정에서 클라이언트가 지원하는 TLS 버전, 지원되는 암호 제품군, 그리고 "클라이언트 무작위"라고 하는 무작위 바이트 문자열이 포함됩니다.
'서버 헬로' 메시지
클라이언트 헬로 메시지에 대한 응답으로 서버가
서버의 SSL 인증서, 서버에서 선택한 암호 제품군, 그리고 서버에서 생성한 또 다른 무작위 바이트 문자열인 "서버 무작위"를 포함하는 메시지를 전송합니다.
인증
클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증합니다.
이를 통해 서버가 인증서에 명시된 서버인지, 그리고 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인합니다.
예비 마스터 암호
클라이언트가 "예비 마스터 암호"라고 하는 무작위 바이트 문자열을 하나 더 전송합니다.
예비 마스터 암호는 SSL 인증서를 통해 전달 받은 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있습니다.
개인 키 사용
서버가 예비 마스터 암호를 해독합니다.
세션 키 생성
클라이언트와 서버가 모두 클라이언트 무작위, 서버 무작위, 예비 마스터 암호를 이용해 세션 키를 생성합니다.
모두 같은 결과가 나와야 합니다.
클라이언트 준비 완료
클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
서버 준비 완료
서버가 세션 키로 암호화된 "완료" 메시지를 전송합니다.
안전한 대칭 암호화 성공
핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행됩니다.
세션 키를 생성하는 과정에서 개인키를 사용하는 알고리즘 외에도 Diffie-Hellman 알고리즘을 통해서도 세션키 생성이 가능합니다.
TLS 1.3은 RSA나 공격에 취약한 기타 알고리즘을 지원하지 않습니다.
핸드셰이크 과정이 단축되어 더 빠르고 안전해집니다.
클라이언트 헬로
클라이언트는 프로토콜 버전, 클라이언트 무작위, 암호 모음 목록이 포함된 클라이언트 헬로 메시지를 보냅니다.
클라이언트 헬로에는 예비 마스터 암호를 계산하는 데 사용되는 매개변수도 포함되어 있습니다.
이렇게 하면 핸드셰이크의 전체 길이가 줄어드는데, 이는 TLS 1.3 핸드셰이크와 TLS 1.0, 1.1, 1.2 핸드셰이크의 중요한 차이점 중 하나입니다.
서버가 마스터 암호를 생성
이 시점에서 서버는 클라이언트 무작위, 클라이언트의 매개변수, 암호 그룹을 받았습니다.
서버는 이미 서버 무작위를 자체적으로 생성할 수 있으므로 이미 서버 무작위를 보유하고 있습니다.
따라서 서버는 마스터 암호를 생성할 수 있습니다.
서버 헬로 및 '완료됨'
서버 헬로에는 서버의 인증서, 디지털 서명, 서버 무작위, 선택한 암호 그룹이 포함됩니다.
서버는 이미 마스터 암호를 가지고 있으므로 "완료됨" 메시지도 전송합니다.
마지막 단계 및 클라이언트 '완료됨'
클라이언트가 서명 및 인증서를 확인하고 마스터 암호를 생성한 후 "완료됨" 메시지를 전송합니다.
안전한 대칭 암호화 성공
위 과정을 통해 세션키가 생성이 되면 해당 세션키를 대칭키로 활용하여 요청/응답 데이터 암복호화가 이뤄집니다.
세션키를 통한 대칭키 암복호화가 아닌 매번 비대칭 알고리즘을 통해 데이터를 암복호화 한다면 성능에 영향을 미칠 것이기에 비대칭 알고리즘은 세션키 생성에만 활용됩니다.