<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-no-vary-search-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <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-08"/>
    <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="August" day="12"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 104?>

<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 108?>

<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>If <em>value</em>["<tt>key-order</tt>"] 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>value</em>["<tt>key-order</tt>"].</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>If <em>value</em>["<tt>params</tt>"] is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>params</tt>"] 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>value</em>["<tt>params</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s no-vary params is an error, 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 <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>If <em>value</em>["<tt>except</tt>"] is not an inner list, then return the <iref item="default URL variation config"/>default URL variation config.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>except</tt>"] 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>value</em>["<tt>except</tt>"].</t>
              </li>
              <li>
                <t>If any item in <em>result</em>'s vary params is an error, 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 <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: 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>
          <!-- link "a later example" and "equivalence testing" -->

<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">Both values are 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>This document does not alter the requirements for cache invalidation (see Section 4.4 of <xref 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>Note that the <tt>"No-Vary-Search"</tt> response header field operates in addition to content negotiation and the <tt>Vary</tt> header field (see Section 4.1 of <xref target="HTTP-CACHING"/>).</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>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>n.d.</date>
          </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>n.d.</date>
          </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>n.d.</date>
          </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>n.d.</date>
          </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 501?>

<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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
Fy58SwE0XPo602Xr/wBK3tFfzXwAAA==

-->

</rfc>
