そもそも、Cache-Controlヘッダとは?
Cache-Controlヘッダは、ブラウザやCDN等のプロキシサーバなどに対して、コンテンツをどのようにキャッシュするかの指示を与えるためのHTTPヘッダです。
ブラウザ、CDN、プロキシサーバなどに「このデータはどのくらい保存していいか」「いつ再取得すべきか」などのルールを伝える役割を持ちます。
これにより、Webアプリの高速化、セキュリティ、サーバ負荷軽減を期待できます。
ただし、キャッシュを禁止すべきケースもあります。
例えば、ログイン後のマイページなどのキャッシュがCDN等に残存していた場合は、誤って他ユーザーに表示されるリスクがあります。
このようなケースではキャッシュを残さないように設定する必要があります。
基本構文
Cache-Controlヘッダは下記のように記載します。
Cache-Control: ディレクティブA, ディレクティブB, ...
具体例として、下記のように記載します。
Cache-Control: no-cache, no-store, must-revalidate
主なディレクティブ
ディレクティブ名 | 説明 |
---|---|
no-cache |
キャッシュされた内容の使用前に、必ずサーバーへ確認を要求する |
no-store |
コンテンツをキャッシュに格納しない |
must-revalidate |
有効期限切れのキャッシュを利用する場合は必ずオリジンに問い合わせを行う |
public |
共有キャッシュ(プロキシなど)による保存を許可 |
private |
ローカルへのキャッシュ格納のみ許可(共有キャッシュ禁止) |
max-age=秒数 |
キャッシュの有効期限(秒単位) |
s-maxage=秒数 |
CDNやプロキシ用の max-age 指定(max-age より優先) |
immutable |
リソースが絶対に変わらないことを示す(再検証不要) |
キャッシュを防ぐにはどうすべきか?
上記記載を踏まえ、HTTPヘッダを設定する際にキャッシュを防ぐにはどうすべきなのか考えてみました。
結果、no-store
があれば最低限のキャッシュによるセキュリティ対策は考慮されているものの、各CDNやProxy上でのディレクティブの解釈や仕様のブレが発生します。
この場合、no-store
のみでは不十分な可能性があるため、private, no-cache, no-store, must-revalidate
の4つを指定すること必要があるようです。
このため、キャッシュをどうしても禁止したい、防ぎたい場合には、private, no-cache, no-store, must-revalidate
の4つを指定して、キャッシュをProxy上に残さない設定を忘れないようにしましょう。