<?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-07" 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-07"/>
    <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="03"/>
    <area>Web and Internet Transport</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 113?>

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

<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).</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 or neither exists, then return the <iref item="default URL variation config"/>default URL variation config.</t>
          </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 array, 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 array, 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>
          <t>However, unrecognized keys at the top level are ignored, to make it easier to extend this specification in the future. To avoid misbehavior with existing client software, such extensions will likely expand, rather than reduce, the set of requests that a cached response can match.</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"/>).</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 User Agent produces a non-ASCII result. This will result in a URL variation config whose 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, username, password, 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>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 more recently stored a response 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>
      <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 pathname, 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 pathname 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. Parameters <bcp14>MUST NOT</bcp14> be ignored 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> 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. However, we believe this proposal itself does not have privacy impacts. 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. Indeed, if a page were to encode user identifiers in its URI, the only ability this proposal gives is to <em>reduce</em> such user tracking by preventing server processing of such user IDs (since the server is bypassed in favor of the cache). <xref target="NAV-TRACKING-MITIGATIONS"/></t>
      <t>However, 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>
  </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="FETCH" target="https://fetch.spec.whatwg.org/">
          <front>
            <title>Fetch 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="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>
      </references>
    </references>
    <?line 482?>

<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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
A7y8ZAY+KTz4lhxcePR1ovPW/wEn6tCRrXQAAA==

-->

</rfc>
