| インターネットドラフト | No-Vary-Search | 2026年7月 |
| Denicola, et al. | 2027年1月2日に失効 | [ページ] |
この仕様は、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日に失効する。¶
Copyright (c) 2026 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.¶
HTTP キャッシュ [HTTP-CACHING] は、多数のキャッシュキーにわたって一致するリソースを再利用することに基づいており、その中で最も重要なものは 提示された対象 URI(Section 7.1 of [HTTP])です。しかし、 複数の URI が同じリソースを表す場合があります。これにより、キャッシュは常に本来ほど 有用であるとは限りません。すなわち、キャッシュにある URI の下でレスポンスが含まれていても、その後 別の URI の下でレスポンスが要求されると、キャッシュされた版は無視されます。¶
"No-Vary-Search" レスポンスヘッダーフィールドは、
Section 4 of [HTTP-CACHING] で説明されるキャッシュ拡張を定義し、
この一般的な問題の特定の部分集合、すなわち特定のクエリパラメータのみが異なる別々の URI が
同じリソースを識別する場合に対処します。これは、クエリコンポーネントの一部または全部が、
提供されるレスポンスに意味的に影響しないため、キャッシュ照合の目的では無視できることを
リソースが宣言できるようにします。たとえば、クエリパラメータの順序が、どのリソースが
識別されるかに影響しない場合、これは次を使用して示されます¶
特定のクエリパラメータ(例: 分析用に何かを示すもの)が 提供されるリソースに意味的に影響しない場合、これは次を使用して示されます¶
そして、リソースが代わりに許可リストベースのアプローチを取り、 既知の特定のクエリパラメータだけが提供されるレスポンスに意味的に影響するようにしたい場合、 次を使用できます¶
キャッシュされたレスポンスの取得を避けるために一意なクエリパラメータを送る
「キャッシュバスティング」は、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] を拡張する方法を説明します。¶
この文書におけるキーワード "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]、とりわけ以下を参照してください:¶
(使用される他の概念はインライン参照を使用して示されます。)¶
No-Vary-Search HTTP ヘッダーフィールドは structured field [STRUCTURED-FIELDS] であり、その値は
辞書(Section 3.2 of [STRUCTURED-FIELDS])で
MUST あります。¶
これは次のオーサリング適合要件を持ちます:¶
存在する場合、key-order エントリの値は boolean(Section 3.3.6
of [STRUCTURED-FIELDS])で
MUST あります。¶
存在する場合、params エントリの値は文字列の inner list(Section 3.1.1
of [STRUCTURED-FIELDS])で
MUST あります。¶
存在する場合、except エントリの値は文字列の inner list(Section 3.1.1
of [STRUCTURED-FIELDS])で
MUST あります。¶
params エントリも存在する場合、
except エントリは存在しては MUST NOT なりません。¶
辞書は、key-order, params, および except の
いずれでもないキーを持つエントリを含んでも MAY よいですが、それらの意味は
この仕様では定義されません。この仕様の実装はそのようなエントリを無視します(ただし将来の文書が
そのようなエントリに意味を割り当てる可能性があります)。¶
URL variation config は次で構成されます:¶
特殊値 wildcard または文字列のリスト¶
特殊値 wildcard または文字列のリスト¶
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 が次の制約に従うことを保証します:¶
value が与えられたとき、parse a URL variation config するには:¶
value が null の場合、default URL variation config を返す。¶
result を新しい URL variation config とする。¶
result の vary on key order を true に設定する。¶
value["key-order"] が存在する場合:¶
value["params"] と
value["except"] の両方が存在するか、どちらも存在しない場合、
default URL variation
config を返す。¶
value["params"] が存在する場合:¶
value["params"] が
array でない場合、default URL variation config を返す。¶
value["params"] 内の
いずれかの item が string でない場合、default URL variation config を返す。¶
result の no-vary params を、
value["params"] 内の各 item に
parse a key(Section 5.3)を適用した結果に設定する。¶
result の no-vary params 内の いずれかの item が error である場合、default URL variation config を返す。¶
result の vary params を wildcard に設定する。¶
そうでなく、value["except"] が存在する場合:¶
value["except"] が
array でない場合、default URL variation config を返す。¶
value["except"] 内の
いずれかの item が string でない場合、default URL variation config を返す。¶
result の vary params を、
value["except"] 内の各 item に
parse a key(Section 5.3)を適用した結果に設定する。¶
result の vary params 内の いずれかの item が error である場合、default URL variation config を返す。¶
result の no-vary params を wildcard に設定する。¶
result を返す。¶
response response が与えられたとき、 obtain a URL variation config するには:¶
fieldValue を、response の header list から
`No-Vary-Search` および
"dictionary" が与えられて getting
a structured field value した結果とする
[FETCH]。¶
fieldValue が与えられて URL variation config(Section 5.1)を 解析した結果を返す。¶
次は、さまざまな入力がどのように解析されるかを、結果の no-vary params および vary params への影響という観点から示します:¶
| 入力 | 結果 |
|---|---|
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¶
次の入力は有効ですが、やや非慣用的です。 より慣用的な形式と並べて示します。¶
| 入力 | 慣用的な形式 |
|---|---|
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
|
(ヘッダーフィールドを省略する) |
ASCII string keyString が与えられたとき、parse a key するには:¶
keyBytes を、 keyString の isomorphic encoding [WHATWG-INFRA] とする。¶
keyBytes 内の任意の 0x2B (+) を 0x20 (SP) に置換する。¶
keyBytesDecoded を、 keyBytes の percent-decoding [WHATWG-URL] とする。¶
keyStringDecoded を、keyBytesDecoded の UTF-8 decoding without BOM [WHATWG-ENCODING] とする。¶
keyStringDecoded を返す。¶
parse a key アルゴリズムは、 application/x-www-form-urlencoded 形式 [WHATWG-URL] が URI(ASCII 文字に制限される)内でキーと値の entry list 全体をエンコードできるようにするのと同様に、 ASCII structured header field 形式で非 ASCII の key 文字列をエンコードできるようにします。 たとえば、¶
これは、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] されるためです。¶
2 つの URLs [WHATWG-URL] urlA および urlB は、 URL variation config variationConfig が与えられたとき、次のアルゴリズムが true を返すなら equivalent modulo variation config です:¶
urlA と urlB の scheme、username、password、host、port、または path が 異なる場合、false を返す。¶
variationConfig が default URL variation config と 等価である場合:¶
この場合、クエリに対して
application/x-www-form-urlencoded
parser [WHATWG-URL] を実行した後では
同じように見える可能性のある URL ペアであっても、たとえば
https://example.com/a と https://example.com/a?、または
https://example.com/foo?a=b&&&c と
https://example.com/foo?a=b&c= は、非等価として扱われます。¶
searchParamsA および searchParamsB を空リストとする。¶
urlA の query が null でない場合、 searchParamsA を、urlA の query の isomorphic encoding [WHATWG-INFRA] が与えられて application/x-www-form-urlencoded parser [WHATWG-URL] を実行した 結果に設定する。¶
urlB の query が null でない場合、 searchParamsB を、urlB の query の isomorphic encoding [WHATWG-INFRA] が与えられて application/x-www-form-urlencoded parser [WHATWG-URL] を実行した 結果に設定する。¶
variationConfig の no-vary params がリストである場合:¶
そうでなく、variationConfig の vary params がリストである場合:¶
variationConfig の vary on key order が false である場合:¶
keyLessThan を、2 つの pairs(keyA, valueA)および(keyB, valueB)を 入力として取り、keyA が keyB より code unit less than [WHATWG-INFRA] であるかどうかを返すアルゴリズムとする。¶
searchParamsA を、 keyLessThan によって昇順に ソート [WHATWG-INFRA] した結果に設定する。¶
searchParamsB を、 keyLessThan によって昇順に ソート [WHATWG-INFRA] した結果に設定する。¶
searchParamsA の size が searchParamsB の size と等しくない場合、false を返す。¶
i を 0 とする。¶
i < searchParamsA の size の間:¶
true を返す。¶
application/x-www-form-urlencoded パーサーがクエリ文字列を正規化する方法により、 明らかに等価には見えないクエリ文字列が、解析後に等価として扱われる場合があります。¶
したがって、たとえば No-Vary-Search に
No-Vary-Search: key-order のような任意の非デフォルト値が与えられた場合、
次の等価性が成り立ちます:¶
| 第 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 として解析される
|
キャッシュ [HTTP-CACHING] が この仕様を実装する場合、Section 4 of [HTTP-CACHING] における 提示された対象 URI 要件:¶
は次に置き換えられます:¶
提示された対象 URI([HTTP] の Section 7.1)と保存されたレスポンスのそれが一致するか、 URL variation config を法として等価であり、かつ¶
キャッシュ実装は、target URI が URL variation config を法として のみ 一致する保存レスポンスの再利用に失敗しても MAY よいです。ただし、そのキャッシュがより最近に、次を満たすレスポンスを 保存している場合です:¶
query を除いて、提示された対象 URI と等しい target URI を持ち、かつ¶
No-Vary-Search field に空でない値を持ち、かつ¶
再利用を検討している保存レスポンスとは異なる
No-Vary-Search field value を持つ。¶
キャッシュ実装の効率を助けるため、サーバーは、query component の処理方法を
更新する必要がない限り、ある pathname へのリクエストに対するレスポンスで、
No-Vary-Search field に対して時とともに異なる空でない値を送信すべきでは
SHOULD NOT ありません。そうすると、上記のような戦略を使用するキャッシュ実装が、
本来再利用できた一部の保存レスポンスを見逃すことになります。¶
注意すべき主なリスクは、一致しない URL の影響です。特に、これは、 ユーザーがリンクにホバーしたときに表示された URL、または URL バーに表示された URL とは異なる URL から元々取得されたレスポンスをユーザーが見ることにつながる可能性があります。¶
しかし、影響はクエリパラメータに限定されるため、これは関連する セキュリティ境界である origin [HTML] を越えません。(または、ウェブブラウザの セキュリティ UI の観点 からは、 単に host かもしれません。 [WHATWG-URL])実際、私たちはすでに origin に対し、history.replaceState() や service workers のような技術によるクライアント側も含めて、(URL, response body)ペアを どのように提示するかについて完全な制御を与えています。¶
この提案は、ユーザー識別子を渡すためにクエリパラメータをよく使用する navigational tracking という、プライバシーに非常に関連する領域に隣接しています。しかし、この提案自体には プライバシーへの影響はないと考えます。これは 既存の navigational tracking mitigations、または検討されている既知の将来のものに干渉しません。 実際、ページがその URI にユーザー識別子をエンコードする場合、この提案が与える唯一の能力は、 サーバーによるそのようなユーザー ID の処理を防ぐ(サーバーがキャッシュのために迂回される)ことによって、 そのようなユーザートラッキングを減らすことです。[NAV-TRACKING-MITIGATIONS]¶
IANA は、次を Hypertext Transfer Protocol (HTTP) Field Name Registry(https://www.iana.org/assignments/http-fields/http-fields.xhtml)に 入れるよう要求されています:¶
Section 4, Paragraph 3; Section 5.1, Paragraph 2.1.1; Section 5.1, Paragraph 2.4.2.1.1; Section 5.1, Paragraph 2.5.1; Section 5.1, Paragraph 2.6.2.1.1; Section 5.1, Paragraph 2.6.2.2.1; Section 5.1, Paragraph 2.6.2.4.1; Section 5.1, Paragraph 2.7.2.1.1; Section 5.1, Paragraph 2.7.2.2.1; Section 5.1, Paragraph 2.7.2.4.1; Section 5.1, Paragraph 3.1; Section 5.2.1, Paragraph 3; Section 6, Paragraph 2.2.1¶
Section 3, Paragraph 5.1; Section 4, Paragraph 4; Section 5.2, Paragraph 1¶
Section 5.1, Paragraph 2.6.2.3.1; Section 5.1, Paragraph 2.7.2.3.1; Section 5.3, Paragraph 1; Section 5.3.1, Paragraph 1¶