<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-no-vary-search-10" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="No-Vary-Search">The No-Vary-Search HTTP Caching Extension</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-no-vary-search-10"/>
    <author fullname="Domenic Denicola">
      <organization>Google LLC</organization>
      <address>
        <email>d@domenic.me</email>
      </address>
    </author>
    <author fullname="Jeremy Roman">
      <organization>Google LLC</organization>
      <address>
        <email>jbroman@chromium.org</email>
      </address>
    </author>
    <author fullname="Nidhi Jaju" role="editor">
      <organization>Google LLC</organization>
      <address>
        <email>nidhijaju@chromium.org</email>
      </address>
    </author>
    <date year="2026" month="October" day="07"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 108?>

<t>This specification defines an extension to HTTP Caching, changing how the URI query component impacts caching. It introduces the <tt>"No-Vary-Search"</tt> response header field, which allows origin servers to signal to caches that certain parts of the query component do not semantically affect the served response and can be ignored for cache matching purposes.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://httpwg.org/http-extensions/draft-ietf-httpbis-no-vary-search.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-no-vary-search/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/no-vary-search"/>.</t>
    </note>
  </front>
  <middle>
    <?line 112?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>HTTP caching <xref target="HTTP-CACHING"/> is based on reusing resources which match across a number of cache keys, with the most important one being the presented target URI (<xref section="7.1" sectionFormat="of" target="HTTP"/>). However, sometimes multiple URIs can represent the same resource. This leads to caches not always being as helpful as they could be: if the cache contains a response under one URI, but the response is then requested under another, the cached version will be ignored.</t>
      <t>The "No-Vary-Search" response header field defines a caching extension, as described in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>, that tackles a specific subset of this general problem, for when different URIs that differ only in their query component identify the same resource. It allows resources to declare that some or all parts of the query component do not semantically affect the served response, and thus can be ignored for cache matching purposes. This is achieved by interpreting the query component as a sequence of parameters encoded using the <tt>application/x-www-form-urlencoded</tt> format <xref target="WHATWG-URL"/>. For example, if the order of the parameters within the query component does not affect which resource is identified, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: key-order
]]></sourcecode>
      <t>If specific query parameters (e.g., ones indicating something for analytics) do not semantically affect the served resource, this is indicated using</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("utm_source" "utm_medium" "utm_campaign")
]]></sourcecode>
      <t>And if the resource instead wants to take an allowlist-based approach, where only certain known query parameters semantically affect the served response, they can use</t>
      <sourcecode type="http-message"><![CDATA[
No-Vary-Search: except=("productId")
]]></sourcecode>
      <t>Note that "cache busting", the practice of changing a part of the query component to create a distinct cache key and force retrieval of a newer response, can be made ineffective by the <tt>"No-Vary-Search"</tt> response header field.</t>
      <t><xref target="header-definition"/> defines the new <tt>"No-Vary-Search"</tt> response header field, using the <xref target="STRUCTURED-FIELDS"/> framework. <xref target="data-model"/> and <xref target="parsing"/> illustrate the data model for how the field value can be represented in specifications, and the process for parsing the raw output from the structured field parser into that data model. <xref target="comparing"/> gives the key algorithm for comparing if two URLs are equivalent under the influence of the header field; notably, it leans on the decomposition of the query component into keys and values given by the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format specified in <xref target="WHATWG-URL"/>. (As such, this header field is not useful for URLs whose query component does not follow that format.) Finally, <xref target="caching"/> explains how to extend <xref section="4" sectionFormat="of" target="HTTP-CACHING"/> to take this new equivalence into account.</t>
      <t>From a deployment perspective, this extension is implemented by HTTP caches, including browser caches, content delivery networks, and forward proxies. Origin servers send the <tt>"No-Vary-Search"</tt> response header field to provide instructions to these caches. Caches that implement this extension use these instructions to determine when a previously stored response can be safely reused for a new request, even if the query components of the target URIs differ.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>In this document, the terms "URI" and "URL" are used interchangeably, depending on context. "URI" is used in the context of <xref target="URI"/>, <xref target="HTTP"/>, and <xref target="HTTP-CACHING"/>, whereas "URL" is used in the context of the algorithms specified in <xref target="WHATWG-URL"/>.</t>
      <t>The term "query parameters" in this document refers to the keys and values resulting from parsing a URL's query component using the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/>.</t>
      <t>This document also adopts some conventions and notation typical in WHATWG and W3C usage, especially as it relates to algorithms. See <xref target="WHATWG-INFRA"/>, and in particular:</t>
      <ul spacing="normal">
        <li>
          <t>its definition of lists, including the list literal notation « 1, 2, 3 ».</t>
        </li>
        <li>
          <t>its definition of strings, including their representation as code units.</t>
        </li>
      </ul>
      <t>(Other concepts used are called out using inline references.)</t>
    </section>
    <section anchor="header-definition">
      <name>HTTP header field definition</name>
      <t>The <tt>"No-Vary-Search"</tt> response header field is a structured field <xref target="STRUCTURED-FIELDS"/> whose value <bcp14>MUST</bcp14> be a dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
      <t>It has the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>If present, the <tt>key-order</tt> entry's value <bcp14>MUST</bcp14> be a boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>params</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>except</tt> entry's value <bcp14>MUST</bcp14> be an inner list of strings (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>The <tt>except</tt> entry <bcp14>MUST NOT</bcp14> be present if the <tt>params</tt> entry is also present.</t>
        </li>
      </ul>
      <t>The dictionary <bcp14>MAY</bcp14> contain entries whose keys are not one of <tt>key-order</tt>, <tt>params</tt>, and <tt>except</tt>, but their meaning is not defined by this specification. Implementations of this specification will ignore such entries (but future documents might assign meaning to such entries). Future extensions to this dictionary <bcp14>MUST NOT</bcp14> restrict the set of URIs that are considered equivalent; they can only expand it. If a future extension requires restricting equivalence, it <bcp14>MUST</bcp14> be deployed as a new HTTP header field to ensure safety.</t>
      <t>The <tt>"No-Vary-Search"</tt> response header field is set by origin servers. Intermediaries <bcp14>MUST NOT</bcp14> insert, delete, or modify the field's value unless they are acting as the origin server for that response.</t>
      <aside>
        <t>A parsing algorithm is defined in <xref target="obtain-a-url-variation-config"/>.</t>
      </aside>
    </section>
    <section anchor="data-model">
      <name>Data model</name>
      <t>A <em>URL variation config</em> consists of the following:</t>
      <dl newline="true">
        <dt>no-vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary on key order</dt>
        <dd>
          <t>a boolean</t>
        </dd>
      </dl>
      <t><iref item="default URL variation config" primary="true"/>
The <em><iref item="default URL variation config"/>default URL variation config</em> is a URL variation config whose no-vary params is an empty list, vary params is <strong>wildcard</strong>, and vary on key order is true.</t>
      <t>The <iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref> algorithm (<xref target="obtain-a-url-variation-config"/>) ensures that all URL variation configs obey the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>vary params is a list if and only if the no-vary params is <strong>wildcard</strong>; and</t>
        </li>
        <li>
          <t>no-vary params is a list if and only if the vary params is <strong>wildcard</strong>.</t>
        </li>
      </ul>
    </section>
    <section anchor="parsing">
      <name>Parsing</name>
      <section anchor="parse-a-url-variation-config">
        <name>Parse a URL variation config</name>
        <t><iref item="parse a URL variation config" primary="true"/>
To <em><iref item="parse a URL variation config"/><xref target="parse-a-url-variation-config" format="none">parse a URL variation config</xref></em> given <em>value</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>If <em>value</em> is null, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>Let <em>result</em> be a new URL variation config.</t>
          </li>
          <li>
            <t>Set <em>result</em>'s vary on key order to true.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>key-order</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>keyOrderValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>key-order</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>keyOrderValue</em> is not a boolean, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary on key order to the boolean negation of <em>keyOrderValue</em>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If both <em>value</em>["<tt>params</tt>"] and <em>value</em>["<tt>except</tt>"] exist, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </li>
          <li>
            <t>If neither <em>value</em>["<tt>params</tt>"] nor <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Set <em>result</em>'s no-vary params to an empty list.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If <em>value</em>["<tt>params</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>paramsValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>params</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>paramsValue</em> is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Let <em>paramsList</em> be a list containing the <tt>bare_item</tt> component of each tuple in <em>paramsValue</em> (ignoring any parameters).</t>
              </li>
              <li>
                <t>If any item in <em>paramsList</em> is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>paramsList</em>.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Otherwise, if <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let <em>exceptValue</em> be the <tt>item_or_inner_list</tt> component of the tuple <em>value</em>["<tt>except</tt>"] (ignoring any parameters).</t>
              </li>
              <li>
                <t>If <em>exceptValue</em> is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Let <em>exceptList</em> be a list containing the <tt>bare_item</tt> component of each tuple in <em>exceptValue</em> (ignoring any parameters).</t>
              </li>
              <li>
                <t>If any item in <em>exceptList</em> is not a string, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>exceptList</em>.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s no-vary params to <strong>wildcard</strong>.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Return <em>result</em>.</t>
          </li>
        </ol>
        <aside>
          <t>In general, this algorithm is strict and tends to return the <iref item="default URL variation config"/>default URL variation config whenever it sees something it doesn't recognize. This is because the <iref item="default URL variation config"/>default URL variation config behavior will just cause fewer cache hits, which is an acceptable fallback behavior.</t>
        </aside>
        <aside>
          <t>The input to this algorithm is generally obtained by parsing a structured field (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>) using field_type "dictionary".</t>
        </aside>
      </section>
      <section anchor="obtain-a-url-variation-config">
        <name>Obtain a URL variation config</name>
        <t><iref item="obtain a URL variation config" primary="true"/>
To <em><iref item="obtain a URL variation config"/><xref target="obtain-a-url-variation-config" format="none">obtain a URL variation config</xref></em> given an HTTP response (<xref section="3.4" sectionFormat="of" target="HTTP"/>) <em>response</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>fieldValue</em> be the result of parsing the <tt>"No-Vary-Search"</tt> response header field from <em>response</em> as a Dictionary (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>). If parsing fails or the field is absent, let <em>fieldValue</em> be null.</t>
          </li>
          <li>
            <t>Return the result of parsing a URL variation config (<xref target="parse-a-url-variation-config"/>) given <em>fieldValue</em>. <iref item="parse a URL variation config"/></t>
          </li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <t>The following illustrates how various inputs are parsed, in terms of their impact on the resulting no-vary params and vary params:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Result</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong><br/>vary on key order: false</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?1</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong><br/>vary on key order: false</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a")</tt></td>
                <td align="left">no-vary params: « "<tt>a</tt>" »<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: « "<tt>x</tt>" »</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">no-vary params: (empty list)<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=()</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: (empty list)</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are all invalid and will cause the <iref item="default URL variation config"/>default URL variation config to be returned:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Explanation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order="not a boolean"</tt></td>
                <td align="left">
                  <tt>key-order</tt> expects a boolean, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params="not an inner list"</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=(not-a-string)</tt></td>
                <td align="left">
                  <tt>params</tt> items must be strings (tokens are invalid)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?0</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a boolean</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?1</tt></td>
                <td align="left">
                  <tt>params</tt> expects an inner list, not a boolean</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?1, except=("x")</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a"), except=("x")</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=(), except=()</tt></td>
                <td align="left">
                  <tt>params</tt> and <tt>except</tt> cannot both be present</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except="not an inner list"</tt></td>
                <td align="left">
                  <tt>except</tt> expects an inner list, not a string</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=(not-a-string)</tt></td>
                <td align="left">
                  <tt>except</tt> items must be strings (tokens are invalid)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=?1</tt></td>
                <td align="left">
                  <tt>except</tt> expects an inner list, not a boolean</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are valid, but somewhat unconventional. They are shown alongside their more conventional form.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Conventional form</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?1</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: except=("x")</tt>, key-order</td>
                <td align="left">
                  <tt>No-Vary-Search: key-order, except=("x")</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?0</tt></td>
                <td align="left">(omit the header field)</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="parse-a-key">
        <name>Parse a key</name>
        <t><iref item="parse a key" primary="true"/>
To <em><iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref></em> given an ASCII string <em>keyString</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>keyBytes</em> be the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>keyString</em>.</t>
          </li>
          <li>
            <t>Replace any 0x2B (+) in <em>keyBytes</em> with 0x20 (SP).</t>
          </li>
          <li>
            <t>Let <em>keyBytesDecoded</em> be the <eref target="https://url.spec.whatwg.org/#percent-decode">percent-decoding</eref> <xref target="WHATWG-URL"/> of <em>keyBytes</em>.</t>
          </li>
          <li>
            <t>Let <em>keyStringDecoded</em> be the <eref target="https://encoding.spec.whatwg.org/#utf-8-decode-without-bom">UTF-8 decoding without BOM</eref> <xref target="WHATWG-ENCODING"/> of <em>keyBytesDecoded</em>.</t>
          </li>
          <li>
            <t>Return <em>keyStringDecoded</em>.</t>
          </li>
        </ol>
        <section anchor="examples-1">
          <name>Examples</name>
          <t>The <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> algorithm allows encoding non-ASCII key strings in the ASCII structured header field format, similar to how the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/> allows encoding an entire entry list of keys and values in a URI (which is restricted to ASCII characters). For example:</t>
          <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("%C3%A9+%E6%B0%97")
]]></sourcecode>
          <t>Notice that while the input string <tt>"%C3%A9+%E6%B0%97"</tt> consists entirely of ASCII characters (as required at the HTTP layer), the percent-decoding step used by the cache produces a non-ASCII result. This will result in a URL variation config whose no-vary params are « "<tt>é 気</tt>" ». Note that the "<tt>+</tt>" character in the encoded string is mapped to a space (SP). As explained in a later example, the canonicalization process during equivalence testing means this will treat as equivalent URIs such as:</t>
          <ul spacing="normal">
            <li>
              <t><tt>https://example.com/?é 気=1</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?é+気=2</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9%20気=3</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9+%E6%B0%97=4</tt></t>
            </li>
          </ul>
          <t>and so on, since they all are <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">parsed</eref> <xref target="WHATWG-URL"/> to having the same key "<tt>é 気</tt>".</t>
        </section>
      </section>
    </section>
    <section anchor="comparing">
      <name>Comparing</name>
      <t><iref item="equivalent modulo variation config" primary="true"/>
Two <eref target="https://url.spec.whatwg.org/#concept-url">URLs</eref> <xref target="WHATWG-URL"/> <em>urlA</em> and <em>urlB</em> are <em>equivalent modulo variation config</em> given a URL variation config <em>variationConfig</em> if the following algorithm returns true:</t>
      <ol spacing="normal" type="1"><li>
          <t>If the scheme, host, port, or path of <em>urlA</em> and <em>urlB</em> differ, then return false.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em> is equivalent to the <iref item="default URL variation config"/>default URL variation config, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>urlA</em>'s query equals <em>urlB</em>'s query, then return true.</t>
            </li>
            <li>
              <t>Return false.</t>
            </li>
          </ol>
          <t>
In this case, even URL pairs that might appear the same after running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> on their queries, such as <tt>https://example.com/a</tt> and <tt>https://example.com/a?</tt>, or <tt>https://example.com/foo?a=b&amp;&amp;&amp;c</tt> and <tt>https://example.com/foo?a=b&amp;c=</tt>, will be treated as inequivalent.</t>
        </li>
        <li>
          <t>Let <em>searchParamsA</em> and <em>searchParamsB</em> be empty lists.</t>
        </li>
        <li>
          <t>If <em>urlA</em>'s query is not null, then set <em>searchParamsA</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlA</em>'s query.</t>
        </li>
        <li>
          <t>If <em>urlB</em>'s query is not null, then set <em>searchParamsB</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlB</em>'s query.</t>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s no-vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Otherwise, if <em>variationConfig</em>'s vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>variationConfig</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>variationConfig</em>'s vary on key order is false, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>keyLessThan</em> be an algorithm taking as inputs two pairs (<em>keyA</em>, <em>valueA</em>) and (<em>keyB</em>, <em>valueB</em>), which returns whether <em>keyA</em> is <eref target="https://infra.spec.whatwg.org/#code-unit-less-than">code unit less than</eref> <xref target="WHATWG-INFRA"/> <em>keyB</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsA</em> to the result of <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> <em>searchParamsA</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to the result of <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> <em>searchParamsB</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>searchParamsA</em>'s size is not equal to <em>searchParamsB</em>'s size, then return false.</t>
        </li>
        <li>
          <t>Let <em>i</em> be 0.</t>
        </li>
        <li>
          <t>While <em>i</em> &lt; <em>searchParamsA</em>'s size:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>searchParamsA</em>[<em>i</em>][0] does not equal <em>searchParamsB</em>[<em>i</em>][0], then return false.</t>
            </li>
            <li>
              <t>If <em>searchParamsA</em>[<em>i</em>][1] does not equal <em>searchParamsB</em>[<em>i</em>][1], then return false.</t>
            </li>
            <li>
              <t>Set <em>i</em> to <em>i</em> + 1.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Return true.</t>
        </li>
      </ol>
      <section anchor="examples-2">
        <name>Examples</name>
        <t>Due to how the application/x-www-form-urlencoded parser canonicalizes query strings, there are some cases where query strings which do not appear obviously equivalent, will end up being treated as equivalent after parsing.</t>
        <t>So, for example, given any non-default value for the <tt>"No-Vary-Search"</tt> response header field, such as <tt>No-Vary-Search: key-order</tt>, we will have the following equivalences:</t>
        <table>
          <thead>
            <tr>
              <th align="left">First Query</th>
              <th align="left">Second Query</th>
              <th align="left">Explanation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">null</td>
              <td align="left">
                <tt>?</tt></td>
              <td align="left">A null query is parsed the same as an empty string</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">
                <tt>?%61=%78</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=é</tt></td>
              <td align="left">
                <tt>?a=%C3%A9</tt></td>
              <td align="left">Parsing performs percent-decoding</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%f6</tt></td>
              <td align="left">
                <tt>?a=%ef%bf%bd</tt></td>
              <td align="left">An invalid UTF-8 sequence and the literal U+FFFD character are both parsed as U+FFFD (�)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=x&amp;&amp;&amp;&amp;</tt></td>
              <td align="left">
                <tt>?a=x</tt></td>
              <td align="left">Parsing splits on <tt>&amp;</tt> and discards empty strings</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=</tt></td>
              <td align="left">
                <tt>?a</tt></td>
              <td align="left">Both parse as having an empty string value for <tt>a</tt></td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=%20</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>%20</tt> is parsed as U+0020 SPACE</td>
            </tr>
            <tr>
              <td align="left">
                <tt>?a=+</tt></td>
              <td align="left">
                <tt>?a= &amp;</tt></td>
              <td align="left">
                <tt>+</tt> is parsed as U+0020 SPACE</td>
            </tr>
          </tbody>
        </table>
        <t>Note that no Unicode normalization is performed during this comparison. For example, a query string of <tt>?a=%C3%A9</tt> (using the NFC encoding of <tt>é</tt>) and <tt>?a=e%CC%81</tt> (using the NFD encoding of <tt>é</tt>) will not be treated as equivalent.</t>
      </section>
    </section>
    <section anchor="caching">
      <name>Caching</name>
      <t>To reuse a stored response, <xref section="4" sectionFormat="of" target="HTTP-CACHING"/> requires that the presented target URI and that of the stored response match. If a cache implements the <tt>No-Vary-Search</tt> extension, this matching requirement is also satisfied if the URIs are equivalent modulo URL variation config (<xref target="comparing"/>) given the stored response's <tt>No-Vary-Search</tt> header.</t>
      <t>Note that while <xref section="5.2.3" sectionFormat="of" target="HTTP-CACHING"/> defines cache extensions as <tt>Cache-Control</tt> directives, the <tt>"No-Vary-Search"</tt> response header field is defined as a standalone header. This design choice leverages Structured Fields (<xref target="STRUCTURED-FIELDS"/>) to provide a robust parsing model without overloading the existing, complex <tt>Cache-Control</tt> parsing logic.</t>
      <t>The <tt>"No-Vary-Search"</tt> response header field operates in addition to content negotiation and the <tt>Vary</tt> header field (see <xref section="4.1" sectionFormat="of" target="HTTP-CACHING"/>).</t>
      <t>This document does not alter the requirements for cache invalidation (see <xref section="4.4" sectionFormat="of" target="HTTP-CACHING"/>). A cache <bcp14>MAY</bcp14> invalidate stored responses for URIs that are equivalent modulo URL variation config, but is not required to do so. Therefore, state-changing requests might not invalidate all conceptually equivalent responses.</t>
      <t>Cache implementations <bcp14>MAY</bcp14> fail to reuse a stored response whose target URI matches <em>only</em> modulo URL variation config, if the cache has a stored response with a more recent <tt>Date</tt> header field which:</t>
      <ul spacing="normal">
        <li>
          <t>has a target URI which is equal to the presented target URI, excluding the query, and</t>
        </li>
        <li>
          <t>has a non-empty value for the <tt>"No-Vary-Search"</tt> response header field, and</t>
        </li>
        <li>
          <t>has a <tt>"No-Vary-Search"</tt> response header field value different from the stored response being considered for reuse.</t>
        </li>
      </ul>
      <t>When a cache has multiple stored responses with conflicting <tt>"No-Vary-Search"</tt> values, preferring the response with the most recent <tt>Date</tt> header field helps ensure caches converge on the origin's latest caching policy.</t>
      <aside>
        <t>Caches aren't required to reuse stored responses, generally. However, the above expressly empowers caches to, if it is advantageous for performance or other reasons, search a smaller number of stored responses.</t>
        <t>That is, because caches might store more than one response for a given target URI path and authority, they need a way to efficiently look up the <tt>"No-Vary-Search"</tt> response header field value without accessing all cached responses. Such a cache might take steps like the following to identify a stored response in a performant way, before checking the other conditions in <xref section="4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let exactMatch be cache[presentedTargetURI]. If it is a stored response that can be reused, return it.</t>
          </li>
          <li>
            <t>Let targetPath be presentedTargetURI, with query parameters removed.</t>
          </li>
          <li>
            <t>Let lastNVS be mostRecentNVS[targetPath]. If it does not exist, return null.</t>
          </li>
          <li>
            <t>Let simplifiedURL be the result of simplifying presentedTargetURI according to lastNVS (by removing query parameters which are not significant, and <eref target="https://infra.spec.whatwg.org/#list-sort-in-ascending-order">sorting</eref> <xref target="WHATWG-INFRA"/> parameters in ascending order by key, if key order is to be ignored).</t>
          </li>
          <li>
            <t>Let nvsMatch be cache[simplifiedURL]. If it does not exist, return null. (It is assumed that this was written when storing in the cache, in addition to the exact URL.)</t>
          </li>
          <li>
            <t>Let variationConfig be obtained (<xref target="obtain-a-url-variation-config"/>) from nvsMatch.</t>
          </li>
          <li>
            <t>If nvsMatch's target URI and presentedTargetURI are not equivalent modulo URL variation config (<xref target="comparing"/>) given variationConfig, then return null.</t>
          </li>
          <li>
            <t>If nvsMatch is a stored response that can be reused, return it. Otherwise, return null.</t>
          </li>
        </ol>
      </aside>
      <t>To aid cache implementation efficiency, servers <bcp14>SHOULD NOT</bcp14> send different non-empty values for the <tt>"No-Vary-Search"</tt> response header field in response to requests for a given target URI path and authority over time, unless there is a need to update how they handle the query component. Doing so would cause cache implementations that use a strategy like the above to miss some stored responses that could otherwise have been reused.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The main risk to be aware of is a cache returning a response that was originally fetched from a URL different from the one requested. In a web browser, this could cause the user to see a response fetched from a URL different from the one displayed when they hovered a link, or the URL displayed in the URL bar.</t>
      <t>For shared caches, such as CDNs or forward proxies, returning a response for a different URL carries the risk of cross-user state leakage. If a server incorrectly declares that a query parameter does not affect the response, but that parameter actually dictates user-specific or sensitive content, the shared cache might serve one user's personalized response to another user. However, because the origin strictly controls the <tt>"No-Vary-Search"</tt> response header field, it is the origin's responsibility to ensure that ignored parameters are safe to disregard for all users.</t>
      <t>The <tt>"No-Vary-Search"</tt> response header field alters the algorithm that caches use for URI identifier comparison. As discussed in <xref target="RFC6943"/>, altering identifier comparison logic can lead to security issues, primarily through "false positives" where two identifiers are incorrectly deemed equivalent.</t>
      <t>Because URL query parsing replaces invalid percent-encoded UTF-8 sequences with <tt>U+FFFD</tt>, lossy decoding can map distinct query strings onto the same cache key (for example, <tt>?a=%f6</tt> and <tt>?a=%ef%bf%bd</tt>). Origins should not rely on invalid percent-encoded sequences being distinguishable, as this is a concrete example of the false positives warned about in <xref target="RFC6943"/>.</t>
      <t>Incorrect configuration of this field can exacerbate cache poisoning or data leakage risks by causing such false positives. Origin servers <bcp14>MUST NOT</bcp14> declare a parameter as no-vary if doing so would bypass server processing required for safe response reuse. This includes parameters used for authorization, user identification, signature verification, user consent, routing, auditing, revocation, or any other security-sensitive operations.</t>
      <t>However, since the impact is limited to query parameters, this does not cross the relevant security boundary, which is the origin (<xref target="ORIGIN"/>). (See also the <eref target="https://url.spec.whatwg.org/#concept-url-host">host</eref> from <eref target="https://url.spec.whatwg.org/#url-rendering-simplification">the perspective of web browser security UI</eref> <xref target="WHATWG-URL"/>). Indeed, origins already have complete control over how they present URLs and response bodies, including on the client side via technology such as <eref target="https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-history-replacestate">history.replaceState()</eref> <xref target="HTML"/> or service workers.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This proposal is adjacent to the highly-privacy-relevant space of <eref target="https://privacycg.github.io/nav-tracking-mitigations/#terminology">navigational tracking</eref>, which often uses query parameters to pass along user identifiers. If an origin were to encode user identifiers in its URI, this proposal can reduce user tracking by private caches, since preventing server processing of such user IDs bypasses the server in favor of the cache. It does not interfere with <eref target="https://privacycg.github.io/nav-tracking-mitigations/#deployed-mitigations">existing navigational tracking mitigations</eref>, or any known future ones being contemplated. <xref target="NAV-TRACKING-MITIGATIONS"/></t>
      <t>However, this tracking reduction does not fully apply to shared caches (such as content delivery networks and forward proxies), which still receive the requests containing the identifiers. Furthermore, an errant configuration that incorrectly ignores parameters related to user identity or private state could expose cached content meant for one user to another. While this mistake can occur with standard caching, the <tt>"No-Vary-Search"</tt> response header field increases the surface area for such misconfigurations, making it critical that origins accurately classify their query parameters.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="http-field-names">
        <name>HTTP Field Names</name>
        <t>IANA is requested to enter the following into the Hypertext Transfer Protocol (HTTP) Field Name Registry (<eref target="https://www.iana.org/assignments/http-fields/http-fields.xhtml">https://www.iana.org/assignments/http-fields/http-fields.xhtml</eref>):</t>
        <dl>
          <dt>Field Name:</dt>
          <dd>
            <t><tt>No-Vary-Search</tt></t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>permanent</t>
          </dd>
          <dt>Structured Type:</dt>
          <dd>
            <t>Dictionary</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>this document</t>
          </dd>
          <dt>Comments:</dt>
          <dd>
            <t>(none)</t>
          </dd>
        </dl>
      </section>
      <section anchor="no-vary-search-dictionary-keys-registry">
        <name>No-Vary-Search Dictionary Keys Registry</name>
        <t>IANA is requested to create a new registry, "No-Vary-Search Dictionary Keys", at <eref target="https://www.iana.org/assignments/http-fields/">https://www.iana.org/assignments/http-fields/</eref>.</t>
        <t>The registration policy is "IETF Review" (see Section 4.8 of <xref target="RFC8126"/>).</t>
        <t>A registration request <bcp14>MUST</bcp14> include the following fields:</t>
        <ul spacing="normal">
          <li>
            <t>Key: the dictionary key for the <tt>"No-Vary-Search"</tt> response header field</t>
          </li>
          <li>
            <t>Description: a brief description of the key's purpose</t>
          </li>
          <li>
            <t>Reference: a pointer to the specification that defines the key</t>
          </li>
        </ul>
        <t>The initial contents of this registry are:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Key</th>
              <th align="left">Description</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>key-order</tt></td>
              <td align="left">Indicates if query parameter order affects caching</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>params</tt></td>
              <td align="left">A list of query parameters that do not affect caching</td>
              <td align="left">this document</td>
            </tr>
            <tr>
              <td align="left">
                <tt>except</tt></td>
              <td align="left">A list of query parameters that affect caching</td>
              <td align="left">this document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="WHATWG-ENCODING" target="https://encoding.spec.whatwg.org/">
          <front>
            <title>Encoding Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="May" day="21"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-INFRA" target="https://infra.spec.whatwg.org/">
          <front>
            <title>Infra Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google LLC</organization>
            </author>
            <date year="2026" month="July" day="17"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-URL" target="https://url.spec.whatwg.org/">
          <front>
            <title>URL Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="July" day="06"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date year="2026" month="August" day="11"/>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="NAV-TRACKING-MITIGATIONS" target="https://privacycg.github.io/nav-tracking-mitigations/">
          <front>
            <title>Navigational-Tracking Mitigations</title>
            <author initials="P." surname="Snyder" fullname="Pete Snyder">
              <organization>Brave Software, Inc.</organization>
            </author>
            <author initials="J." surname="Yasskin" fullname="Jeffrey Yasskin">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>W3C Privacy CG</annotation>
        </reference>
        <reference anchor="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="RFC6943">
          <front>
            <title>Issues in Identifier Comparison for Security Purposes</title>
            <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
            <date month="May" year="2013"/>
            <abstract>
              <t>Identifiers such as hostnames, URIs, IP addresses, and email addresses are often used in security contexts to identify security principals and resources. In such contexts, an identifier presented via some protocol is often compared using some policy to make security decisions such as whether the security principal may access the resource, what level of authentication or encryption is required, etc. If the parties involved in a security decision use different algorithms to compare identifiers, then failure scenarios ranging from denial of service to elevation of privilege can result. This document provides a discussion of these issues that designers should consider when defining identifiers and protocols, and when constructing architectures that use multiple protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6943"/>
          <seriesInfo name="DOI" value="10.17487/RFC6943"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
    </references>
    <?line 511?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document benefited from valuable reviews and suggestions by:</t>
      <ul spacing="normal">
        <li>
          <t>Adam Rice</t>
        </li>
        <li>
          <t>Julian Reschke</t>
        </li>
        <li>
          <t>Kevin McNee</t>
        </li>
        <li>
          <t>Liviu Tinta</t>
        </li>
        <li>
          <t>Mark Nottingham</t>
        </li>
        <li>
          <t>Martin Thomson</t>
        </li>
        <li>
          <t>Valentin Gosu</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
gR/gLWZz8HnhwQ8UtIBH32a6bP1fsQA63tKBAAA=

-->

</rfc>
