개요
Server Name Indication(SNI)는 컴퓨터 네트워크 프로토콜로 사용되는 TLS의 확장으로, TLS연결이 정립되기 이전에는 서버와 클라이언트가 서로의 인증서를 공유하지 않은 상태이다. 호스트 네임이란 네트워크 상에서 주소를 찾기 위해서 사용되는 이름을 의미한다. 보통 보안을 위해서 하나의 호스트 네임은 하나의 인증서를 사용하는 경우가 대부분이다.
예를 들어서, 본 사이트는
junhoahn.kr mail.junhoahn.kr fax.junhoahn.kr
이라는 여러개의 호스트 이름을 가질 수 있으며, 각각의 호스트는 다 다른 인증서를 사용하는 것이 권장된다.
이때 서버가 만약 여러개의 도메인을 사용하는 상황이라면, 어떤 인증서를 클라이언트에 보내야 하는지 정할 수 없다는 문제가 생긴다. 따라서 클라이언트는 서버에게 SNI필드를 통해서 접속하고자 하는 호스트 이름을 서버에 전송한다. 그러나 이 과정에서, 클라이언트가 접속하고자 하는 서버의 도메인이 외부에 평문으로 유출되는 보안 취약점이 있다.
이러한 SNI필드의 취약점은 내용을 감청할 수는 없지만, 금지된혹은 검열하고 있는 사이트에 접속한다는 사실을 알아 낼 수 있다. 따라서 검열 혹은 보안을 위한 필터링에 사용되고 있는 방식중 하나이다.
이러한 SNI차단을 극복하기 위해서 최신 TLS1.3 부터는 Encrypted Client Hello, 즉 ECH라는 암호화 규격을 통해서 TLS의 Client Hello를 암호화 하도록 하였다. ECH는 도메인과 동시에 처음부터 SNI필드 암호화를 위한 공개키를 받아오기 때문에, 초기 단계부터 SNI필드를 암호화 시킨다.