インターネットドラフト No-Vary-Search 2026年7月
Denicola, et al. 2027年1月2日に失効 [ページ]
ワークグループ:
HyperText Transfer Protocol
インターネットドラフト:
draft-ietf-httpbis-no-vary-search-latest
公開日:
予定ステータス:
標準化過程
失効日:
著者:
D. Denicola
Google LLC
J. Roman
Google LLC
N. Jaju, 編.
Google LLC

No-Vary-Search HTTP キャッシュ拡張

概要

この仕様は、URI クエリパラメーターがキャッシュに与える影響を変更する、HTTP キャッシュの拡張を定義する。

本文書について

この注記は RFC として公開する前に削除される。

このドラフトの最新版は https://httpwg.org/http-extensions/draft-ietf-httpbis-no-vary-search.html にある。 本文書のステータス情報は https://datatracker.ietf.org/doc/draft-ietf-httpbis-no-vary-search/ にある。

本文書に関する議論は、 HTTP Working Group メーリングリスト(mailto:ietf-http-wg@w3.org)で行われ、 そのアーカイブは https://lists.w3.org/Archives/Public/ietf-http-wg/ にある。 Working Group の情報は https://httpwg.org/ にある。

このドラフトのソースと課題トラッカーは、 https://github.com/httpwg/http-extensions/labels/no-vary-search にある。

本文書のステータス

このインターネットドラフトは、 BCP 78 および BCP 79 の規定に完全に準拠して提出されている。

インターネットドラフトは、Internet Engineering Task Force(IETF)の作業文書である。他のグループも作業文書を インターネットドラフトとして配布する場合があることに注意されたい。 現在のインターネットドラフトの一覧は https://datatracker.ietf.org/drafts/current/ にある。

インターネットドラフトは最大 6 か月間有効なドラフト文書であり、 いつでも他の文書によって更新、置換、または廃止される可能性がある。 インターネットドラフトを参考資料として用いること、または 「作業中」のものとして以外に引用することは不適切である。

このインターネットドラフトは 2027年1月2日に失効する。

目次

1. 序論

HTTP キャッシュ [HTTP-CACHING] は、多数のキャッシュキーにわたって一致するリソースを再利用することに基づいており、その中で最も重要なものは 提示された対象 URI(Section 7.1 of [HTTP])です。しかし、 複数の URI が同じリソースを表す場合があります。これにより、キャッシュは常に本来ほど 有用であるとは限りません。すなわち、キャッシュにある URI の下でレスポンスが含まれていても、その後 別の URI の下でレスポンスが要求されると、キャッシュされた版は無視されます。

"No-Vary-Search" レスポンスヘッダーフィールドは、 Section 4 of [HTTP-CACHING] で説明されるキャッシュ拡張を定義し、 この一般的な問題の特定の部分集合、すなわち特定のクエリパラメータのみが異なる別々の URI が 同じリソースを識別する場合に対処します。これは、クエリコンポーネントの一部または全部が、 提供されるレスポンスに意味的に影響しないため、キャッシュ照合の目的では無視できることを リソースが宣言できるようにします。たとえば、クエリパラメータの順序が、どのリソースが 識別されるかに影響しない場合、これは次を使用して示されます

No-Vary-Search: key-order

特定のクエリパラメータ(例: 分析用に何かを示すもの)が 提供されるリソースに意味的に影響しない場合、これは次を使用して示されます

No-Vary-Search: params=("utm_source" "utm_medium" "utm_campaign")

そして、リソースが代わりに許可リストベースのアプローチを取り、 既知の特定のクエリパラメータだけが提供されるレスポンスに意味的に影響するようにしたい場合、 次を使用できます

No-Vary-Search: except=("productId")

キャッシュされたレスポンスの取得を避けるために一意なクエリパラメータを送る 「キャッシュバスティング」は、No-Vary-Search ヘッダーフィールドによって 無効化される場合があることに注意してください。

Section 3 は、 [STRUCTURED-FIELDS] フレームワークを使用して、 新しいレスポンスヘッダーフィールド No-Vary-Search を定義します。Section 4 および Section 5 は、フィールド値を仕様でどのように表現できるかについてのデータモデルと、 structured field パーサーからの生の出力をそのデータモデルへ解析するプロセスを示します。Section 6 は、ヘッダーフィールドの影響下で 2 つの URL が等価かどうかを比較するための主要なアルゴリズムを示します。特に、これは [WHATWG-URL] で指定される application/x-www-form-urlencoded 形式によって与えられる クエリコンポーネントのキーと値への分解に依存しています。(したがって、このヘッダーフィールドは、 その形式に従わないクエリコンポーネントを持つ URL には有用ではありません。)最後に、Section 7 は、この新しい等価性を考慮に入れるために Section 4 of [HTTP-CACHING] を拡張する方法を説明します。

2. 規約と定義

この文書におけるキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" は、 ここに示されるようにすべて大文字で現れる場合に限り、BCP 14 [RFC2119] [RFC8174] で説明されるように解釈されます。

この文書では、"URI" と "URL" という用語は、文脈に応じて 同じ意味で使用されます。"URI" は [URI], [HTTP], および [HTTP-CACHING] の文脈で使用され、 一方 "URL" は [WHATWG-URL] で指定される アルゴリズムの文脈で使用されます。

この文書はまた、WHATWG および W3C の用法で典型的な規約や記法も採用します。 特にアルゴリズムに関係するものです。[WHATWG-INFRA]、とりわけ以下を参照してください:

(使用される他の概念はインライン参照を使用して示されます。)

3. HTTP ヘッダーフィールド定義

No-Vary-Search HTTP ヘッダーフィールドは structured field [STRUCTURED-FIELDS] であり、その値は 辞書(Section 3.2 of [STRUCTURED-FIELDS])で MUST あります。

これは次のオーサリング適合要件を持ちます:

辞書は、key-order, params, および except の いずれでもないキーを持つエントリを含んでも MAY よいですが、それらの意味は この仕様では定義されません。この仕様の実装はそのようなエントリを無視します(ただし将来の文書が そのようなエントリに意味を割り当てる可能性があります)。

4. データモデル

URL variation config は次で構成されます:

no-vary params

特殊値 wildcard または文字列のリスト

vary params

特殊値 wildcard または文字列のリスト

vary on key order

boolean

default URL variation config は、no-vary params が空リスト、vary params が wildcard、vary on key order が true である URL variation config です。

obtain a URL variation config アルゴリズム(Section 5.2)は、 すべての URL variation configs が次の制約に従うことを保証します:

5. 解析

5.1. URL variation config を解析する

value が与えられたとき、parse a URL variation config するには:

  1. value が null の場合、default URL variation config を返す。

  2. result を新しい URL variation config とする。

  3. result の vary on key order を true に設定する。

  4. value["key-order"] が存在する場合:

    1. value["key-order"] が boolean でない場合、default URL variation config を返す。

    2. result の vary on key order を value["key-order"] の boolean 否定に設定する。

  5. value["params"] と value["except"] の両方が存在するか、どちらも存在しない場合、 default URL variation config を返す。

  6. value["params"] が存在する場合:

    1. value["params"] が array でない場合、default URL variation config を返す。

    2. value["params"] 内の いずれかの item が string でない場合、default URL variation config を返す。

    3. result の no-vary params を、 value["params"] 内の各 item に parse a keySection 5.3)を適用した結果に設定する。

    4. result の no-vary params 内の いずれかの item が error である場合、default URL variation config を返す。

    5. result の vary params を wildcard に設定する。

  7. そうでなく、value["except"] が存在する場合:

    1. value["except"] が array でない場合、default URL variation config を返す。

    2. value["except"] 内の いずれかの item が string でない場合、default URL variation config を返す。

    3. result の vary params を、 value["except"] 内の各 item に parse a keySection 5.3)を適用した結果に設定する。

    4. result の vary params 内の いずれかの item が error である場合、default URL variation config を返す。

    5. result の no-vary params を wildcard に設定する。

  8. result を返す。

5.2. URL variation config を取得する

response response が与えられたとき、 obtain a URL variation config するには:

  1. fieldValue を、response の header list から `No-Vary-Search` および "dictionary" が与えられて getting a structured field value した結果とする [FETCH]

  2. fieldValue が与えられて URL variation config(Section 5.1)を 解析した結果を返す。

5.2.1.

次は、さまざまな入力がどのように解析されるかを、結果の no-vary params および vary params への影響という観点から示します:

表 1
入力 結果
No-Vary-Search: params=("a") no-vary params: « "a" »
vary params: wildcard
No-Vary-Search: except=("x") no-vary params: wildcard
vary params: « "x" »
No-Vary-Search: params=() no-vary params:(空の リスト)
vary params: wildcard
No-Vary-Search: except=() no-vary params: wildcard
vary params:(空のリスト)

次の入力はすべて無効であり、default URL variation config が返されます:

  • No-Vary-Search: key-order="not a boolean"

  • No-Vary-Search: params="not an inner list"

  • No-Vary-Search: params=(not-a-string)

  • No-Vary-Search: params=?0

  • No-Vary-Search: params=?1

  • No-Vary-Search: params=?1, except=("x")

  • No-Vary-Search: params=("a"), except=("x")

  • No-Vary-Search: params=(), except=()

  • No-Vary-Search: except="not an inner list"

  • No-Vary-Search: except=(not-a-string)

  • No-Vary-Search: except=?1

次の入力は有効ですが、やや非慣用的です。 より慣用的な形式と並べて示します。

表 2
入力 慣用的な形式
No-Vary-Search: key-order=?1 No-Vary-Search: key-order
No-Vary-Search: except=("x"), key-order No-Vary-Search: key-order, except=("x")
No-Vary-Search: params=() (ヘッダーフィールドを省略する)
No-Vary-Search: key-order=?0 (ヘッダーフィールドを省略する)

5.3. key を解析する

ASCII string keyString が与えられたとき、parse a key するには:

  1. keyBytes を、 keyStringisomorphic encoding [WHATWG-INFRA] とする。

  2. keyBytes 内の任意の 0x2B (+) を 0x20 (SP) に置換する。

  3. keyBytesDecoded を、 keyBytespercent-decoding [WHATWG-URL] とする。

  4. keyStringDecoded を、keyBytesDecodedUTF-8 decoding without BOM [WHATWG-ENCODING] とする。

  5. keyStringDecoded を返す。

5.3.1.

parse a key アルゴリズムは、 application/x-www-form-urlencoded 形式 [WHATWG-URL] が URI(ASCII 文字に制限される)内でキーと値の entry list 全体をエンコードできるようにするのと同様に、 ASCII structured header field 形式で非 ASCII の key 文字列をエンコードできるようにします。 たとえば、

No-Vary-Search: params=("%C3%A9+%E6%B0%97")

これは、vary params が « "é 気" » である URL variation config になります。後の例で説明されるように、 等価性テスト中の正規化プロセスは、次のような URI を等価として扱うことを意味します:

  • https://example.com/?é 気=1

  • https://example.com/?é+気=2

  • https://example.com/?%C3%A9%20気=3

  • https://example.com/?%C3%A9+%E6%B0%97=4

などです。これらはすべて、同じ key "é 気" を持つように 解析 [WHATWG-URL] されるためです。

6. 比較

2 つの URLs [WHATWG-URL] urlA および urlB は、 URL variation config variationConfig が与えられたとき、次のアルゴリズムが true を返すなら equivalent modulo variation config です:

  1. urlAurlB の scheme、username、password、host、port、または path が 異なる場合、false を返す。

  2. variationConfigdefault URL variation config と 等価である場合:

    1. urlA の query が urlB の query と等しい場合、 true を返す。

    2. false を返す。

    この場合、クエリに対して application/x-www-form-urlencoded parser [WHATWG-URL] を実行した後では 同じように見える可能性のある URL ペアであっても、たとえば https://example.com/ahttps://example.com/a?、または https://example.com/foo?a=b&&&chttps://example.com/foo?a=b&c= は、非等価として扱われます。

  3. searchParamsA および searchParamsB を空リストとする。

  4. urlA の query が null でない場合、 searchParamsA を、urlA の query の isomorphic encoding [WHATWG-INFRA] が与えられて application/x-www-form-urlencoded parser [WHATWG-URL] を実行した 結果に設定する。

  5. urlB の query が null でない場合、 searchParamsB を、urlB の query の isomorphic encoding [WHATWG-INFRA] が与えられて application/x-www-form-urlencoded parser [WHATWG-URL] を実行した 結果に設定する。

  6. variationConfig の no-vary params がリストである場合:

    1. searchParamsA を、 searchParamsA 内の item pair のうち、 variationConfig の no-vary params が pair[0] を含まないものを含むリストに設定する。

    2. searchParamsB を、 searchParamsB 内の item pair のうち、 variationConfig の no-vary params が pair[0] を含まないものを含むリストに設定する。

  7. そうでなく、variationConfig の vary params がリストである場合:

    1. searchParamsA を、 searchParamsA 内の item pair のうち、 variationConfig の vary params が pair[0] を含むものを含むリストに設定する。

    2. searchParamsB を、 searchParamsB 内の item pair のうち、 variationConfig の vary params が pair[0] を含むものを含むリストに設定する。

  8. variationConfig の vary on key order が false である場合:

    1. keyLessThan を、2 つの pairs(keyA, valueA)および(keyB, valueB)を 入力として取り、keyAkeyB より code unit less than [WHATWG-INFRA] であるかどうかを返すアルゴリズムとする。

    2. searchParamsA を、 keyLessThan によって昇順に ソート [WHATWG-INFRA] した結果に設定する。

    3. searchParamsB を、 keyLessThan によって昇順に ソート [WHATWG-INFRA] した結果に設定する。

  9. searchParamsA の size が searchParamsB の size と等しくない場合、false を返す。

  10. i を 0 とする。

  11. i < searchParamsA の size の間:

    1. searchParamsA[i][0] が searchParamsB[i][0] と等しくない場合、false を返す。

    2. searchParamsA[i][1] が searchParamsB[i][1] と等しくない場合、false を返す。

    3. ii + 1 に設定する。

  12. true を返す。

6.1.

application/x-www-form-urlencoded パーサーがクエリ文字列を正規化する方法により、 明らかに等価には見えないクエリ文字列が、解析後に等価として扱われる場合があります。

したがって、たとえば No-Vary-SearchNo-Vary-Search: key-order のような任意の非デフォルト値が与えられた場合、 次の等価性が成り立ちます:

表 3
第 1 クエリ 第 2 クエリ 説明
null ? null query は空文字列と同じように解析される
?a=x ?%61=%78 解析は percent-decoding を実行する
?a=é ?a=%C3%A9 解析は percent-decoding を実行する
?a=%f6 ?a=%ef%bf%bd 両方の値は U+FFFD (�) として解析される
?a=x&&&& ?a=x 解析は & で分割し、 空文字列を破棄する
?a= ?a 両方とも a に対して 空文字列値を持つものとして解析される
?a=%20 ?a= & %20 は U+0020 SPACE として解析される
?a=+ ?a= & + は U+0020 SPACE として解析される

7. キャッシュ

キャッシュ [HTTP-CACHING] が この仕様を実装する場合、Section 4 of [HTTP-CACHING] における 提示された対象 URI 要件:

提示された対象 URI([HTTP] の Section 7.1)と保存されたレスポンスのそれが一致し、かつ

は次に置き換えられます:

提示された対象 URI([HTTP] の Section 7.1)と保存されたレスポンスのそれが一致するか、 URL variation config を法として等価であり、かつ

キャッシュ実装は、target URI が URL variation config を法として のみ 一致する保存レスポンスの再利用に失敗しても MAY よいです。ただし、そのキャッシュがより最近に、次を満たすレスポンスを 保存している場合です:

キャッシュ実装の効率を助けるため、サーバーは、query component の処理方法を 更新する必要がない限り、ある pathname へのリクエストに対するレスポンスで、 No-Vary-Search field に対して時とともに異なる空でない値を送信すべきでは SHOULD NOT ありません。そうすると、上記のような戦略を使用するキャッシュ実装が、 本来再利用できた一部の保存レスポンスを見逃すことになります。

8. セキュリティ上の考慮事項

注意すべき主なリスクは、一致しない URL の影響です。特に、これは、 ユーザーがリンクにホバーしたときに表示された URL、または URL バーに表示された URL とは異なる URL から元々取得されたレスポンスをユーザーが見ることにつながる可能性があります。

しかし、影響はクエリパラメータに限定されるため、これは関連する セキュリティ境界である origin [HTML] を越えません。(または、ウェブブラウザの セキュリティ UI の観点 からは、 単に host かもしれません。 [WHATWG-URL])実際、私たちはすでに origin に対し、history.replaceState() や service workers のような技術によるクライアント側も含めて、(URL, response body)ペアを どのように提示するかについて完全な制御を与えています。

9. プライバシー上の考慮事項

この提案は、ユーザー識別子を渡すためにクエリパラメータをよく使用する navigational tracking という、プライバシーに非常に関連する領域に隣接しています。しかし、この提案自体には プライバシーへの影響はないと考えます。これは 既存の navigational tracking mitigations、または検討されている既知の将来のものに干渉しません。 実際、ページがその URI にユーザー識別子をエンコードする場合、この提案が与える唯一の能力は、 サーバーによるそのようなユーザー ID の処理を防ぐ(サーバーがキャッシュのために迂回される)ことによって、 そのようなユーザートラッキングを減らすことです。[NAV-TRACKING-MITIGATIONS]

10. IANA に関する考慮事項

10.1. HTTP フィールド名

IANA は、次を Hypertext Transfer Protocol (HTTP) Field Name Registry(https://www.iana.org/assignments/http-fields/http-fields.xhtml)に 入れるよう要求されています:

Field Name:

No-Vary-Search

Status:

permanent

Structured Type:

Dictionary

Reference:

この文書

Comments:

(なし)

11. 参考文献

11.1. 規範参考文献

[FETCH]
van Kesteren, A., "Fetch Living Standard", n.d., <https://fetch.spec.whatwg.org/>. WHATWG
[HTTP]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Semantics", STD 97, RFC 9110, DOI 10.17487/RFC9110, , <https://www.rfc-editor.org/rfc/rfc9110>.
[HTTP-CACHING]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Caching", STD 98, RFC 9111, DOI 10.17487/RFC9111, , <https://www.rfc-editor.org/rfc/rfc9111>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[STRUCTURED-FIELDS]
Nottingham, M. and P. Kamp, "Structured Field Values for HTTP", RFC 9651, DOI 10.17487/RFC9651, , <https://www.rfc-editor.org/rfc/rfc9651>.
[URI]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/rfc/rfc3986>.
[WHATWG-ENCODING]
van Kesteren, A., "Encoding Living Standard", n.d., <https://encoding.spec.whatwg.org/>. WHATWG
[WHATWG-INFRA]
van Kesteren, A. and D. Denicola, "Infra Living Standard", n.d., <https://infra.spec.whatwg.org/>. WHATWG
[WHATWG-URL]
van Kesteren, A., "URL Living Standard", n.d., <https://url.spec.whatwg.org/>. WHATWG

11.2. 参考情報文献

[HTML]
van Kesteren, A., "HTML Living Standard", n.d., <https://html.spec.whatwg.org/>. WHATWG
Snyder, P. and J. Yasskin, "Navigational-Tracking Mitigations", n.d., <https://privacycg.github.io/nav-tracking-mitigations/>. W3C Privacy CG

謝辞

この文書は、次の方々による有益なレビューと提案から恩恵を受けました:

索引

D E O P

著者の連絡先

Domenic Denicola
Google LLC
Jeremy Roman
Google LLC
Nidhi Jaju(編集者
Google LLC