-
Notifications
You must be signed in to change notification settings - Fork 0
MS_HTTPCacheControlHeaders
-
TOP > インフラストラクチャ > HTTPヘッダ
- キャッシュ・コントロールのHTTPヘッダ
- Cookie
- セキュリティ強化のHTTPヘッダ
キャッシュ・コントロールの HTTP ヘッダについて。
- HTTP/1.1 では、
Cache-Controlヘッダを使用する。 - HTTP/1.0 では、
Pragma: no-cacheヘッダを使用する。
| ディレクティブ | 意味 |
|---|---|
Cache-Control: no-store |
どのキャッシュもレスポンスを保存してはイケナイ。 |
Cache-Control: no-cache |
キャッシュをしてもいいが、キャッシュを使用する際、検証を行う。 |
Cache-Control: public |
どのキャッシュでもレスポンスを保存できる。通常はキャッシュできないページ(HTTP 認証、200 OK 以外)をキャッシュする時に指定。 |
Cache-Control: private |
ブラウザのプライベート キャッシュにのみ保存できる。 |
補足: 名前に反して
no-cacheは「キャッシュしない」ではない。 「保存はするが、使う前に必ずサーバへ検証をかける」という意味である。 本当に保存させたくないならno-storeを使う。機密情報を含むページでは、以下のように併記するのが定石である。
Cache-Control: no-store, no-cache, must-revalidate, private Pragma: no-cache
| ディレクティブ | 意味 |
|---|---|
Cache-Control: max-age=XXX |
有効期限を設定する(秒)。 |
Cache-Control: must-revalidate |
有効期限切れ後は、必ず再検証してから使用する。 |
サーバーが strong validator または weak validator を提供していれば実行できる。
リロード ボタンを押した場合、再検証が行われる。
must-revalidate が指定されている場合、
(鮮度切れ後に)再検証が行われる。
後述の If-None-Match / If-Modified-Since を使用する。
鮮度の寿命をむかえた場合も、検証リクエストが行われる。
鮮度の判定は以下の優先順で行われる。
-
max-age=XXXヘッダ … 最優先。 -
Expiresヘッダ … 次いで優先される。
鮮度 =Expires−Date -
Last-Modifiedヘッダ … 次いで優先される(ヒューリスティック)。
鮮度 ≒ (Date−Last-Modified) / 10
補足: 共有キャッシュ(CDN・リバース プロキシ)では
s-maxageがmax-ageより優先される。 つまり優先順位はs-maxage(共有キャッシュのみ)>max-age>Expires> ヒューリスティック、となる。
キャッシュ機能に関するディレクティブ。
- Request
Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: only-if-cached
- Response
Cache-Control: must-revalidate
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: public
Cache-Control: private
Cache-Control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-Control: s-maxage=<seconds>
補足(最新化): 近年は以下のディレクティブも利用される。
ディレクティブ 意味 immutable鮮度期間中はリロードでも再検証しない(ハッシュ付き静的ファイル向け) stale-while-revalidate=<秒>期限切れ後、裏で再検証しつつ古い応答を返す stale-if-error=<秒>オリジンがエラーの場合に古い応答を返す
| ヘッダ | 意味 |
|---|---|
Age |
プロキシーのキャッシュに入ってからの経過時間(秒) |
Expires |
レスポンスが陳腐化すると考えられる日時を表す。 |
Pragma: no-cache |
Cache-Control ヘッダが未実装である HTTP/1.0 キャッシュとの後方互換性 |
Clear-Site-Data |
サイトの閲覧データ(クッキー、ストレージ、キャッシュ等)を消去 |
Warning |
起こりうる問題に関する一般警告情報 |
補足(最新化):
Warningヘッダは HTTP セマンティクスの改訂(RFC 9111)で廃止された。 新規実装で使用してはならない。
- 一意な文字列であり、リソースのバージョンを識別する。
-
If-MatchやIf-None-Matchで、この値を使用する。
メッセージを生成した日時を表す。
- リソースが最後に変更された日時を表す。
-
If-Unmodified-SinceやIf-Modified-Sinceで、この値を使用する。
※ ETag より正確さは低いが、環境によっては計算が容易。
- 指定したヘッダの内容ごとにキャッシュを分ける必要があることを伝える。
-
Vary: User-Agentで、User-Agent 毎に別のキャッシュを作るなどできる。
補足:
Varyの指定漏れは、 別ユーザ向けのコンテンツを共有キャッシュが配ってしまうという 深刻な情報漏洩につながる(キャッシュ ポイズニングの一種)。 認証状態で内容が変わる応答にはCache-Control: privateを付けるか、Vary: Authorization, Cookieを明示する。
- strong validator
- 保存されたリソースが指定した
ETagのいずれにも一致しない場合に、
リソース本体が返される(一致すれば304 Not Modified)。
- weak validator
- エンティティが指定した日時より後に変更されている場合に、
リソース本体が返される(変更がなければ304 Not Modified)。
補足: 両方を送った場合、サーバは
If-None-Matchを優先する (RFC 9110)。日時は秒精度しかないため、 1 秒以内の更新を検出できないのがIf-Modified-Sinceの弱点である。
Tags: IT国際標準, 通信技術, IIS, .NET開発, .NET Core, ASP.NET, ASP.NET MVC
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。