April 21, 2021

TLS는 AES와 RSA의 단점을 보완하기 위해 등장했다.RSA 비대칭키 방식을 이용하고 실제 통신을 할때는 리소스를 적게 소모하는 AES 대칭키 방식을 이용해 데이터를 주고 받는다.HTTPS프로토콜을 사용한다면 기본적으로 적용되어야 하는 프로토콜이다.
TLS를 적용한 서버-클라이언트의 통신 패킷을 직접 확인해보면서 TLS의 동작방식에 대해 알아보자.
Client는 Client Hello라는 메시지를 전송한다.
Cipher Suite List
Client는 Client side에서 지원하는 암호화 방식들에 대해 Cipher Suite List를 통해 Server side에 알려준다.

Cipher Suite List중 Server side와 후술할 Server Hello 를 통해 어떤 암호화 방식을 사용할지 결정하게 된다.Random Data
Client에서는 대칭키를 생성할때 사용할 난수를 생성한다.

Session ID
TLS에서 Handshake를 하는 과정은 시간이 소요되는 작업이다.Handshake만 Full Handshake를 수행하다.이때 최초의 Handshake에서는 Session ID가 0이므로 후술한 Server Hello는 수행되지 않는다. 만약 최초의 Handshake가 아니라면 클라이언트는 Server Hello에서 전달받은 Session ID를 저장하게되고 이 Session ID를 Server에 전달하게 되어 서버에서 인가된다면 동일한 Session ID를 전송하게 되고 Cipher Suite List에서 암호화 방법을 선택하고 대칭키를 교환하는 작업을 건너뛰게 된다.

SNI
최근에는 하나의 IP로 여러개의 도메인이 연결되기 때문에 해당 IP에 접속할때 어떤 도메인을 사용하는지 확인하는 과정이 SNI이다.

Server Hello는 기본적으로 Client Hello와 동일하다 하나 다른점이 있다면 Server Hello과정에서 암호화 방식을 선택한다는 점이다.

Server의 인증서를 Client에게 보내는 단계이다. 이때 필요하다면 CA의 Certificate도 함께 전송한다.

Server는 Client가 생성한 Pre master secret를 서버의 공개키로 암호화 한다.

이때 앞서 언급한 diffie-hellman을 이용해 키를 교환하는 것을 확인할 수 있다.
모든 데이터를 전송한 Server는 Hello Done을 Client에게 전송하게 된다.

Server의 인증서를 받은 Client는 Client Random Data와 Server Random Data를 사용하여 Pre master secret이라는 키를 생성한다. 이것은 대칭키에 해당하는 부분이다.

이때 앞서 언급한 diffie-hellman을 이용해 키를 교환하는 것을 확인할 수 있다.
양측 모두 메시지를 확인한 이후로 통신에 사용되는 모든 메시지는 Handshake에서 결정된 알고리즘과 키를 이용하여 암호화 하겠다는 메시지를 주고 받는다.

Server

Client
양측 모두 TLS로 암호화된 통신을 하는것을 확인할 수 있다.

Client

Server