URL 프래그먼트이란 무엇인가요?
URL 프래그먼트는 해시 기호(#) 뒤에 나타나는 URL 부분이다. RFC 3986에 따라 브라우저는 프래그먼트를 클라이언트 측에서만 처리하며 서버로 보내는 HTTP 요청에는 절대 포함하지 않는다.
URL은 정의된 구조를 갖는다: 스킴, 권한, 경로, 쿼리 문자열, 프래그먼트. 프래그먼트(# 뒤의 모든 것)는 원래 페이지 내 특정 섹션으로 이동하기 위해 설계됐다. 그러나 보안 관점에서 가장 중요한 속성은 HTTP 명세에 의해 브라우저가 프래그먼트를 서버에 절대 전송하지 말도록 명시적으로 요구된다는 것이다.
example.com/page#section 같은 URL을 방문하면 브라우저는 example.com/page에 대한 요청을 전송한다. #section 부분은 요청 전에 제거된다. 프래그먼트는 브라우저 주소 표시줄에 남아 페이지에서 실행되는 JavaScript가 접근할 수 있지만 서버는 알 수 없다. 이 동작은 HTTP 명세에 의해 규정되며 모든 현대 브라우저에서 일관되게 적용된다.
이 속성은 URL 프래그먼트를 웹 애플리케이션에서 민감한 데이터를 전달하는 데 특히 유용하게 만든다. 암호화 키나 다른 비밀을 프래그먼트에 넣으면 복호화에 필요한 클라이언트 측 JavaScript가 접근할 수 있지만, 서버로 전송되거나 프록시가 기록하거나 서버 접근 로그에 기록되지 않는다.
See the fragment vanish in transit
Edit the part after # and watch the server log update. The fragment never appears in the HTTP request line.
https://www.vaulted.fyi/s/aBc123#b9pK4mNxQ_2L7eRfA3vTcU1xY8zB6jH9wM0nP5qS4iE
GET /s/aBc123 HTTP/1.1 Host: www.vaulted.fyi User-Agent: Mozilla/5.0 ...
Per RFC 3986 §3.5, browsers strip everything after # before issuing the HTTP request. The fragment stays in the address bar, accessible only to JavaScript on the loaded page — never logged, never proxied, never cached by the server.
Vaulted가 URL 프래그먼트을 사용하는 방법
Vaulted는 AES-256-GCM 암호화 키를 URL 프래그먼트에 직접 배치한다. 비밀을 생성하면 생성된 링크는 /s/{id}#{base64url(key)} 형식이다. 브라우저는 HTTP 요청에 프래그먼트를 포함하지 않으므로 암호화 키는 Vaulted 서버에 도달하지 않는다. 수신자의 브라우저가 프래그먼트에서 키를 추출하고 서버에서 암호화된 데이터를 가져와 로컬에서 복호화를 수행한다. 이 단일 아키텍처 결정이 Vaulted를 진정한 제로 지식 시스템으로 만든다.