背景: ETag 追跡については、こちらで詳しく説明されており、ウィキペディアでも言及されています。
「ETagによる追跡を防ぐにはどうすればよいですか?」 への回答に書いた回答です。この質問を書くように私を駆り立てました。
ETag 追跡を防止するブラウザー側のソリューションがあります。現在の HTTP プロトコルを変更せずに機能します。これは ETag 追跡の実行可能なソリューションですか?
サーバーに ETag を伝える代わりに、その ETag についてサーバーに質問し、それを既に持っているものと比較します。
擬似コード:
If (file_not_in_cache)
{
page=http_get_request();
page.display();
page.put_in_cache();
}
else
{
page=load_from_cache();
client_etag=page.extract_etag();
server_etag=http_HEAD_request().extract_etag();
//Instead of saying "my etag is xyz",
//the client says: "what is YOUR etag, server?"
if (server_etag==client_etag)
{
page.display();
}
else
{
page.remove_from_cache();
page=http_get_request();
page.display();
page.put_in_cache();
}
}
私のソリューションでの HTTP 会話の例:
クライアント:
HEAD /posts/46328
host: security.stackexchange.com
サーバ:
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "EVIl_UNIQUE_TRACKING_ETAG"
Content-Type: text/html
Content-Length: 131
ケース 1、クライアントには同一の ETag があります。
Connection closes, client loads page from cache.
ケース 2、クライアントに不一致の ETag があります。
GET...... //and a normal http conversation begins.
HTTP 仕様の変更が必要なエクストラ
以下は理論上の資料と考えてください。HTTP 仕様はおそらくすぐには変更されないでしょう。
1. HEAD オーバーヘッドの除去
わずかなオーバーヘッドがあることに注意してください。サーバーは HTTP ヘッダーを 2 回送信する必要があります。1 回は HEAD への応答で、もう 1 回は GET への応答です。これに対する理論上の回避策の 1 つは、HTTP プロトコルを変更し、ヘッダーのないコンテンツを要求する新しいメソッドを追加することです。その後、ETag が一致しない場合、クライアントは HEAD のみを要求し、その後はコンテンツのみを要求します。
2. キャッシュ ベースの追跡を防止する (または、少なくとも追跡をより困難にする)
Sneftel によって提案された回避策は ETag 追跡技術ではありませんが、私が提案した「HEAD、GET」シーケンスを使用している場合でも人々を追跡します。解決策は、ETag の可能な値を制限することです。ETag は、任意のシーケンスではなく、コンテンツのチェックサムでなければなりません。クライアントはこれをチェックし、チェックサム値とサーバーから送信された値が一致しない場合、キャッシュは使用されません。
補足:修正 2 により、次のEvercookie追跡技術も排除されます: pngData、etagData、cacheData。これを Chrome の「ブラウザを終了するまでローカル データのみ保持する」と組み合わせると、Flash と Silverlight の Cookie を除くすべての evercookie 追跡技術が排除されます。