| インターネット技術標準化委員会 (IETF) | M. Nottingham |
| Request for Comments: 9211 | Fastly |
| カテゴリ: 標準化トラック | 2022年6月 |
| ISSN: 2070-1721 |
Cache-Status HTTPレスポンスヘッダーフィールド
概要
デバッグの補助として、HTTPキャッシュはしばしばレスポンスにヘッダーフィールドを付加し、リクエストをどのように処理したかをアドホックに説明します。本仕様は、HTTPのキャッシュモデルに合わせた標準的な方法を定義します。
この文書のステータス
これはインターネット標準化トラック文書です。
本書はインターネット技術標準化委員会(IETF)の成果物です。本書はIETFコミュニティの合意を表しています。公開のために一般レビューを経て、インターネット技術運営指導グループ(IESG)によって承認されています。インターネット標準に関する詳細はRFC 7841のセクション2を参照してください。
本書の現在のステータス、正誤情報、フィードバックの提供方法などは、https://www.rfc-editor.org/info/rfc9211で入手できます。
Copyright Notice
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.
1. はじめに
デバッグ(人間および自動ツールの双方を援助するため)を容易にするため、HTTP キャッシュはしばしばレスポンスにヘッダーフィールドを付加して、リクエストをどのように処理したかを説明します。しかしながら、これらのヘッダーフィールドの意味はしばしば不明瞭であり、使われる意味や構文は実装によって異なります。
本仕様はこの目的のために、新しい HTTP レスポンスヘッダーフィールド "Cache-Status" を標準化された構文とセマンティクスで定義します。
1.1. 記法上の規約
本書におけるキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY"、および "OPTIONAL" は、これらがすべて大文字で現れる場合に限り BCP 14 [RFC2119] および [RFC8174] に従って解釈されます。
本書では、構文とパースを指定するために Section 3 の用語(List、String、Token、Integer、Boolean)を使用します([STRUCTURED-FIELDS] を参照)。
また、本書では [HTTP] および [HTTP-CACHING] の用語を使用します。
2. Cache-Status HTTPレスポンスヘッダーフィールド
Cache-Status HTTP レスポンスヘッダーフィールドは、キャッシュがそのレスポンスおよび対応するリクエストをどのように処理したかを示します。このヘッダーフィールドの構文は [STRUCTURED-FIELDS] に準拠します。
その値は List です。List の各メンバーはリクエストを処理したキャッシュを表します。最初のメンバーはオリジンサーバーに最も近いキャッシュを表し、最後のメンバーはユーザーに最も近いキャッシュ(ユーザーエージェント自身のキャッシュが値を付加する場合を含む)を表します。
キャッシュはいつ Cache-Status ヘッダーフィールドをレスポンスに追加するかを決定します。すべてのレスポンスに追加するものもあれば、特定の設定時や、リクエストにデバッグモードを有効にするヘッダーフィールドが含まれる場合にのみ追加するものもあります。関連するセキュリティ上の考慮事項は セクション6 を参照してください。
中継者は、たとえキャッシュを含んでいても、自身がローカルで生成したレスポンスに Cache-Status メンバーを付加してはなりません(ただし生成されたレスポンスが保存済みレスポンスに基づく場合、例えば 304 (Not Modified) や 206 (Partial Content) のようなレスポンスは例外です)。例えば、プロキシが不正なリクエストにより 400 レスポンスを生成した場合、そのレスポンスはプロキシが生成したものでありオリジンに由来しないため、Cache-Status 値を追加しません。
Cache-Status ヘッダーフィールドに値を追加する際、キャッシュは既存のフィールド値を保持すべきです。これによりリクエストを処理したキャッシュチェーン全体のデバッグが可能になります。
各 List メンバーはそれを挿入したキャッシュを識別し、この識別子は String または Token でなければなりません。デプロイ環境によっては、製品名やサービス名(例: "ExampleCache" や "Example CDN")、ホスト名("cache-3.example.com")、IP アドレス、または生成された文字列が使われることがあります。
リストの各メンバーは、そのキャッシュがリクエストをどのように処理したかを説明するパラメータを持つことができます。これらのパラメータは任意ですが、キャッシュは可能な限り多くの情報を提供することが推奨されます。
本仕様では以下のパラメータを定義します。
2.1. hit パラメータ
"hit" の値は Boolean で、true の場合はリクエストがキャッシュによって満たされたこと、つまり転送されずレスポンスがキャッシュから取得されたことを示します。
オリジンで生成されたがキャッシュによって修正されたレスポンス(例えば 304 や 206 ステータスコード)は、検証のために転送されていない限り hit と見なされます。
キャッシュに存在したが転送を伴わないと使用できなかったレスポンス(例えば stale や partial の場合)は hit とは見なされません。ただしオリジンサーバーが利用不可であり転送せずに stale レスポンスを使用した場合は hit と見なすことができます。
"hit" と "fwd" は排他です。各リストメンバーにはどちらか一方のみが現れるべきです。
2.2. fwd パラメータ
"fwd" が存在する場合、それはリクエストがオリジンに向けて転送されたことを示し、その値は転送理由を示す Token です。
リクエストが転送された理由を説明するために、次のパラメータ値が定義されています(最も具体的なものから順に示します):
- bypass:
- このリクエストを処理しないようキャッシュが設定されていた。
- method:
- リクエストメソッドの意味により転送が必要であった。
- uri-miss:
- キャッシュにリクエスト URI に一致するレスポンスが存在しなかった。
- vary-miss:
- キャッシュにはリクエスト URI に一致するレスポンスがあったが、このリクエストのヘッダーフィールドと保存された Vary ヘッダーに基づいて選択できなかった。
- miss:
- キャッシュにこのリクエストを満たすために使用できるレスポンスが存在しなかった(実装が uri-miss と vary-miss を区別できない場合に使用)。
- request:
- キャッシュはそのリクエストに対して新鮮なレスポンスを選択できたが、リクエストの意味(例:Cache-Control リクエストディレクティブ)がその使用を許可しなかった。
- stale:
- キャッシュはリクエストに対するレスポンスを選択できたが、それは古かった。
- partial:
- キャッシュは部分的なレスポンスを選択できたが、要求された全レンジを含まなかった(またはリクエストが完全なレスポンスを要求していた)。
キャッシュが知る最も具体的な理由を可能な限り使用するべきです。関連事項は [HTTP-CACHING] および Section 4 を参照してください。
2.3. fwd-status パラメータ
"fwd-status" の値は Integer で、次ホップサーバーが転送されたリクエストに対して返したステータスコードを示します([HTTP]、Section 15 を参照)。fwd-status パラメータは fwd が存在する場合にのみ意味を持ちます。もし fwd が存在するが fwd-status が存在しない場合、レスポンスに送られたステータスコードがデフォルトとなります。
このパラメータは、次ホップサーバーが条件付きリクエストに対して 304 (Not Modified) を返した場合や、レンジリクエストにより 206 (Partial Content) を返した場合を区別するのに有用です。
2.4. ttl パラメータ
"ttl" の値は Integer で、キャッシュが計算したレスポンスの残りの新鮮さ有効期間(秒数)を示します([HTTP-CACHING]、Section 4.2.1 を参照)。この値は、レスポンスヘッダー部がキャッシュから送信される時点にできる限り近い時点で測定された秒数です。ヒューリスティクス、ローカル設定、その他の要因によってキャッシュが割り当てた新鮮さも含まれます(負の値は古さを示すことがあります)。
2.5. stored パラメータ
"stored" の値は Boolean で、キャッシュがそのレスポンスを保存したかどうかを示します([HTTP-CACHING]、Section 3 を参照)。true は保存したことを示します。stored パラメータは fwd が存在する場合にのみ意味を持ちます。
2.6. collapsed パラメータ
"collapsed" の値は Boolean で、このリクエストが一つ以上の他の転送リクエストとまとめられたかどうかを示します([HTTP-CACHING]、Section 4 を参照)。true の場合はレスポンスが再利用されたことを示し、false の場合は新しいリクエストが行われたことを示します。存在しない場合は他のリクエストとまとめられていないことを意味します。collapsed パラメータは fwd が存在する場合にのみ意味を持ちます。
2.7. key パラメータ
"key" の値は String で、レスポンスに使用されたキャッシュキーの表現を伝えます([HTTP-CACHING]、Section 2 を参照)。これは実装依存である場合があります。
2.8. detail パラメータ
"detail" の値は String または Token で、他のパラメータに含まれない追加情報(実装固有の状態やその他のキャッシュ関連メトリクスなど)を伝えるために使用されます。
例えば:
Cache-Status: ExampleCache; hit; detail=MEMORY
detail パラメータのセマンティクスは常にそれを送信したキャッシュ固有のものです。別のキャッシュからの detail パラメータが同じ値を持っていても、同じ意味であるとは限りません。
このパラメータは意図的に限定されています。開発者や運用者が相互運用可能な方法で追加情報を伝える必要がある場合は、拡張パラメータの登録(セクション4 を参照)を行うか、別のヘッダーフィールドを定義することが推奨されます。
3. 例
以下は最小限のキャッシュヒットの例です:
Cache-Status: ExampleCache; hit
より丁寧なキャッシュは追加情報も与えるでしょう。例えば:
Cache-Status: ExampleCache; hit; ttl=376
stale のヒットは負の新鮮さとして表されます。例えば:
Cache-Status: ExampleCache; hit; ttl=-412
一方、これは完全なミスの例です:
Cache-Status: ExampleCache; fwd=uri-miss
バックエンドサーバーで正常に検証されたミスの例:
Cache-Status: ExampleCache; fwd=stale; fwd-status=304
別のリクエストと collapse されたミスの例:
Cache-Status: ExampleCache; fwd=uri-miss; collapsed
キャッシュが collapse を試みたができなかった例:
Cache-Status: ExampleCache; fwd=uri-miss; collapsed=?0
以下は二層のキャッシュを通過した例です。オリジンに最も近いキャッシュが以前のリクエストに対して保存済みレスポンスで応答し、二番目のキャッシュがそのレスポンスを保存して後で現在のリクエストを満たすために再利用した場合:
Cache-Status: OriginCache; hit; ttl=1100,
"CDN Company Here"; hit; ttl=545
以下は三層のキャッシュシステムを通過した例です。オリジンに最も近いのはリバースプロキシ(キャッシュからレスポンスが提供された)、次はネットワークに介在するフォワードプロキシ(URI に一致するキャッシュがなく、リクエストが他のリクエストと collapse され、その結果のレスポンスが保存された)、ユーザーに最も近いのはブラウザキャッシュ(リクエストの URI に一致するレスポンスが存在しなかった)です:
Cache-Status: ReverseProxyCache; hit Cache-Status: ForwardProxyCache; fwd=uri-miss; collapsed; stored Cache-Status: BrowserCache; fwd=uri-miss
4. 新しい Cache-Status パラメータの定義
新しい Cache-Status パラメータは "HTTP Cache-Status" レジストリに登録することで定義できます。
登録申請は、RFC 8126 のガイドラインに従い、指定されたエキスパートによってレビューおよび承認されます([RFC8126]、Section 4.5 を参照)。仕様文書は望ましいが必須ではありません。
エキスパートは申請を評価する際に次の要素を検討すべきです:
- コミュニティのフィードバック
- 値が十分に定義されているかどうか
- 汎用的なパラメータはベンダー固有、アプリケーション固有、デプロイ固有の値よりも優先されます。もしコミュニティで汎用値が合意できない場合、パラメータ名は対応して特定的(例えばベンダーやアプリケーション、デプロイを識別するプレフィックスを付与)にするべきです。
登録申請は次のテンプレートを使用するべきです:
- Name:
- [Cache-Status パラメータのキー名; 構文要件については Section 3.1.2 を参照してください([STRUCTURED-FIELDS])]
- Type:
- [パラメータ値の Structured Type; Section 3.1.2 を参照([STRUCTURED-FIELDS])]
- Description:
- [パラメータの意味の説明]
- Reference:
- [利用可能ならばこのパラメータを定義する仕様への参照]
登録申請の送付先の詳細についてはレジストリ(<https://www.iana.org/assignments/http-cache-status>)を参照してください。
5. IANA に関する考慮事項
IANA は "HTTP Cache-Status" レジストリを <https://www.iana.org/assignments/http-cache-status> に作成し、本仕様のセクション2 で定義された型でそれを初期化しました。関連手続きについては セクション4 を参照してください。
IANA はまた、[HTTP] の定義する "Hypertext Transfer Protocol (HTTP) Field Name Registry" に次のエントリを追加しました(Section 18.4 を参照):
- Field name:
- Cache-Status
- Status:
- permanent
- Reference:
- RFC 9211
6. セキュリティに関する考慮事項
攻撃者は Cache-Status に含まれる情報を用いてキャッシュ(および他の構成要素)の挙動を探り、キャッシュを利用する者の活動を推測することができます。Cache-Status ヘッダーフィールド自体がこれらのリスクを新たに生み出すとは限りませんが、攻撃者がこれらのリスクを悪用するのに役立ち得ます。
例えば、キャッシュがレスポンスを保存しているかどうかを知ることで、攻撃者がセンシティブなデータに対するタイミング攻撃を行うのを助ける可能性があります。
さらに、キャッシュキーを公開すると攻撃者がキャッシュキーの変更点を把握でき、キャッシュポイズニング攻撃を助長する可能性があります。詳細は [ENTANGLE] を参照してください。
これらの基礎的なリスクは、暗号化や認証の使用、攻撃者制御下のデータをキャッシュキーに含めないなど、具体的な状況に応じた様々な技術で軽減できます。キーを単に難読化するだけではこのリスクは軽減されない点に注意してください。
このような攻撃の助長を避けるため、Cache-Status ヘッダーフィールドは省略する、クライアントが受け取る権限を持つ場合にのみ送る、あるいは key パラメータなどの機密情報はクライアントが認可されている場合にのみ送る、という対策が考えられます。
7. 参考文献
7.1. 規範的参考文献
- [HTTP]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Semantics”, STD 97, RFC 9110, DOI 10.17487/RFC9110, 2022年6月, <https://www.rfc-editor.org/info/rfc9110>.
- [HTTP-CACHING]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Caching”, STD 98, RFC 9111, DOI 10.17487/RFC9111, 2022年6月, <https://www.rfc-editor.org/info/rfc9111>.
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, 1997年3月, <https://www.rfc-editor.org/info/rfc2119>.
- [RFC8126]
- Cotton, M., Leiba, B., and T. Narten, “Guidelines for Writing an IANA Considerations Section in RFCs”, BCP 26, RFC 8126, 2017年6月, <https://www.rfc-editor.org/info/rfc8126>.
- [RFC8174]
- Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, 2017年5月, <https://www.rfc-editor.org/info/rfc8174>.
- [STRUCTURED-FIELDS]
- Nottingham, M. and P-H. Kamp, “Structured Field Values for HTTP”, RFC 8941, 2021年2月, <https://www.rfc-editor.org/info/rfc8941>.
7.2. 参考情報
- [ENTANGLE]
- Kettle, J., “Web Cache Entanglement: Novel Pathways to Poisoning”, 2020年9月, <https://portswigger.net/research/web-cache-entanglement>.