암호화된 클라이언트 헬로

Encrypted Client Hello

TLS 핸드셰이크에서 실제 접속 대상 이름을 암호화된 안쪽 메시지에 넣습니다.

···
html
<div class="n-demo"><div class="n-head"><strong>CLIENT HELLO VISIBILITY</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="ech"><div class="ech-row"><span>PLAIN</span><div class="n-box mono">SNI: private.test</div><b>VISIBLE</b></div><div class="ech-row"><span>ECH</span><div id="ech-inner" class="n-box mono">inner: private.test</div><b id="ech-view">SEALED</b></div></div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.ech{width:96%;display:grid;gap:12px}.ech-row{display:grid;grid-template-columns:47px 1fr 58px;align-items:center;gap:5px}.ech-row span,.ech-row b{font-size:12px}.ech-row b{color:var(--accent-3)}.ech-row .n-box{text-align:left;min-width:0;padding:8px 5px}.ech-row:last-child b{color:var(--accent)}
js
let sealed=true;function advance(){sealed=!sealed;document.getElementById('ech-inner').textContent=sealed?'outer: public.test / inner: [sealed]':'inner: private.test';document.getElementById('ech-inner').classList.toggle('n-on',sealed);document.getElementById('ech-view').textContent=sealed?'SEALED':'BEFORE'}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

TLS ECH는 ClientHello의 민감한 부분을 암호화합니다. 서버 이름 같은 값은 안쪽 ClientHello에 넣고, 네트워크 관찰자에게는 바깥쪽 메시지만 보이게 합니다.

데모는 ECH를 쓰지 않은 평문 이름과 ECH 사용 시 가려진 이름을 나란히 비교합니다. 바깥 정보와 트래픽 메타데이터가 모두 사라지는 것은 아니며, 서버와 DNS의 ECH 설정이 필요합니다.

언제 쓰나

TLS 연결 시작 단계의 접속 대상 노출을 줄이려는 서비스에서 배포 조건과 프라이버시 범위를 검토합니다.

페이지로 열기 ↗