본문 바로가기
IT 기본지식

TLS Handshake는 어떻게 진행되는가? | Session Key

by 내기록 2022. 7. 23.
반응형

TLS(Transport Layer Security)란?


인터넷 상의 커뮤니케이션에서 개인 정보와 데이터 보안을 위해 설계되어 널리 채택된 보안 프로토콜이다.

주요 사용 사례는 웹 브라우저(웹 응용 프로그램)와 서버 간의 통신 데이터를 암호화하는 것이다. 그 외에도 이메일, 메시지, 보이스오버 IP(VoIP)등 여러 통신 데이터를 암호화한다.

 

TLS는 Netscape가 개발한 SSL(Secure Sockets Layer)이라는 이전의 암호화 프로토콜에서 발전한 것이다.

 

HTTPS는 HTTP 프로토콜 상위에서 TLS 암호화를 구현한 것이다. HTTPS를 사용하는 웹 사이트는 TLS 암호화를 사용한다.

 

*참고

TLS : 4계층 Transport Layer

 

아래 포스팅에 TLS 내용을 보고 오시면 아래 Handshake 과정을 이해하는데 도움이 됩니다.

 

HTTPS란 무엇인가? / TLS(=SSL) 공개키 암호화

HTTPS is HTTP with encryption. HTTPS는 암호화 기능이 있는 HTTP 두 프로토콜의 차이점은 HTTPS가 TLS(SSL)를 사용하여 일반 HTTP 요청과 응답을 암호화 한다는 것이다. 따라서 HTTPS가 HTTP보다 훨씬 더 안전..

sunrise-min.tistory.com

 

 

TLS가 하는 것?


- 암호화 : 제3자로부터 전송되는 데이터를 숨긴다.

- 인증 : 정보를 교환하는 당사자가 요청된 당사자임을 보장한다.

- 무결성 : 데이터가 위조되거나 변조되지 않았는지 확인한다.

 

 

TLS Handshake


TLS 연결은 TLS Handshake를 사용한다. 사용자가 TLS를 사용하는 웹사이트를 접속하면 클라이언트와 웹 서버간에 TLS Handshake가 시작된다.

 

클라이언트는 서버의 인증서를 받아 서버의 무결성을 확인하고

신뢰할 수 있는 서버라면, 암호화 통신에 사용할 대칭키를 서버의 공개키로 암호화 하여 전달한다.

 

여기서 데이터를 주고 받기 전, 서버의 무결성을 확인하고 대칭키를 전달하는 과정 → TLS Handshake

 

TLS Handshake를 하는 동안 클라이언트와 웹 서버는 아래 일을 수행한다.

- 사용할 TLS 버전 지정

- 사용할 암호 제품군 결정 - 공유된 암호화 키 또는 세션 키와 같은 세부 정보를 명시하는 알고리즘 집합

- 서버의 TLS 인증서를 사용하여 서버의 신원을 인증

- Handshake가 완료된 후 메시지를 암호화하기 위한 세션 키 생성

 

공개키 암호화 방식을 사용하여 TLS는 세션 키를 설정할 수 있다.

→ 뒤에 나오지만 클라이언트는 생성된 대칭키를 서버의 공개키로 암호화한다

 

Handshake는 인증도 처리하는데 이는 공개 키를 사용하여 수행된다.

공개 키는 단방향 암호화를 사용하는 암호화 키로, 공개 키를 가진 누구나 신뢰성을 보장하기 위해 서버의 개인 키로 암호화된 데이터를 해독할 수 있음을 의미하지만 원래 발신자만 개인 키를 이용해 데이터를 암호화할 수 있다.

서버의 공개키는 TLS 인증서의 일부이다.

 

데이터 암호화와 인증이 진행되면 메시지 인증 코드(MAC)와 함께 서명된다. 수신자는 데이터의 무결성을 보장하기 위해 MAC을 확인할 수 있다. (아무도 손대지 않았음)


 

https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/

* 위 그림에서 알 수 있듯이 TCP 통신을 먼저 진행해서 통로를 생성한 다음에 TLS를 진행한다.

 

TLS Handshake 진행 과정

Client : Client Hello

클라이언트가 서버에서 Client Hello 메시지 전송

패킷 내에는 TLS Version, Client가 지원하는 암호화 방식, Client Random Data(클라이언트에서 생성한 난수로 대칭키를 만들 때 사용), Session ID, SNI(서버명) 가 포함된다.

 

- Session ID

매번 연결할 때마다 Handshake 과정을 진행하는 것은 비효율적이니 최초 한번 전체 Handshake 과정을 진행하고 Session ID를 가진다. 후에는 이 Session ID를 사용해서 위 과정을 반복해서 진행하지 않는다.

 

https://babbab2.tistory.com/7

최초 Handshake에선 SessionID가 0이지만 Handshake를 한번 진행하면 서버로부터 Session ID를 받는다.

클라이언트는 로컬에 저장해두고 다시 서버와 Handshake과정을 맺을 일이 있다면 Session ID를 포함한 패킷을 전송한다.

서버에서는 전달받은 Session ID가 아직 유효하다면 동일한 Session ID를 다시 전송한다.

이 과정에서 최초 Handshake를 위해 진행한 작업들을 하지 않기 때문에 시간이 절약된다.

 

 

Server : Server Hello

클라이언트가 보낸 Client Hello에 대한 서버의 응답이다.

TLS Version, 암호화 방식(Client가 보낸 암호화 방식 중에 서버가 사용 가능한 암호화 방식을 선택), Server Random Data(서버에서 생성한 난수, 대칭키를 만들 때 사용), SessionID(유효한 Session ID)

 

Server : Server Certificate

서버의 인증서를 클라이언트에게 보내는 단계로 필요에 따라 CA의 Certificate도 함께 전송한다.

* 클라이언트는 이 패킷을 통해 서버의 인증서가 무결한지 검증한다.

 

Server :  Server Hello Done

서버가 클라이언트에게 보낼 메시지를 모두 보냈다는 뜻

 

Client : Client Key Exchange

인증서가 무결한지 검증 되었으면 클라이언트의 난수와 서버의 난수를 조합하여 대칭키를 생성한다.

그리고 대칭키를 서버의 공개키로 암호화한다.

암호화한 정보를 서버에게 전송한다.

 

자세히 말하자면, 키 교환에 필요한 정보를 서버에 제공한다. 이 정보를 pre-master secret 이라고 하며 대칭키에 사용되는 것으로 절대 노출이 되어서는 안된다. pre-master secret은 난수를 조합하여 생성한 것이다.

이 값을 서버의 공개키로 암호화해서 전송하면 서버는 개인키로 복호화가 가능하다. 그렇게 되면 서로가 pre-master secret을 공유하게 된다. 이 값을 사용해서 세션에 사용될 키를 생성하게 되는데, 이 키가 바로 대칭키이다.

 

Server & Client : Change Cipher Spec

이제부터 전송되는 모든 패킷은 협상된 알고리즘과 키를 이용하여 암호화 하겠다고 알리는 메시지

 

Server & Client : Finished

TLS Handshake를 성공적으로 마치고 종료

 

 

Session keys and TLS handshakes

TLS 프로토콜은 비대칭/공개 키와 대칭 암호화를 모두 사용하며, 각 통신 세션에 대해 대칭 암호화를 위한 새로운 키를 생성해야 한다. 이러한 키를 "세션 키"라고 한다.

 

세션 키란 무엇인가?

세션 키는 TLS 핸드셰이크가 완료된 후에 TLS를 통한 통신 양측에서 사용하는 대칭 키이다.

양측이 세션 키에 대해 합의하고 나면 더 이상 공개키와 개인키를 사용할 필요가 없으며, TLS는 각각의 고유 세션에 대해 서로 다른 세션 키를 생성한다.

 

세션 키는 하나의 통신 세션을 암호화하는 데 사용되는 대칭 암호화 키이다. 다시 말해, 두 당사자 간에 전송되는 데이터를 암호화하고 해독하는 데 한 번만 사용되는(한 세션 타임이 끝날 때까지) 임시 키이다. 두 당사자 간의 이후 대화는 서로 다른 세션 키로 암호화된다. 세션 키는 사용자가 로그인할 때마다 재설정되는 암호와 같다.

TLS에서, 두 통신 당사자(클라이언트 및 서버)는 TLS 핸드셰이크가 진행되는 동안 통신 세션을 시작할 때 세션 키를 생성한다. TLS에 대한 공식 RFC는 실제로 이러한 키를 "세션 키"라고 부르지는 않지만 기능적으로는 세션 키와 같다.

 

 

세션이란 무엇인가?

세션은 본질적으로 두 당사자 사이의 단일 대화이다. 세션은 네트워크를 통해 이루어지며 두 장치가 서로를 인식하고 가상 연결을 열 때 시작됩니다. 두 기기가 서로 필요한 정보를 입수해(통신을 완료하고) '닫기_알림' 메시지를 보내면서 마치 두 사람이 문자를 주고받는 것처럼 연결을 종료하고 "나중에 통화하자"고 말하며 대화를 닫는다. 두 사람이 문자 메시지를 보내고 단순히 서로에게 응답하지 않는 것과 같이 비활성으로 인해 연결이 시간 초과될 수도 있다.

 

https://www.cloudflare.com/ko-kr/learning/ssl/what-is-a-session-key/

 

세션은 설정된 기간일 수도 있고, 두 당사자가 통신하는 동안 지속될 수도 있다. TLS 암호화의 맥락에서 두 장치는 정보를 교환하고 새 세션 키를 생성하여 연결을 다시 열어야 한다.

 

 

암호화 키(Cryptographic key)란 무엇인가?

암호화에서는 암호화 알고리즘의 특수 입력을 참조하기 위해 키(일반적으로 짧은 데이터 조각)에 대해 이야기하는 것이 일반적이다. 가장 일반적인 키는 데이터 암호화에 사용되는 키이다. 그러나 다른 목적을 위해 다른 유형의 키가 존재한다.

데이터 암호화 알고리즘은 (비밀) 키를 사용하여 메시지를 암호문, 즉 스크램블되어 읽을 수 없는 메시지 버전으로 변환합니다. 암호 해독 키를 사용하여 암호문에서 원본 메시지를 복구할 수 있다.

대칭 암호화 알고리즘에서는 암호화 키와 암호 해독 키가 모두 동일합니다. 따라서 비밀 키를 보유한 사람은 누구나 데이터를 암호화 및 해독할 수 있으며 이것이 대칭 키라는 용어가 자주 사용되는 이유이다.

반대로, 공개 키 암호화라고도 하는 비대칭 암호화 알고리즘에는 두 개의 키가 있다. 하나는 공개이고 데이터 암호화에만 사용할 수 있는 반면 다른 하나는 비공개로 유지되어 암호문 해독에만 사용된다.

 

 

HTTPS는 대칭(symmetric) 또는 비대칭 암호화(asymmetric cryptography)를 사용하는가?


TLS 프로토콜과 결합된 HTTP인 HTTPS는 두 가지 유형의 암호화를 모두 사용한다. TLS를 통한 모든 통신은 TLS 핸드셰이크로 시작됩니다. 비대칭 암호화는 TLS 핸드셰이크가 작동하도록 하는 데 중요한 요소이다.

TLS 핸드셰이크가 진행되는 동안 두 개의 통신 장치가 세션 키를 설정하고 세션의 나머지 부분에서 대칭 암호화에 사용된다(장치가 세션 중에 키를 업데이트하도록 선택하지 않는 한). 일반적으로 두 통신 장치는 클라이언트 또는 랩톱이나 스마트폰과 같은 사용자 장치와 웹 사이트를 호스팅하는 웹 서버인 서버이다.

TLS 핸드셰이크에서 클라이언트와 서버는 다음을 수행한다.
- 사용할 암호화 알고리즘 협상(비대칭 암호화를 통해 안전하게 수행)
- TLS 인증서에 대해 서버 ID 인증(비대칭 암호화 사용)

 

 

참고2)  비대칭 암호화(공개키 암호화)

 

대칭키 암호는 송신자와 수신자가 하나의 키를 공유해서 사용한다.

이러한 대칭키에는 두 가지 문제점이 있다.

1) 최초에 비밀키를 안전하게 주고 받는 것이 어렵다.

2) 너무 많은 키가 필요하다. (n명이 통신 할 경우 n(n-1)/2 개의 키 필요)

 

이를 해결하기 위해 비대칭 암호화(=공개키 암호화) 방식을 사용한다.

 

* 비대칭 암호화(asymmetric cryptography) = 공개키 암호화 방식

https://en.wikipedia.org/wiki/Public-key_cryptography#/media/File:Public_key_encryption.svg

비대칭 암호화 방식은 public key로 암호화를 하고 받는 쪽에서 private key로 복호화를 하는 방식이다.

대칭 암호화 방식은 많은 키가 필요하지만 비대칭 암호화 방식은 공개키와 비밀키만 관리하면 된다.

즉, Bob이 Alice에게 메시지를 보낼때 Alice의 public key로 암호화를 하면 Alice는 본인의 Private key로 복호화를 한다.

 

비대칭 암호화 방식의 단점

- 대칭키 암호화에 비해 속도가 느리다. 

그래서 비대칭 암호화(공개키 암호화)는 주로 대칭키 암호 통신을 위한 키쌍을 만들 때 사용한다.

즉! 통신은 대칭키 암호화로 빠르게 하지만, 키를 처음에 교환할 때 공개키 암호를 사용하는 것이다.

이 때 만들어지는 대칭키의 쌍을 세션키(Session key)라고 한다.

 

 

 

 

References

https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/

https://babbab2.tistory.com/7

https://www.cloudflare.com/ko-kr/learning/ssl/what-is-a-session-key/

https://reakwon.tistory.com/106

https://ddongwon.tistory.com/41

반응형

댓글