(2024/11/11) ありがたいことに結構読まれているみたいなので、若干改訂した。
Cache-Control: no-cache
HTTPヘッダの一種であり、クライアントやプロキシサーバないしキャッシュサーバによるキャッシュの扱いを制御するものである。
レスポンスを保存してはいけない(キャッシュしてはいけない)ことを意味するのはno-cacheではなくno-storeであることはそこそこ有名らしいが、no-cacheについてはいまいち分かりづらい。
IPAの回答
そこのところどうお考えですか、IPAさん。
Cache-Control: no-cache
一見「キャッシュを使うな」のように見えるこのヘッダが実際に意味するところは少々ニュアンスが異なる。このヘッダの意味は、いちどキャッシュに記録されたコンテンツは、現在でも有効か否かを本来のWebサーバに問い合わせて確認がとれない限り再利用してはならない、という意味である。
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html
Cache-Control: must-revalidate
このヘッダは、キャッシュに記録されているコンテンツが現在も有効であるか否かをWebサーバに必ず問い合わせよ、という指示である。
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html
いまいちわかりづらい。
MDNの回答
やっぱりWebのことはMDNに聞くのが一番だよね
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control
no-cache
キャッシュコピーを破棄する前に、検証のためにキャッシュが元のサーバーへリクエストを送ることを強制します。
当時の私にはこれでも理解できなかった
RFCの回答
5.2.2.1. must-revalidate
The “must-revalidate” response directive indicates that once it has become stale, a cache MUST NOT use the response to satisfy subsequent requests without successful validation on the origin server.
https://tools.ietf.org/html/rfc7234#section-5.2.2.1
5.2.2.2. no-cache
(中略)
https://tools.ietf.org/html/rfc7234#section-5.2.2.2
The “no-cache” response directive indicates that the response MUST NOT be used to satisfy a subsequent request without successful validation on the origin server. This allows an origin server to prevent a cache from using it to satisfy a request without contacting it, even by caches that have been configured to send stale responses.
must-revalidate
はstale(≒有効期限切れ)になったときの話しかしていないが、no-cache
は限定をしていないため、有効期間中の取り扱いに違いがあることがわかる。
結論
2つの違いを簡単に考えるためにフローで示す。
また、クライアント-キャッシュサーバ-オリジンサーバの三段構成で考える。
no-cache
- クライアントがリクエストする
- キャッシュサーバがリクエストをオリジンサーバにフォワードする
- オリジンサーバからレスポンスが返る(Cache-Control: no-cache)
- キャッシュサーバはレスポンスを保存した上でクライアントに送る
- クライアントがまたリクエストする
- コンテンツがキャッシュサーバに残っていて有効期限内でも、必ずオリジンサーバに問い合わせる
- オリジンサーバから304 (Not Modified) か、変更後のコンテンツが返ってくる
- キャッシュサーバは最新のコンテンツをクライアントに送る
must-revalidate
- クライアントがリクエストする
- キャッシュサーバがリクエストをオリジンサーバにフォワードする
- オリジンサーバからレスポンスが返る(Cache-Control: must-revalidate)
- キャッシュサーバはレスポンスを保存した上でクライアントに送る
- クライアントがまたリクエストする
- キャッシュサーバの動作は、コンテンツの有効期限によって変わる
- コンテンツが有効期限内の時は、すでに保存されたコンテンツを返す
(オリジンサーバへのトラフィックが発生しない) - 有効期限が切れている場合は、オリジンサーバに問い合わせる
(304か変更後のコンテンツが帰ってきて、有効期限が更新される)
- コンテンツが有効期限内の時は、すでに保存されたコンテンツを返す
コメント