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 を真のゼロ知識システムにしています。