特定のユーザーだけが見ることができる大きなJSONドキュメントがあり、それはめったに変更されないが、それが変更された場合、ユーザーは変更が非常に迅速に表示されることを期待しているとします。これにはetagsを使用するのが理にかなっています。変更されていない場合は、ネットワーク経由で転送されているドキュメント全体を保存し、変更されている場合はドキュメントを送信します。
1つのリスクは、複数のユーザーが同じブラウザウィンドウを使用する場合に発生するようです。
ボブはすでにアリスのブラウザインスタンスを使用しているので、彼はすでにキャッシュにあるものを見ることができ、したがってとにかくデータを読み取ることができたと思います。
機密情報にetag(または一般にブラウザキャッシング)を使用する安全な方法はないようです。JavaScriptを使用してメモリにデータを保存するだけです。それとも、使用するための特定の方法がないのですか?
サーバーが適切に実装されている場合、etagだけを知っていても、秘密のリソースを取得するのに役立ちません。ブラウザは、etagが有効かどうかをサーバーに確認します(If-None-Match
ヘッダーを使用)。
アリスがリクエストを行うと、アリスは認証されるため、サーバーは304 Not Modified
で応答し、キャッシュからリソースをロードするようブラウザに指示する必要があります。
しかし、ボブがリクエストを行うとき、彼は認証されていないため、サーバーは403 Forbidden
で応答する必要があります。その後、ブラウザはキャッシュから何もロードしません(そして、BobがAliceとは異なるブラウザを使用している場合は、ロードするものは何もありません)。
これらすべては、Cache-Control
がno-cache
(または存在しない)に設定されているという前提に基づいています。そうでない場合、ブラウザはサーバーに確認せずにキャッシュからリソースを直接ロードします。ボブとアリスが同じブラウザを使用している場合、ボブは認証されていなくても、ページのアリスバージョンを取得します。
ご指摘のとおり、etagを盗むだけでなく、Bobはキャッシュから実際のリソースを盗むだけです。
最新のブラウザは、これをさまざまな方法で保護します。 AliceとBobが同じOSユーザーを使用しているか、Bobがrootまたはadmin(OSによって異なる)でない限り、これはエクスプロイトを利用しないと実行できません。
それでも、リソースが非常に機密性が高く、信頼できない人と共有されているコンピューターでユーザーがリソースにアクセスすることが予想される場合は、Cache-Control: no-store
を設定してすべてのキャッシュを無効にすることを検討する必要があります。