1. ホーム
  2. http

[解決済み】no-cacheとmust-revalidateの違いについて

2022-04-11 04:13:20

質問

RFC2616より

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

ノーキャッシュ

no-cache ディレクティブがフィールド名を指定しない場合、キャッシュは のない限り、後続のリクエストを満たすためにその応答を使ってはならない(MUST NOT)。 オリジンサーバでの再確認が成功した場合。これにより、オリジン するように設定されているキャッシュでも、キャッシュされないようにすることができます。 は、クライアントのリクエストに対して古くなった応答を返します。

そのため、エージェントに再バリデーションを指示します。 すべて のレスポンスになります。

これと比較すると

マスト・リバリデート

受信したレスポンスに must-revalidate ディレクティブが存在する場合 キャッシュは、そのエントリーが古くなった後、そのエントリーを使用してはならない(MUST NOT)。 で再検証することなく、後続のリクエストに応答しています。 オリジンサーバー

そのため、エージェントに再認証を指示します。 古い のレスポンスになります。

特に no-cache ユーザーエージェントがこのディレクティブを実際に、経験的にどのように扱っているか?

のポイントは何でしょうか? no-cache があれば must-revalidatemax-age ?

こちらのコメントをご覧ください。

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

ノーキャッシュ

このディレクティブは、ブラウザに対して、以下のことを指示するように聞こえます。 をキャッシュしていますが、微妙な違いがあります。no-cache" ディレクティブは RFCによると、ブラウザに「再検証を行うべき」と伝えています。 キャッシュからページを提供する前に、サーバーの 再認証は アプリケーションが帯域を節約するための巧妙なテクニックです。もし ブラウザがキャッシュしているページが変更されていない場合、サーバーは単に をブラウザに伝え、キャッシュからページを表示する。したがって ブラウザは(少なくとも理論的には)、ページをキャッシュに保存しますが サーバーと再認識した後に表示されます。実際には、IE とFirefoxは、no-cacheディレクティブをあたかも ページをキャッシュしないように指示する。私たちは この挙動は、1年ほど前から見られるようになりました。私たちは、この変化が このディレクティブが広く(そして正しくなく)使用されていることが原因です。 キャッシュを行わないようにする。

この件に関して何か公式な情報をお持ちの方はいらっしゃいますか?

更新情報

must-revalidate ディレクティブは、表現上のリクエストの検証に失敗した場合、 例えば黙って実行されない金融取引のような不正な操作につながる場合にのみ、 サーバーが使用すべきものです。

それは今まで心に留めていなかったことです。RFCは、must-revalidateを軽々しく使うなと言っているのです。Webサービスでは、未知のクライアントアプリに対して否定的な見方をし、最悪の事態を想定しなければならないということです。古くなったリソースは問題を引き起こす可能性があるのです。

それと、今考えたのですが、Last-ModifiedやETagsがないと、ブラウザはリソース全体を再度取得するしかありません。しかし、ETagsを使用すると、少なくともChromeはリクエストごとに再検証を行うようです。というのも、リクエストに他のヘッダが含まれていて、それが「常に再検証」を引き起こすのでなければ、適切に再検証することができないからです。

最後のポイントをはっきりさせたいんです。単に must-revalidate を含むが、ETag や Last-Modified を含まない場合、エージェントはコンテンツを再取得するだけで、比較するためにサーバに送信するものがないため、再取得できない。

しかし、私の経験的なテストによると、ETag や modified ヘッダデータがレスポンスに含まれる場合、エージェントは常に再バリデーションを行います。 must-revalidate ヘッダがあります。

ということで、ポイントは must-revalidate は、キャッシュが古くなったときに強制的に「バイパスキャッシュ」を行うもので、これはライフタイム/年齢を設定したときにのみ発生するため、もし must-revalidate が年齢や他のヘッダのないレスポンスに設定されると、実質的に no-cache というのも、このレスポンスは即座に古いと判断されるからです。

-- というわけで、ついにギリさんの回答に印をつけることにします!(笑)。

解決方法は?

私は、次のように考えています。 must-revalidate という意味です。

キャッシュが失効したら、古い応答をユーザーに返すことを拒否する。 が、たとえ「古いレスポンスは許容できる」と言われても。

ここで no-cache を意味する。

must-revalidate それに、すぐにレスポンスが古くなることも。

レスポンスが10秒間キャッシュ可能であれば must-revalidate は10秒後にキックされるのに対し no-cache を意味します。 must-revalidate を0秒後に実行します。

少なくとも、私の解釈ではそうです。