TLS 확장 표준 중에서 SNI 필드를 이용하여 사이트 차단 방법에 대해서 설명 드리도록 하겠습니다. SNI 필드 정의, SNI 필드가 필요한 이유 그리고 차단 원리에 대해서 자세히 설명드리도록 하겠습니다.
SNI 이란
SNI은 Server Name Indication이라고 불리우는 TLS 프로토콜의 확장 표준입니다. SNI 필드는 서버의 어떤 도메인이 브라우저에서 handshake 과정에서 연결되는지 나타내는 필드입니다.
이 필드를 이용하여 서버는 여러개의 도메인의 인증서를 구분하여 처리 할 수 있도록 도와주는 필드입니다.
SNI 필드가 필요한 이유
아래의 이미지는 TLSv1.2 프로토콜에서 handshake 과정을 거치고, Application Data인 GET 방식으로 hiseon.me 에 데이터를 요청을 나타냅니다. 참고로 Application Data는 암호화 된 상태로 전송되게 됩니다.
다음 이미지를 보시면, SSL 연결을 초기화 하는 과정에서 키 교환을 하기 전에 서버의 인증서가 전송된 것을 알 수 있습니다.
인증서에서는 SSL연결을 맺고자 하는 도메인의 정보가 포함되어 있습니다. 만약 서버내에서 여러개의 사이트가 운영되는 환경에서는 각각의 인증서 파일들이 서로 다릅니다.
따라서 SSL 연결을 초기화 하는 과정에서 서버는 어떠한 인증서를 클라이언트에게 전송해야 될지 확인이 어려울 수 있습니다.
이러한 어려움으로 클라이언트가 서버로 전송하는 Client Hello 패킷에서 서버에서 요청하는 인증서 정보가 포함된 필드가 SNI 필드인 것입니다.
SNI 필드 차단 방식 원리
SNI 필드는 서버와 클라이언트가 완전히 암호화 통신을 하기전에, 클라이언트가 요청하는 서버의 도메인이 평문으로 나타나기 때문에 차단이 가능한 것입니다.
따라서, 패킷을 모니터링 하고 차단 할 수 있는 위치에서는 클라이언트가 접속하고자 하는 서버의 도메인을 확인 후 차단 할 수 있는 겁니다.
아래의 이미지 처럼 Client Hello 패킷 내부에 TLS 연결을 맺는 서버의 도메인이 평문으로 나타난 것을 확인 하실 수 있습니다.
SNI 차단 우회
SNI 차단 기술을 우회하는 방법에는 여러 종류가 있습니다. VPN 을 사용하시거나, Encrypted SNI 사용, TLS 1.3 사용 등 다양한 방법이 있습니다. 추가적으로 SSL 패킷 복호화와 관련해서는 아래의 글을 참고하실 수 있습니다.
와이어샤크(Wireshark)를 이용하여 SSL 트래픽 복호화
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)