| インターネット技術標準化委員会 (IETF) | S. Ludin |
| Request for Comments: 9213 | Akamai |
| カテゴリ: 標準化トラック | M. Nottingham |
| ISSN: 2070-1721 | Fastly |
| Y. Wu | |
| Cloudflare | |
| 2022年6月 |
Targeted HTTP Cache Control
概要
本仕様は、キャッシュ指令を特定のキャッシュまたはキャッシュのクラスにターゲットすることを可能にする HTTP レスポンスヘッダーフィールドの慣習を定義します。また、そのようなヘッダーフィールドの一つである CDN-Cache-Control レスポンスヘッダーフィールドを定義しており、これはコンテンツ配信ネットワーク (CDN) キャッシュを対象とします。
この文書のステータス
これはインターネット標準化トラック文書です。
本書はインターネット技術標準化委員会(IETF)の成果物です。本書は IETF コミュニティの合意を表しています。公開のために一般レビューを経て、インターネット技術運営指導グループ(IESG)によって承認されています。インターネット標準に関する詳細は RFC 7841 のセクション2 を参照してください。
本書の現在のステータス、正誤情報、フィードバックの提供方法などは https://www.rfc-editor.org/info/rfc9213 で入手できます。
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 展開では複数のキャッシュ層を用いることが多くあります。例えば、ウェブサイトはオリジンサーバ自身にキャッシュを持つことがあり、オリジンと同じネットワーク内にキャッシュ層を配備したり、インターネット全体に分散した1つ以上の CDN を利用したり、さらにブラウザのキャッシュからの恩恵を受けることもあります。
これら異なるクラスのキャッシュを個別に制御したい場合が多いため、それらをターゲットにしたキャッシュ指示を指定する手段が必要になります。例えば、発行者が特定の関係にあるキャッシュ(CDN キャッシュなど)の内容を無効化する仕組みを持っている場合、そのキャッシュにはより寛容なキャッシュポリシーを割り当てつつ、他のキャッシュの挙動は制限したいといった要望が生じます。
HTTP の Cache-Control 応答ヘッダーフィールド(Section 5.2 of [HTTP-CACHING])はキャッシュ動作の指示に広く使われています。しかしこのフィールドは差別化が比較的少なく、一部のキャッシュ指令(例えば s-maxage は共有キャッシュを対象とする)は特定クラスを対象としますが、すべての既存のキャッシュ指令に一貫してターゲティングがあるわけではありません(例:stale-while-revalidate)。キャッシュ拡張が増え、対象となるキャッシュ候補が増えるにつれてこの点は問題になります。
いくつかの実装はこの問題を回避するためにアドホックな制御機構を定義していますが、相互運用性は低いです。セクション2は HTTP レスポンスヘッダを用いたターゲット化キャッシュ制御の標準的なフレームワークを定義し、セクション3はそのようなヘッダの一つ、CDN-Cache-Control 応答ヘッダーフィールドを定義します。
1.1. 記法上の規約
2. ターゲット化された Cache-Control ヘッダーフィールド
Targeted Cache-Control Header Field(以下「ターゲット化フィールド」)は、Cache-Control 応答ヘッダーフィールドと同じ意味を持つ HTTP 応答ヘッダーフィールドです([HTTP-CACHING], Section 5.2)。ただし、キャッシュ指令の対象を示すために異なるフィールド名を持ちます。
例えば:
CDN-Cache-Control: max-age=60
は、セクション3で定義されるように、CDN に適用されるターゲット化フィールドです。
2.1. 構文
ターゲット化フィールドは Dictionary Structured Fields(Section 3.2 of [STRUCTURED-FIELDS])です。Dictionary の各メンバーは HTTP キャッシュ応答指令(Section 5.2.2 of [HTTP-CACHING])であり、拡張応答指令も含みます(Section 5.2.3 of [HTTP-CACHING])。ターゲット化フィールドはしばしば Cache-Control フィールドと同じ構文を持ちますが、エラー処理の差異により Cache-Control パーサではなく Structured Fields パーサを使用することが相互運用性の問題を避けるために重要です。
キャッシュ指令は構造化データ型で定義されていないため、それらの値を適切な型にマッピングする必要があります。Section 5.2 of [HTTP-CACHING] は、キャッシュ指令の値が absent、quoted-string、または token のいずれかであることを定義しています。
これは、値がない指令は Boolean にマップされ(Section 3.3.6 of [STRUCTURED-FIELDS])、quoted-string は String に、token はその内容に応じて Token、Integer、または Decimal にマップされることを意味します(それぞれ Section 3.3.3, Section 3.3.4, Section 3.3.1, Section 3.3.2 of [STRUCTURED-FIELDS] を参照)。
例えば、max-age 指令(Section 5.2.2.1)は整数値を持ちます。no-store(Section 5.2.2.5)は常に Boolean true であり、no-cache(Section 5.2.2.4)は Boolean true またはフィールド名のカンマ区切りリストを含む文字列のいずれかになり得ます。
実装はこれらの推定される制約に違反する値を生成してはなりません。特に、最初の文字が英字または "*" でない文字列値は、他の型と誤認されないように Strings として生成されなければなりません。
実装は、これらの推定制約に違反する値を消費すべきではありません。例えば、十進値を持つ max-age を整数に強制変換する消費実装は、他の実装と挙動が異なり、相互運用性の問題を引き起こす可能性があります。
キャッシュ指令に付与されたパラメータは、特別な取り扱いが明示されない限り無視されます。
ある応答におけるターゲット化フィールドが空である場合、または解析エラーが発生した場合、そのフィールドはキャッシュによって無視されなければなりません(つまり、そのフィールドが存在しないかのように振る舞い、他の cache-control メカニズムにフォールバックすることになります)。
2.2. キャッシュの動作
この仕様を実装するキャッシュは target list(ターゲットリスト)を維持します。ターゲットリストはキャッシュポリシーに用いるターゲット化フィールド名の順序付きリストで、順序は最も適用されやすいものから最も適用されにくいものへの優先順を反映します。ターゲットリストは固定であったり、ユーザーが設定可能であったり、実装によってはリクエストごとに生成されたりします。
例えば、ある CDN キャッシュが CDN-Cache-Control とその CDN 固有のヘッダ ExampleCDN-Cache-Control の両方をサポートし、後者が前者を上書きする場合、そのターゲットリストは次のようになります:
[ExampleCDN-Cache-Control, CDN-Cache-Control]
この仕様を実装するキャッシュがターゲットリストにある1つ以上のヘッダーフィールド名を含む応答を受け取った場合、キャッシュはターゲットリスト順で最初に出現する有効かつ非空の値を持つフィールドを選択し、その値を応答のキャッシュポリシーを決定するために使用し、かつその応答内の Cache-Control および Expires ヘッダーフィールドを無視しなければなりません。ただし、リストにあるヘッダーフィールドから有効で非空の値が得られない場合は例外です。
これは応答ごとに発生する処理です。ターゲットリストのいずれのメンバーも存在せず、有効かつ非空でない場合、キャッシュは HTTP によって要求される他のキャッシュ制御メカニズムにフォールバックします([HTTP-CACHING]参照)。
キャッシュのターゲットリストにないターゲット化フィールドは、そのキャッシュの挙動を変更してはならず、透過的に転送されなければなりません。
ターゲット化フィールドを使用するキャッシュは、次のキャッシュ指令のセマンティクスを実装しなければなりません:
- max-age
- must-revalidate
- no-store
- no-cache
- private
さらに、Cache-Control 応答ヘッダーフィールドでサポートされるその他のキャッシュ指令(拡張指令を含む)についても、可能な限り実装することが推奨されます。
ターゲット化フィールド内のキャッシュ指令のセマンティクスと優先順位は Cache-Control 内のそれと同じです。特に、no-store と no-cache は max-age を無効にし、認識されない拡張指令は無視されます。
2.3. HTTP の新鮮さとの相互作用
HTTP キャッシングには、Section 4.2 of [HTTP-CACHING] に定義された単一のエンドツーエンドの新鮮さモデルがあります。追加の新鮮さメカニズムがリクエスト経路の一部のキャッシュでのみ利用可能な場合(例えばターゲット化フィールドを使用する場合)、それらの相互作用は慎重に検討する必要があります。特に、ターゲット化されたキャッシュは他のキャッシュより長い新鮮さ有効期間を持つことがあり、他のキャッシュから見るとその応答が既に古く(場合によっては即座に古く)見えるため、キャッシュ効率に悪影響を及ぼすことがあります。
例えば、CDN キャッシュに保存された応答が次のヘッダで返されることがあります:
Age: 1800 Cache-Control: max-age=600 CDN-Cache-Control: max-age=3600
CDN の観点では、この応答はキャッシュ後30分でまだ新鮮ですが、他のキャッシュの観点ではこの応答は既に古くなっています。詳しくは [AGE-PENALTY] を参照してください。
ターゲット化されたキャッシュが強力な整合性メカニズム(例えばオリジンサーバがプロアクティブにキャッシュ済み応答を無効化する能力を持つ場合)を持つとき、これらの影響を緩和することが望ましい場合があります。デプロイで見られるいくつかの手法は次のとおりです:
- Age ヘッダーフィールドの除去
- Date ヘッダーフィールド値を現在時刻に更新
- Expires ヘッダーフィールド値を現在時刻に更新し、任意の Cache-Control: max-age 値を加算
本仕様はこれらの影響を緩和するための具体的要件を実装に課すものではありませんが、ターゲット化フィールドの定義はそれを行うことができます。
2.4. ターゲットフィールドの定義
特定のキャッシュクラス向けのターゲットフィールドは、"Hypertext Transfer Protocol (HTTP) Field Name Registry"(<https://www.iana.org/assignments/http-fields/>)への登録を申請することで定義できます。
登録申請は本書を仕様文書として使うことができます。その場合、Comments フィールドはターゲットフィールドが適用されるキャッシュのクラスを明確に定義するべきです。あるいは、そのフィールドのための他の文書が作成されているなら、それを仕様文書として使用できます。
慣例として、ターゲット化フィールドは接尾辞 "-Cache-Control" を持ちます(例:"ExampleCDN-Cache-Control")。しかしこの接尾辞は慣例にすぎず、単独でターゲット化フィールドを識別するために用いてはなりません。
3. CDN-Cache-Control ターゲットフィールド
CDN-Cache-Control 応答ヘッダーフィールドはターゲット化フィールド(セクション2)であり、オリジンサーバが CDN キャッシュの挙動を他のキャッシュとは別に制御することを可能にします。
これは、オリジンサーバのために動作する分散ネットワークの一部であるキャッシュ(一般に CDN と呼ばれる)に適用されます。
CDN-Cache-Control を使用する CDN キャッシュは、下流の CDN キャッシュでも利用できるようにこのヘッダを転送するのが通常です。ただし、これは望ましくない場合(例えば下流で使用されないことが既知で設定されている場合)には削除してもかまいません。
3.1. 例
例えば、次のヘッダーフィールドは CDN キャッシュ(ターゲットリストが [CDN-Cache-Control] のキャッシュ)に対して 600 秒間新鮮と見なすよう指示し、共有キャッシュには 120 秒、残りのキャッシュには 60 秒と見なすよう指示します:
Cache-Control: max-age=60, s-maxage=120 CDN-Cache-Control: max-age=3600
これらのヘッダーフィールドは、CDN キャッシュに対して 600 秒間新鮮と見なすよう指示し、他のすべてのキャッシュには保存を禁止する例です:
CDN-Cache-Control: max-age=600 Cache-Control: no-store
CDN-Cache-Control が存在しない場合、このヘッダーフィールドはすべてのキャッシュに対して保存を禁止します:
Cache-Control: no-store
一方、次のようにすると CDN キャッシュ以外のすべてのキャッシュが保存を禁止されます:
Cache-Control: no-store CDN-Cache-Control: none
(注:'none' は登録されたキャッシュ指令ではありません;空の値を送信して無視されるのを避けるためにここでは用いています。)
4. IANA に関する考慮事項
IANA は [HTTP] によって定義された "Hypertext Transfer Protocol (HTTP) Field Name Registry" に次のエントリを登録しました:
- Field Name:
- CDN-Cache-Control
- Status:
- permanent
- Specification Document:
- RFC 9213
- Comments:
- コンテンツ配信ネットワークを対象としたキャッシュ指令
5. セキュリティに関する考慮事項
HTTP キャッシングのセキュリティに関する考慮事項は [HTTP-CACHING] が適用されます。
1 つの応答に複数のキャッシュポリシーを載せる能力は、どのシステムが応答をどのようにキャッシュするかについて混乱を招き、結果的に機密情報を含む応答が意図せず再利用されることにつながる可能性があります。したがって、この点には注意が必要です。
6. 参考文献
6.1. 規範的参考文献
- [HTTP]
- Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Semantics”, STD 97, RFC 9110, DOI 10.17487/RFC9110, June 2022, <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, June 2022, <https://www.rfc-editor.org/info/rfc9111>.
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.
- [RFC8174]
- Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.
- [STRUCTURED-FIELDS]
- Nottingham, M. and P-H. Kamp, “Structured Field Values for HTTP”, RFC 8941, DOI 10.17487/RFC8941, February 2021, <https://www.rfc-editor.org/info/rfc8941>.
6.2. 参考情報
- [AGE-PENALTY]
- Cohen, E. and H. Kaplan, “The age penalty and its effect on cache performance”, March 2001, <https://dl.acm.org/doi/10.5555/1251440.1251447>.