no-cacheとmust-revalidateの違い

no-cacheになるとはどういうことか。20文字以内で簡潔に説明せよ。
こりゃ難題!ちょっと待って時間止めて!
ナーナナナ(略

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

no-cacheとmust-revalidateの違いがよくわからない!!!

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

なるほど、分かった気がしたぞ!

結論

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か変更後のコンテンツが帰ってきて、有効期限が更新される)

まとめ

RFCを読めば分かります。(13文字)

カテゴリー HTTP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です