TLS

개요

SSL이라고도 불렸지만, 점차 버전이 올라가면서 현재는 TLS로 불리는 프로토콜.
TLS는 웹 상에서 전송되는 데이터를 암호화하기 위해 고안된 프로토콜로, HTTPS프로토콜에서 기본으로 사용한다.

간단하게만 요약하자면 서버와 클라이언트는 실제 데이터를 암호화하여 전송한다.
이를 위해서 대칭키를 사용하는데, 이 대칭키를 교환하기 위해서 공개키 암호화 알고리즘을 활용한다.
그런데 이때 클라이언트는 웹 상에 자신의 주소를 노출하고 있는 서버를 함부로 신뢰할 수 없다.
그렇기 때문에 PKI, 즉 공개키 인프라 구조를 활용하여 서버의 신원을 검증한다.

개념이 헷갈린다면

이 문서는 PKI 문서에서 정리하던 내용을 분리시켜 새로 문서를 만들었다.
그래서 여기에 나오는 개념들이 어렵다면 해당 문서를 먼저 보는 것이 좋다.

상세 흐름

TLS는 총 4가지의 하위 프로토콜로 구성돼있다.

TLS(1.2)는 이렇게 크게 봤을 때는 두 계층으로 나뉘어져 있고, 쩌리 프로토콜 두 개가 핸드쉐이킹 프로토콜에 포함돼있다.
이중에서 가장 핵심적으로 볼 만한 것은 핸드쉐이킹 프로토콜이라, 이걸 위주로 정리했다.[1]

Record Protocol

하위 계층에 속하는 프로토콜로, 상위 계층(핸드쉐이킹)에서 설정된 방식에 의거해 데이터 암호화, 단편화, 압축 등의 작업을 수행하는 레코드 층에 대한 프로토콜이다.
이 프로토콜이 책임지는 것은 기밀성과 신뢰성이다.
서버와 클라 간의 연결을 대칭키로 암호화하는 과정이 여기에서 일어난다.
대부분 암호화되지만, 설정에 따라서 암호화하지 않는 통신도 허용한다.
여기에 MAC을 활용해 무결성을 보장하는 것도 이 프로토콜에서 수행된다.

이 프로토콜이 동작하기 위해 서버, 클라의 난수, 마스터 시크릿, 해시 함수, 난수생성함수 등의 값이 정해진다.
이들을 이용해 최종적으로 서버와 클라는 반드시 다음의 값들을 같은 상태로 동기화해야 한다.

이것들이 같은 상태라면 서버와 클라는 통신 시 데이터를 복호화하고, 압축을 풀고, 무결성 검증을 할 수 있게 된다.
이 프로토콜에서 안전성이 전부 확보되기 때문에, 이 프로토콜이 성립하기 위해 각종 필요한 값들을 서버와 클라가 공유하는 과정이 필요하다.

Handshaking Protocol

그것이 바로 이 프로토콜이다!
핸드쉐이킹 프로토콜은 위 레코드 프로토콜을 세팅하고 검증하기 위한 절차를 담은 프로토콜이다.

핸드쉐이킹 과정은 대충 4번 오고 간다.
여기에 에러가 발생하거나, 중간에 암호 방식을 교체한다던가 하는 각종 추가적인 과정이 있을 수 있긴 한데, 이것들은 생략했다.
그런 트래픽은 항상 발생하는 것은 아니기도 하고, 핵심 플로우에 해당하진 않는다.
빨간색 블록은 클라이언트의 신원까지 검증하는 [[#mTLS]]로 핸드쉐이킹이 이뤄질 때만 발생하는 추가적인 트래픽이다.

레코드 프로토콜에서 필요한 값 중 하나는 마스터 시크릿이란 값이었다.
이 값은 클라 난수 + 서버 난수 + Pre Master Secret을 합쳐 만들어진다.
각 난수는 암호화되지 않았지만, Pre Master Secret는 클라가 서버의 공개키로 암호화했기에 서버만이 복호화할 수 있다.
이를 바탕으로 Master Secret을 만들면 둘만의 대칭키를 만드는데 활용할 수 있다!

TLS는 그 자체로도 복잡하고 중요한 포인트가 많은데, 통신 주체 신원 검증 시 어떻게 인증서를 검증하는지만 보겠다. 서버는 자신을 증명할 수 있는 인증서와, 인증서에 사인해준 인증 기관의 인증서와, 그 인증서에 사인해준 인증 기관에 인증서와, 그 인ㅈ.. 를 모두 보낸다. 그러면 클라는 그 인증서들을 전부 받아보고 순서대로 인증서들을 뜯어보며 검증한다. 먼저 뜯은 인증서는, 이 다음의 인증서에 담긴 공개키로, 그 인증서는 또 다음의 담긴 공개키로.. 이런 식으로 체인을 이어나가고 마지막 인증서는 클라 로컬에 있는 루트 CA 인증서를 이용해 검증한다. 이 과정을 통해 비로소 클라는 서버의 공개키를 믿을 수 있게 되고, 이 공개키로 핵심 비밀 변수인 Pre Master Secret을 암호화해서 보낼 수 있게 된다! ## TLS 번외 몇 가지 재밌는 특징들을 정리해봤다. - 서버 키 교환 메시지 - 서버 헬로 과정에서 이 값은 디피헬만류의 대칭키 교환을 택할 때만 선택적으로 보내진다. - 클라 키 교환 메시지 - 이 트래픽은 PMS를 교환하는 과정으로서, 필수로 이뤄진다. - 클라 인증서 검증 - mTLS를 하는 경우, 클라의 인증서를 받은 서버는 인증서 검증 과정을 거친다. - 그러나 다수를 대상으로 하는 서버인 만큼, 서버는 핸드쉐이킹을 하는 클라가 중간에 바꿔치기 되지 않았는지 꼼꼼하게 확인한다. - 이를 위해 클라는 그간 핸드쉐이킹 과정 상에서 오고간 모든 메시지를 자신의 개인키로 암호화하여 서버에게 보낸다! - 그럼 서버는 일단 정말 클라가 개인키를 가지고 있단 것을 확인하고, 또한 여태 통신한 클라가 맞다는 것까지 확인한다.

참고로 세션 유지 및 재개에 대한 절차도 잘 마련돼있다.
세션 시간이 오래 되거나 데이터가 더 이상 오고가지 않을 때, 클라에게 서버가 헬로 좀 해달라 요청(HelloRequest)하기도 한다.

mTLS

mutual TLS는 클라이언트의 신원도 인증서를 기반으로 검증하는 추가 단계가 포함된 프로토콜이다.
별도로 분리된 프로토콜은 아니고, 그냥 위의 동작 흐름 상에서 클라 인증서를 교환하는 과정이 조금 추가될 뿐이다.
일반 사용자가 브라우저를 이용할 때 사용되진 않고, 서버 간 통신을 할 때 서로를 신뢰하기 위한 수단으로 사용된다.

쿠버네티스 인증에서는 이 방식을 이용해 접근하는 클라의 신원을 체크하기도 한다.

관련 문서

이름 noteType created
TLS downgrade attack knowledge 2024-06-20
openssl knowledge 2025-01-18
cfssl knowledge 2025-01-23
PKI knowledge 2025-03-10
Cert Manager knowledge 2025-03-15
TLS knowledge 2025-04-16
Istio PeerAuthentication knowledge 2025-05-04
SPIFFE knowledge 2025-05-04
6W - PKI 구조, CSR 리소스를 통한 api 서버 조회 published 2025-03-15
5W - 이스티오 mTLS와 SPIFFE published 2025-05-11
7W - 이스티오 메시 스케일링 published 2025-06-09
E-api 서버 감사 topic/explain 2025-01-21
E-이스티오 메시 스케일링 topic/explain 2025-06-08

참고


  1. https://datatracker.ietf.org/doc/html/rfc5246#autoid-32 ↩︎