no-cacheとmust-revalidateの違い

(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に聞くのが一番だよね

no-cache
キャッシュコピーを破棄する前に、検証のためにキャッシュが元のサーバーへリクエストを送ることを強制します。

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cache-Control

当時の私にはこれでも理解できなかった

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

(中略)
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.

https://tools.ietf.org/html/rfc7234#section-5.2.2.2

must-revalidateはstale(≒有効期限切れ)になったときの話しかしていないが、no-cacheは限定をしていないため、有効期間中の取り扱いに違いがあることがわかる。

結論

2つの違いを簡単に考えるためにフローで示す。
また、クライアント-キャッシュサーバ-オリジンサーバの三段構成で考える。

no-cache

  1. クライアントがリクエストする
  2. キャッシュサーバがリクエストをオリジンサーバにフォワードする
  3. オリジンサーバからレスポンスが返る(Cache-Control: no-cache
  4. キャッシュサーバはレスポンスを保存した上でクライアントに送る
  5. クライアントがまたリクエストする
  6. コンテンツがキャッシュサーバに残っていて有効期限内でも、必ずオリジンサーバに問い合わせる
  7. オリジンサーバから304 (Not Modified) か、変更後のコンテンツが返ってくる
  8. キャッシュサーバは最新のコンテンツをクライアントに送る

must-revalidate

  1. クライアントがリクエストする
  2. キャッシュサーバがリクエストをオリジンサーバにフォワードする
  3. オリジンサーバからレスポンスが返る(Cache-Control: must-revalidate
  4. キャッシュサーバはレスポンスを保存した上でクライアントに送る
  5. クライアントがまたリクエストする
  6. キャッシュサーバの動作は、コンテンツの有効期限によって変わる
    • コンテンツが有効期限内の時は、すでに保存されたコンテンツを返す
      (オリジンサーバへのトラフィックが発生しない)
    • 有効期限が切れている場合は、オリジンサーバに問い合わせる
      (304か変更後のコンテンツが帰ってきて、有効期限が更新される)

コメント

タイトルとURLをコピーしました