TLS(Transport Layer Security)란?
전송 계층 보안(TLS)은 인터넷 상의 커뮤니케이션을 위한 개인 정보와 데이터 보안을 용이하게 하기 위해 설계되어 널리 채택된 보안 프로토콜이다. TLS는 주로 웹 사이트를 로드하는 웹 브라우저와 같이 웹 응용 프로그램과 서버 간의 커뮤니케이션을 암호화하는 것이다. TLS는 또한 이메일, 메시지, 보이스오버 IP(VoIP) 등 다른 커뮤니케이션을 암호화하기 위해 사용된다.
TLS와 HTTPS의 차이점은?
HTTPS는 HTTP 프로토콜 상위에서 TLS 암호화를 구현한 것으로 모든 웹 사이트와 다른 웹 서비스에서 사용된다. 따라서 HTTPS를 사용하는 웹 사이트는 TLS 암호화를 이용한다.
TLS의 역할
TLS 프로토콜은 암호화, 인증, 무결성이라는 세 가지 주요 요소를 달성한다.
- 암호화: 제3자로부터 전송되는 데이터를 숨긴다.
- 인증: 정보를 교환하는 당사자가 요청된 당사자임을 보장한다.
- 무결성: 데이터가 위조되거나 변조되지 않았는지 확인한다.
TLS의 작동 원리
웹 사이트나 응용 프로그램이 TLS를 사용하기 위해서는 원본 서버에 TLS 인증서가 설치되어 있어야 한다.
인증 기관이 도메인을 소유한 사람 혹은 비즈니스에게 TLS 인증서를 발행한다. 인증서는 서버의 공개키와 더불어 누가 도메인 소유자인지에 대한 중요한 정보를 포함하며, 이 두가지는 모두 서버의 신원을 확인하는 데 중요하다.
TLS 연결은 TLS Handshake로 알려진 일련의 순서를 사용하여 초기화된다. 사용자가 TLS를 사용하는 웹 사이트를 돌아다니면 사용자 장치와 웹 서버 간에 TLS Handshake가 시작된다.
TLS Handshake란?
TLS Handshake는 데이터를 주고 받기 전, 서버의 무결성을 확인하고 대칭키를 전달하는 과정이다.
TLS Hankshake 동안 사용자 장치와 웹 서버는 다음과 같은 일을 수행한다.
- 사용할 TLS 버전(TLS 1.0, 1.2, 1.3 등)을 지정한다.
- 사용할 암호 제품군을 결정한다.
- 서버의 TLS 인증서를 사용하여 서버의 신원을 인증한다.
- Handshake가 완료된 후 키 간의 메시지를 암호화하기 위한 세션 키를 생성한다.
TLS Handshake는 각 커뮤니케이션 세션을 위한 암호 제품군을 구축한다. 암호 제품군은 공유된 암호화 키 또는 세션 키와 같은 세부 정보를 명시하는 알고리즘 집합으로 해당 특정 세션에 사용된다. 공개 키 암호화로 알려진 기술 덕분에 TLS는 암호화되지 않는 채널을 통해 일치하는 세션 키를 설정할 수 있다.
Handshake는 또한 인증을 처리하며, 이는 대개 클라이언트에게 신원을 증명하는 서버로 구성된다.
공개 키는 단방향 암호화를 사용하는 암호화 키로, 공개 키를 가진 누구나 신뢰성을 보장하기 위해 서버의 개인 키로 암호화된 데이터를 해독할 수 있다. 서버의 공개키는 TLS 인증서의 일부이다.
데이터가 암호화되고 인증되고 나면, 메시지 인증 모드(MAC)와 함께 서명된다. 수신자는 데이터의 무결성을 보장하기 위해 MAC을 확인할 수 있다.
TLS Handshake 진행 과정
1. Client : Client Hello
클라이언트 -> 서버 Client Hello 메시지 전송
패킷 내에는 TLS Version, Client가 지원하는 암호화 방식, Client Random Data(클라이언트에서 생성한 난수로 대칭키를 만들ㄷ 때 사용), Session ID, SNI(서버명) 포함된다.
- Session ID: 매번 연결 시 Handshake 과정 진행하는 것은 비효율, 최초만 진행하고 그 이후는 Session ID를 통해서 인증한다.
2. Server
- Server Hello
서버 -> 클라이언트로 응답이다.
TLS Version, 암호화 방식(Client가 보낸 암호화 방식 중 서버가 사용 가능한 암호화 방식 선택), Server Random Data(서버에서 생성한 난수, 대칭키를 만들 때 사용), SessionID
- Server Certificate
서버의 인증서를 클라이언트에게 보내는 단계로 필요에 따라 CA의 Certificate도 함께 전송한다.
* 클라이언트는 이 패킷을 통해 서버의 인증서가 무결한지 검증한다.
- Server Hello Done
서버가 클라이언트에게 보낼 메시지를 모두 보냈다.
3. Client : Client Key Exchange
인증서가 무결한지 검증 되었으면 클라이언트의 난수와 서버의 난수를 조합하여 대칭키를 생성한다.
그리고 대칭키를 서버의 공개키로 암호화해서 서버에 전송한다.
키 교환에 필요한 정보를 서버에 제공한다. 이 정보를 pre-master secret 이라고 하며 대칭키에 사용되는 것으로 절대 노출되면 안된다.
pre-master secret은 난수를 조합하여 생성한 것이다.
이 값을 서버의 공개키로 암호화해서 전송하면 서버는 개인키로 복호화한다. 이 값을 사용하여 세션에 사용될 키를 생성하는데, 이게 대칭키이다.
4. Serer & Client
- Change Cipher Spec
이제부터 전송되는 모든 패킷은 협상된 알고리즘과 키를 이용하여 암호화 하겠다고 알리는 메시지
- Finished
TLS Handshake를 성공적으로 마치고 종료
Session keys and TLS handshakes
TLS 프로토콜은 비대칭/공개 키와 대칭 암호화를 모두 사용하며, 각 통신 세션에 대해 대칭 암호화를 위한 새로운 키를 생성해야 한다.
이러한 키를 "세션 키" 라고 한다.
세션 키란?
세션 키는 TLS Handshake가 완료된 후에 TLS를 통한 통신 양측에서 사용하는 대칭 키이다. 양측이 세션 키에 대해 합의하면,
더 이상 공개키와 개인키를 사용할 필요가 없으며, TLS는 각각의 고유 세션에 대해 서로 다른 세션 키를 생성한다.
세션 키는 하나의 통신 세션을 암호화하는 데 사용되는 대칭 암호화 키이다. 다시 말해, 두 당사자 간에 전송되는 데이터를 암호화하고 해독하는 데 한 번만 사용되는 임시 키이다.
TLS가 웹 응용 프로그램 성능에 미치는 영향
TLS의 최신 버전은 웹 응용 프로그램 성능에 거의 영향을 미치지 않는다.
TLS 연결을 설정하는 데 수반되는 복잡한 프로세스 때문에 로드 시간과 계산 능력이 소모되어야 한다. 데이터가 전송되기 전에 클라아이언트와 서버는 왔다 갔다 몇 번 커뮤니케이션해야하며, 이는 클라이언트와 서버 모두를 위한 메모리뿐만 아니라 웹 응용 프로그램을 위한 로딩 시간을 소모한다.
그러나 TLS Handshake가 생성한 잠재적인 지연을 완하하는 것을 돕는 기술이 있다.
하나는 TLS Handshake가 완료되기 전에 서버와 클라이언트가 데이터 전송을 시작하도록 하는 TLS False Start이다.
TLS를 빠르게 하기 위한 또 다른 기술은 이전에 커뮤니케이션한 적이 있는 서버와 클라이언트가 간략화된 Handshake를 사용하도록 허용하는 TLS Session Resumption이다.
이러한 개선 사항은 TLS의 로딩 시간에 영향을 주지않게 도와주었고, TLS와 연관된 계산 비용은 거의 무시해도 된다.
TLS 1.3의 TLS Handshake는 몇 밀리세컨드로 프로세스를 단축하며, 2회 대신 1회 왕복만 요구한다. 사용자가 기존에 웹 사이트에 연결한 적이 있으면, TLS Handshake는 0회 왕복할 수도 있다.