SNI: 목적지를 유출하는 필드

HTTPS가 모든 걸 암호화한다고? 아니다. 어떤 사이트에 접속하는지는 TLS 핸드셰이크에서 평문으로 전송된다.

대부분 HTTPS가 어디로 가는지 숨겨준다고 생각한다.

아니다. 완전히는.

페이지 콘텐츠는 암호화된다. 쿠키도. 요청 경로도. 하지만 그 모든 보호가 시작되기 전에, 클라이언트가 서버에게 어떤 호스트명을 원하는지 알려줘야 한다. 그 호스트명은 TLS ClientHello 안에 Server Name Indication — SNI — 으로 평문 전송된다. 네트워크 경로에 있는 누구든 어떤 사이트에 접속하는지 볼 수 있다.

HTTPS가 바람에 내놓고 간 부분이다.

SNI가 존재하는 이유

SNI는 아주 평범한 호스팅 문제를 풀었다.

웹이 가상 호스팅으로 넘어가면서 하나의 IP 주소가 여러 HTTPS 사이트를 서빙하게 됐다. 핸드셰이크가 진행되기 전에 서버가 어떤 인증서를 제시할지 알아야 한다. 10개 도메인이 하나의 엣지 IP를 공유하면 클라이언트가 a.example을 원하는지 b.example을 원하는지 모르면 올바른 인증서 체인을 고를 수 없다.

그래서 TLS가 ClientHello에 확장을 추가했다: “이 호스트명 때문에 왔습니다.”

단순하다. 필요하다. 그리고 완전히 암호화되지 않았다.

ClientHello는 TLS 핸드셰이크의 첫 번째 메시지다. 키가 교환되기 전, 암호화가 협상되기 전에 보내진다. 안의 SNI 필드는 ISP, 기업 프록시, 국가 방화벽, 카페 라우터 — 보는 누구에게나 읽힌다.

뭐가 유출되나

HTTPS는 통신 내용을 보호한다. SNI는 목적지를 유출한다.

ISP가 사이트에서 어떤 페이지를 보는지는 못 본다. 하지만 방문하는 모든 사이트의 완전한 목록을 만들 수 있다. 프로파일링, 표적 광고, 감시에 충분하다. 일부 국가에서는 검열에 충분하다.

중국의 방화벽, 기업 콘텐츠 필터, ISP 수준 자녀 보호 기능이 정확히 이렇게 작동한다. SNI 필드를 검사해서 차단 여부를 결정한다. 암호화를 깰 필요가 없다. 호스트명이 바로 거기, 첫 패킷의 평문에 있다.

DNS-over-HTTPS로 DNS 쿼리를 숨겨도 SNI 필드가 목적지를 드러낸다. 질문(“example.com의 IP가 뭐야?”)은 암호화했는데 바로 다음 패킷에서 답을 발표한 셈이다.

도메인 프론팅: 죽은 꼼수

한동안 영리한 우회 방법이 있었다.

도메인 프론팅은 SNI와 HTTP 사이의 격차를 악용했다. SNI에는 검열자가 차단하지 않을 인기 CDN 도메인을 넣고, HTTP Host 헤더에는 실제 목적지를 넣는다(암호화 터널 안에 숨겨진). 검열자는 SNI를 보고 통과시킨다. CDN은 Host 헤더를 읽고 진짜 사이트로 라우팅한다.

Signal이 여러 나라에서 검열을 우회하는 데 이 방법을 썼다.

그다음 클라우드 제공자가 죽였다. Amazon, Google, Microsoft 모두 도메인 프론팅을 비활성화했다. 서비스 약관 위반이었으니 이해는 간다. 하지만 반체제 인사들이 의존하던 도구도 함께 사라졌다.

Encrypted Client Hello: 진짜 해결책

제대로 된 해결책은 Encrypted Client Hello — ECH다.

아이디어: SNI 필드 자체를 암호화한다. 클라이언트가 DNS에서 공개키를 가져오고(HTTPS 또는 SVCB 레코드에 게시된), 그걸로 실제 호스트명이 담긴 내부 ClientHello를 암호화하고, 일반적 커버 이름만 보여주는 외부 ClientHello로 감싼다.

관찰자가 보는 것: cloudflare-ech.com(또는 커버가 뭐든)에 연결. 실제 목적지는 암호화됐다. 개인키를 가진 서버만 읽을 수 있다.

ECH가 이렇게 오래 걸리는 이유

ECH는 잘 협조하지 않는 세 레이어의 협조가 필요하다:

DNS 인프라. 서버의 ECH 공개키가 DNS에 HTTPS/SVCB 레코드로 게시돼야 한다. 모든 DNS 제공자가 이 레코드 타입을 지원하지는 않는다.

CDN 지원. ECH는 CDN이 TLS를 종단할 때 가장 잘 작동한다. Cloudflare가 2020년부터 ECH를 실험해왔다. 다른 CDN의 채택은 느리다.

브라우저 배포. Firefox가 ECH를 지원한다. Chrome이 작업 중이다. 둘 다 DNS와 CDN 레이어가 준비돼야 한다.

미들박스 문제. 기업 프록시와 방화벽이 콘텐츠 필터링을 위해 SNI를 검사한다. ECH가 그걸 깨뜨린다. 기업 IT는 가시성을 잃느니 ECH 연결을 완전히 차단할 것이다.

현재 상태

2026년에도 SNI는 대다수 연결에서 목적지를 유출한다. ECH는 트래픽의 일부에서만 배포돼 있다 — 주로 Cloudflare 호스팅 사이트 + Firefox 사용자.

편지를 암호화했는데 봉투 겉에 주소를 써놓았다. 20년 후에도 봉투까지 암호화할지 아직 논쟁 중이다.

토론 참여

← 블로그로 돌아가기