30년 동안 HTTPS는 비밀을 어설프게 지켰다. 당신이 주고받는 모든 것 — 비밀번호, 통장 잔고, 읽던 기사 — 을 암호화하고는, 매 연결의 맨 처음에 당신이 방문하는 웹사이트가 정확히 어디인지를 평문으로 알렸다. 그 알림이 SNI 필드, Server Name Indication이고, TLS 핸드셰이크의 첫 패킷 안에 그대로 노출된 채 달린다. 서버가 숨을 암호화가 생기기도 전에 어느 인증서를 내밀지 알아야 하기 때문이다. 경로 위의 모든 네트워크 — 당신 ISP, 카페 공유기, 국가 방화벽 — 가 그걸 읽을 수 있었다. 자물쇠는 기밀성을 약속하고 내용물에 대해선 지켰지만, 가장 흥미로운 메타데이터 한 조각 — 목적지 — 은 흘렸다.
Encrypted Client Hello가 그 구멍을 막는다. 대략 7년간 “ESNI 후속”이라 불리던 초안을 거쳐 2026년 3월 RFC 9849가 됐고, 브라우저는 한동안 이미 실어왔다 — Firefox는 119부터 기본 활성, Chrome은 122 언저리부터, Safari는 최근 iOS·macOS부터. 헤드라인은 정확히 원하던 그것이다: 사이트 이름이 드디어 암호화된다. 2024년 말 Cloudflare가 ECH를 대규모로 켜자 몇 주 만에 러시아가 차단에 나섰다. 프라이버시 프로토콜이 받을 수 있는 최고의 찬사이고, ECH가 진짜 뭔가를 하고 있다는 뜻이다.
동시에 ECH가 무엇을 위한 것이며 어디서 멈추는지도 말해준다. ECH는 마케팅이 암시하는 것보다 덜 감추고, 그것이 암호화하는 것과 실제로 보호하는 것 사이의 간극이 이야기의 전부다.
암호화가 존재하기도 전에 필요한 것을 암호화하는 법
닭과 달걀 문제는 말하는 순간 뻔해진다. SNI를 암호화하고 싶은데, SNI는 서버가 어느 키를 쓸지 아는 방법이고, 아직 고르지도 않은 키로 암호화할 수는 없다. 첫 시도였던 ESNI가 이걸 풀려다 실어 나를 수 없는 방식으로 실패했다.
ECH의 답은 핸드셰이크를 둘로 쪼개는 것이다. 평문으로 보내는 바깥 ClientHello가 일반적인 “client-facing server”를 지목한다 — Cloudflare라면 그 엣지 뒤의 모두가 공유하는 cloudflare-ech.com 같은 이름. 그리고 진짜 SNI와 ALPN 목록, 나머지 민감한 필드를 담은 안쪽 ClientHello가, client-facing server의 공개키로 암호화된다. 엣지는 안쪽 hello를 복호화해 진짜 목적지를 읽고 올바른 백엔드에 연결을 넘긴다. 관찰자는 바깥 이름만 보고 당신이 Cloudflare와 대화 중이란 사실만 안다 — IP 주소로 이미 알던 그것.
공개키는 DNS에서 온다. 클라이언트는 사이트의 HTTPS 리소스 레코드 — RFC 9460에서 표준화된 SVCB 계열 레코드 — 에서, ech= 파라미터에 담긴 ECH 구성을 미리 가져온다. 부트스트래핑은 RFC 9848에 따로 명세됐다. 그러니 흐름은: HTTPS 레코드 조회 → ECH 키 추출 → 진짜 ClientHello를 그 키로 암호화 → 미끼 hello로 감싸 전송. 우아하다. 그리고 프라이버시의 핵심 부품 하나를 조용히 DNS로 옮긴다 — 잠시 뒤 이게 엄청나게 중요해진다.
당신의 프라이버시는 군중의 크기다
여기 RFC는 직설적이고 보도자료는 건너뛰는 문장이 있다: ECH는 당신이 어느 제공자에 연결했다는 사실을 감추지 않는다. 그 제공자 뒤의 사이트들 중 어느 것에 닿았는지를 감춘다. RFC 9849는 당신이 사라져 들어가는 그 무리를 “anonymity set(익명 집합)“이라 부른다 — 같은 client-facing server를 공유하고 겉에서 보이는 TLS 동작이 동일한, 함께 놓인 서버들의 집합. 명세 자신의 표현으로, 이 메커니즘은 클라이언트가 특정 서비스 제공자에 연결한다는 것은 드러내되 집합 안 어느 서버가 연결을 종단하는지는 드러내지 않는다.
이 문장을 꼼꼼히 읽어야 한다. 당신의 프라이버시가 ECH의 속성이 아니라는 뜻이기 때문이다. 그건 군중의 속성이다. Cloudflare 엣지 뒤엔 수천만 사이트가 앉아 있어 “당신은 Cloudflare와 대화 중”은 관찰자에게 거의 아무것도 말하지 않는다 — 익명 집합이 거대하고 당신의 진짜 목적지는 대륙만 한 건초더미 속 바늘 하나다. 하지만 흥미로운 웹사이트 딱 하나를 앞세운 작은 호스트에 ECH를 겨누면, 바깥 이름은 안쪽 이름이나 마찬가지다. 숨을 군중이 없다. 열어둔 문으로 같은 정보를 드러내려고 SNI를 암호화한 꼴이다. ECH는 망토를 준다. 그 망토가 천막인지 냅킨인지는 익명 집합이 정한다.
그래서 ECH는 실무에선 대형 제공자 기능이다. 소수의 CDN이 각자 웹의 엄청난 몫을 종단하기에 작동하고, 그 규모가 숨김을 진짜로 만든다. 효과가 인터넷을 서너 회사 뒤로 더 중앙집중화하는 데 달린 프라이버시 기술이라는 게 살짝 불편하다면 — 좋다. 그래야 한다. 그 긴장은 설계에 박혀 있다.
ECH가 건드리지 않는 세 개의 누출
SNI 암호화는 채널 하나를 닫는다. 나머지 셋은 활짝 열린 채이고, 그것들까지 닫지 않으면 ECH는 연극이다.
당신의 목적지 IP. 어쨌든 패킷을 어딘가로 보내야 하고, 그 어딘가는 모든 패킷에 평문으로 적힌 주소다. 제공자가 수많은 이름을 같은 IP로 서빙하는 거대 anycast CDN이면 주소는 바깥 SNI만큼 모호해 괜찮다. 하지만 사이트가 전용 IP를 갖는 순간 — 많은 사이트가 그렇다 — 그 IP는 ECH가 방금 암호화한 목적지를 다시 식별해버린다. 주소는 ECH가 구조적으로 막을 수 없는 누출이다, 네트워크가 곧 주소이니까.
당신의 DNS 조회. ECH 키를 얻으려고 당신은 사이트의 HTTPS 레코드를 — 진짜 이름으로 — DNS에 조회했다. 그 조회가 평범한 DNS처럼 평문으로 나갔다면, 당신은 정성껏 숨긴 핸드셰이크 한 걸음 앞에서 목적지를 네트워크에 알린 것이다. 암호화 안 된 DNS 위의 ECH는 잠긴 현관문 옆의 열린 창문이다. 그래서 Firefox는 원래 DNS-over-HTTPS가 켜져야만 ECH를 시도했다. Firefox 129부터야 OS 리졸버로 폴백하는데, 그건 프라이버시 승리가 아니라 편의 절충이다. 이 글에서 실무적으로 하나만 챙긴다면: 암호화된 DNS 없는 ECH는 거의 무의미하다.
트래픽 분석. 패킷 크기, 타이밍, 세션의 리듬은 어떤 것도 암호화하지 않고, 끈질긴 관찰자는 트래픽 모양만으로 당신이 어느 사이트에 있는지 종종 지문화할 수 있다. ECH는 애초에 이걸 다루려 하지도 않았고 그런 척도 안 한다. “암호화됨”과 “관찰 불가”는 다른 단어라는 걸 상기시킨다.
실어 나를 수 있게 만든 엔지니어링
두 디테일은 감탄할 만하다. ESNI는 못 했는데 ECH는 실렸던 이유이기 때문이다.
첫째, 브라우저는 ECH를 쓰지 않을 때도 보낸다. Firefox는 사이트의 ECH 지원 여부와 무관하게 사실상 모든 TLS·QUIC 연결에서 GREASE ECH 확장 — 무작위이고, 무의미하고, 진짜와 구별 불가한 — 을 내보낸다. TLS를 확장 가능하게 유지하는 바로 그 GREASE 수법을 다른 표적에 겨눈 것이다: ECH를 쓰는 사람만 ECH를 보내면 보내는 행위 자체가 표식이 되고, 검열자는 표시된 연결을 차단하면 된다. 모두가 보내면 쓰는 데 대가가 없고 차단은 곧 전부 차단을 뜻한다. 또 익명 집합이다, 한 겹 아래에서.
둘째, 재시도. ESNI의 치명상은 낡은 키였다: DNS가 ECH 구성을 캐시하고, 키는 회전하며, 어제 키로 나타난 클라이언트는 그냥 막혔다. ECH는 retry_configs로 고친다 — 서버가 안쪽 hello를 복호화 못 하면 이미 맺어진 연결로 새 키를 되돌려주고, 클라이언트는 투명하게 다시 시도한다. 선행 기술을 못 쓰게 만든 실패 모드가 스스로 낫는 왕복 한 번이 됐다. 영리한 아이디어와 실어 나를 수 있는 아이디어의 차이다.
실제로 옮기는 것
ECH는 TLS 핸드셰이크의 마지막 평문 식별자이고, 그걸 닫는 건 진짜 할 만한 일이다. 자물쇠가 조용히 당신의 브라우징을 회선 위 모든 상자에 중계하던 시대를 끝낸다. 켜라.
하지만 무엇을 사는지는 정확히 하자. ECH는 프라이버시 경계를 “어느 사이트”에서 “어느 제공자”로 옮기고, 세 가지가 함께 맞을 때만 그만큼 옮긴다: 조회가 새지 않게 하는 암호화된 DNS, 주소가 재식별하지 않게 하는 공유 IP, 줄서기가 아니라 군중이 될 만큼 큰 익명 집합. 하나라도 놓치면 당신은 필드를 암호화하면서 그 내용을 바로 옆 구멍으로 방송한 것이다. 셋을 다 얻으면 “아무도 당신이 어디 가는지 모른다”보다 좁은 것을 이룬 것이다 — “네트워크는 당신이 Cloudflare를 쓴다는 건 알지만, Cloudflare의 수백만 사이트 중 어느 것을 뜻했는지는 쉽게 못 가려낸다.” 대다수 위협 모델에서 그건 진짜 개선이다. 투명 인간이 되는 건 아니고, 그걸 투명 인간으로 파는 사람은 익명 집합을 이해 못 했거나 당신이 이해 못 하길 노리는 것이다.