<?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.6.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meenan-httpbis-compression-dictionary-02" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="compression-dictionary">Compression Dictionary Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-meenan-httpbis-compression-dictionary-02"/>
    <author initials="P." surname="Meenan" fullname="Patrick Meenan">
      <organization>Google LLC</organization>
      <address>
        <email>pmeenan@google.com</email>
      </address>
    </author>
    <author initials="Y." surname="Weiss" fullname="Yoav Weiss">
      <organization>Google LLC</organization>
      <address>
        <email>yoavweiss@google.com</email>
      </address>
    </author>
    <date year="2023" month="June" day="30"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>
    <keyword>compression dictionary</keyword>
    <keyword>shared brotli</keyword>
    <keyword>zstandard dictionary</keyword>
    <abstract>
      <?line 49?>

<t>This specification defines a mechanism for using designated <xref target="HTTP"/> responses
as an external dictionary for future HTTP responses for compression schemes
that support using external dictionaries (e.g. <xref target="Brotli"/> and <xref target="Zstandard"/>).</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://pmeenan.github.io/i-d-compression-dictionary/draft-meenan-httpbis-compression-dictionary.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meenan-httpbis-compression-dictionary/"/>.
      </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/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/pmeenan/i-d-compression-dictionary"/>.</t>
    </note>
  </front>
  <middle>
    <?line 55?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This specification defines a mechanism for using designated <xref target="HTTP"/> responses
as an external dictionary for future HTTP responses for compression schemes
that support using external dictionaries (e.g. <xref target="Brotli"/> and <xref target="Zstandard"/>).</t>
      <t>This document describes the HTTP headers used for negotiating dictionary usage
and registers media types for content encoding Brotli and Zstandard using a
negotiated dictionary.</t>
    </section>
    <section anchor="dictionary-negotiation">
      <name>Dictionary Negotiation</name>
      <section anchor="use-as-dictionary">
        <name>Use-As-Dictionary</name>
        <t>When responding to a HTTP Request, a server can advertise that the response can
be used as a dictionary for future requests for URLs that match the pattern
specified in the Use-As-Dictionary response header.</t>
        <t>The Use-As-Dictionary response header is a Structured Field <xref target="RFC8941"/>
sf-dictionary with values for "match", "ttl" and "hashes".</t>
        <section anchor="match">
          <name>match</name>
          <t>The "match" value of the Use-As-Dictionary header is a sf-string value that
provides an URL-matching pattern for requests where the dictionary can be used.</t>
          <t>The sf-string is parsed as a URL <xref target="RFC3986"/>, and supports absolute URLs
as well as relative URLs. When stored, any relative URLs MUST be expanded
so that only absolute URL patterns are used for matching against requests.</t>
          <t>The match URL supports using * as a wildcard within the match string for
pattern-matching multiple URLs. URLs with a natural * in them are not directly
supported unless they can rely on the behavior of * matching an arbitrary
string.</t>
          <t>The "match" value is required and MUST be included in the Use-As-Dictionary
sf-dictionary for the dictionary to be considered valid.</t>
        </section>
        <section anchor="ttl">
          <name>ttl</name>
          <t>The "ttl" value of the Use-As-Dictionary header is a sf-integer value that
provides the time in seconds that the dictionary is valid for (time to live).</t>
          <t>This is independent of the cache lifetime of the resource being used for the
dictionary. If the underlying resource is evicted from cache then it is also
removed but this allows for setting an explicit time to live for use as a
dictionary independent of the underlying resource in cache. Expired resources
can still be useful as dictionaries while they are in cache and can be used for
fetching updates of the expired resource. It can also be useful to artificially
limit the life of a dictionary in cases where the dictionary is updated
frequently, to limit the number of possible incoming dictionary values.</t>
          <t>The "ttl" value is optional and defaults to 31536000 (1 year).</t>
        </section>
        <section anchor="hashes">
          <name>hashes</name>
          <t>The "hashes" value of the Use-As-Dictionary header is a inner-list value
that provides a list of supported hash algorithms in order of server
preference.</t>
          <t>The dictionaries are identified by the hash of their contents and this value
allows for negotiation of the algorithm to use.</t>
          <t>The "hashes" value is optional and defaults to (sha-256).</t>
        </section>
        <section anchor="examples">
          <name>Examples</name>
          <section anchor="path-prefix">
            <name>Path Prefix</name>
            <t>A response that contained a response header:</t>
            <t>Use-As-Dictionary: match="/product/*", ttl=604800, hashes=(sha-256 sha-512)</t>
            <t>Would specify matching any URL with a path prefix of /product/ on the same
<xref target="Origin"/> as the original request, expiring as a dictionary in 7 days
independent of the cache lifetime of the resource, and advertise support for
both sha-256 and sha-512 hash algorithms.</t>
          </section>
          <section anchor="versioned-directories">
            <name>Versioned Directories</name>
            <t>A response that contained a response header:</t>
            <t>Use-As-Dictionary: match="/app/*/main.js"</t>
            <t>Would match main.js in any directory under /app/, expiring as a dictionary in
one year and support using the sha-256 hash algorithm.</t>
          </section>
        </section>
      </section>
      <section anchor="sec-available-dictionary">
        <name>Sec-Available-Dictionary</name>
        <t>When a HTTP client makes a request for a resource for which it has an
appropriate dictionary, it can add a "Sec-Available-Dictionary" request header
to the request to indicate to the server that it has a dictionary available to
use for compression.</t>
        <t>The "Sec-Available-Dictionary" request header is a Structured Field <xref target="RFC8941"/>
sf-string value that contains a Base16-encoded <xref target="RFC4648"/> hash of the contents
of a single available dictionary calculated using one of the algorithms
advertised as being supported by the server.</t>
        <t>The client MUST only send a single "Sec-Available-Dictionary" request header
with a single hash value for the best available match that it has available.</t>
        <t>For example:
Sec-Available-Dictionary: A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E</t>
        <section anchor="dictionary-freshness-requirement">
          <name>Dictionary freshness requirement</name>
          <t>To be considered as a match, the dictionary must not yet be expired as a
dictionary. When iterating through dictionaries looking for a match, the
expiration time of the dictionary is calculated by taking the last time the
dictionary was written and adding the "ttl" seconds from the
"Use-As-Dictionary" response. If the current time is beyond the expiration time
of the dictionary, it MUST be ignored.</t>
        </section>
        <section anchor="dictionary-url-matching">
          <name>Dictionary URL matching</name>
          <t>When a dictionary is stored as a result of a "Use-As-Dictionary" directive, it
includes a "match" string with the URL pattern of request URLs that the
dictionary can be used for.</t>
          <t>When comparing request URLs to the available dictionary match patterns, the
comparison should account for the * wildcard when matching against request
URLs. This can be accomplished with the following algorithm which returns TRUE
for a successful match and FALSE for no-match:</t>
          <ol spacing="normal" type="1"><li>Let MATCH represent the absolute URL pattern from the "match" value for the
given dictionary.</li>
            <li>LET URL represent the request URL being checked.</li>
            <li>If there are no * characters in MATCH:
  a. If the MATCH and URL strings are identical, return TRUE.
  b. Else, return FALSE.</li>
            <li>If there is a single * character in MATCH and it is at the end of the
string:
  a. If the MATCH string is identical to the start of the URL string, return
  TRUE.
  b. Else, return FALSE.</li>
            <li>Split the MATCH string by the * character into an array of MATCHES
(excluding the * deliminator from the individual entries).</li>
            <li>Pop the first entry in MATCHES from the front of the array into PATTERN.
  a. If PATTERN is identical to the start of the URL string, remove the
  beginning of the URL string until the end of the match to PATTERN.
  b. Else, return FALSE.</li>
            <li>If there is not a * character at the end of MATCH:
  a. Pop the last entry in MATCHES from the end of the array into PATTERN.
  b. If PATTERN is identical to the end of the URL string, remove the end of
  the URL string to the beginning of the match to PATTERN.
  c. Else, return FALSE.</li>
            <li>Pop each entry off of the front of the MATCHES array into PATTERN. For
each PATTERN, in order:
  a. Search for PATTERN in URL from the beginning of URL and stop at the first
  match.
  b. If no match is found, return FALSE.
  c. Remove the beginning of the URL string until the end of the match to the
  first occurrence of PATTERN.</li>
            <li>Return TRUE.</li>
          </ol>
        </section>
        <section anchor="multiple-matching-dictionaries">
          <name>Multiple matching dictionaries</name>
          <t>When there are multiple dictionaries that match a given request URL, the client
MUST pick the dictionary with the longest match pattern string length.</t>
        </section>
      </section>
    </section>
    <section anchor="negotiating-the-compression-algorithm">
      <name>Negotiating the compression algorithm</name>
      <t>When a compression dictionary is available for use for a given request, the
algorithm to be used is negotiated through the regular mechanism for
negotiating content encoding in HTTP.</t>
      <t>This document introduces two new content encoding algorithms:</t>
      <t>"br-d" - Brotli using an external compression dictionary.
"zstd-d" - Zstandard using an external compression dictionary.</t>
      <t>The dictionary to use is negotiated separately and advertised in the
"Sec-Available-Dictionary" request header.</t>
      <section anchor="accept-encoding">
        <name>Accept-Encoding</name>
        <t>The client adds the algorithms that it supports to the "Accept-Encoding"
request header. e.g.:</t>
        <t>Accept-Encoding: gzip, deflate, br, zstd, br-d, zstd-d</t>
      </section>
      <section anchor="content-encoding">
        <name>Content-Encoding</name>
        <t>If a server supports one of the dictionary algorithms advertised by the client
and chooses to compress the content of the response using the dictionary that
the client has advertised then it sets the "Content-Encoding" response header
to the appropriate value for the algorithm selected. e.g.:</t>
        <t>Content-Encoding: br-d</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="content-encoding-1">
        <name>Content Encoding</name>
        <t>IANA will add the following entries to the "HTTP Content Coding Registry"
within the "Hypertext Transfer Protocol (HTTP) Parameters" registry:</t>
        <t>Name: br-d
Description: A stream of bytes compressed using the Brotli protocol with an
external dictionary</t>
        <t>Name: zstd-d
Description: A stream of bytes compressed using the Zstandard protocol with
an external dictionary</t>
      </section>
      <section anchor="header-field-registration">
        <name>Header Field Registration</name>
      </section>
    </section>
    <section anchor="compatibility-considerations">
      <name>Compatibility Considerations</name>
      <t>To minimize the risk of middle-boxes incorrectly processing
dictionary-compressed responses, compression dictionary transport MUST only
be used in secure contexts (HTTPS).</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations for <xref target="Brotli"/> and <xref target="Zstandard"/> apply to the
dictionary-based versions of the respective algorithms.</t>
      <section anchor="changing-content">
        <name>Changing content</name>
        <t>The dictionary must be treated with the same security precautions as
the content, because a change to the dictionary can result in a
change to the decompressed content.</t>
      </section>
      <section anchor="reading-content">
        <name>Reading content</name>
        <t>The CRIME attack shows that it's a bad idea to compress data from
mixed (e.g. public and private) sources -- the data sources include
not only the compressed data but also the dictionaries. For example,
if you compress secret cookies using a public-data-only dictionary,
you still leak information about the cookies.</t>
        <t>Not only can the dictionary reveal information about the compressed
data, but vice versa, data compressed with the dictionary can reveal
the contents of the dictionary when an adversary can control parts of
data to compress and see the compressed size. On the other hand, if
the adversary can control the dictionary, the adversary can learn
information about the compressed data.</t>
      </section>
      <section anchor="security-mitigations">
        <name>Security Mitigations</name>
        <t>If any of the mitigations do not pass, the client MUST drop the response and
return an error.</t>
        <section anchor="cross-origin-protection">
          <name>Cross-origin protection</name>
          <t>To make sure that a dictionary can only impact content from the same origin
where the dictionary was served, the "match" pattern used for matching a
dictionary to requests MUST be for the same origin that the dictionary
is served from.</t>
        </section>
        <section anchor="response-readability">
          <name>Response readability</name>
          <t>For clients, like web browsers, that provide additional protection against the
readability of the payload of a response and against user tracking, additional
protections MUST be taken to make sure that the use of dictionary-based
compression does not reveal information that would not otherwise be available.</t>
          <t>In these cases, dictionary compression MUST only be used when both the
dictionary and the compressed response are fully readable by the client.</t>
          <t>In browser terms, that means that both are either same-origin to the context
they are being fetched from or that both include an
"Access-Control-Allow-Origin" response header that matches the "Origin" request
header they are fetched from.</t>
        </section>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Since dictionaries are advertised in future requests using the hash of the
content of the dictionary, it is possible to abuse the dictionary to turn it
into a tracking cookie.</t>
      <t>To mitigate any additional tracking concerns, clients MUST treat dictionaries
in the same way that they treat cookies. This includes partitioning the storage
as cookies are partitioned as well as clearing the dictionaries whenever
cookies are cleared.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Informative References</name>
      <reference anchor="Brotli">
        <front>
          <title>Brotli Compressed Data Format</title>
          <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
          <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
          <date month="July" year="2016"/>
          <abstract>
            <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7932"/>
        <seriesInfo name="DOI" value="10.17487/RFC7932"/>
      </reference>
      <reference anchor="Zstandard">
        <front>
          <title>Zstandard Compression and the 'application/zstd' Media Type</title>
          <author fullname="Y. Collet" initials="Y." surname="Collet"/>
          <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
          <date month="February" year="2021"/>
          <abstract>
            <t>Zstandard, or "zstd" (pronounced "zee standard"), is a lossless data compression mechanism. This document describes the mechanism and registers a media type, content encoding, and a structured syntax suffix to be used when transporting zstd-compressed content via MIME.</t>
            <t>Despite use of the word "standard" as part of Zstandard, readers are advised that this document is not an Internet Standards Track specification; it is being published for informational purposes only.</t>
            <t>This document replaces and obsoletes RFC 8478.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8878"/>
        <seriesInfo name="DOI" value="10.17487/RFC8878"/>
      </reference>
      <reference anchor="HTTP">
        <front>
          <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
          <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
          <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
          <date month="June" year="2014"/>
          <abstract>
            <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7230"/>
        <seriesInfo name="DOI" value="10.17487/RFC7230"/>
      </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="RFC3986">
        <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="RFC8941">
        <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="February" year="2021"/>
          <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 that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8941"/>
        <seriesInfo name="DOI" value="10.17487/RFC8941"/>
      </reference>
      <reference anchor="RFC4648">
        <front>
          <title>The Base16, Base32, and Base64 Data Encodings</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <date month="October" year="2006"/>
          <abstract>
            <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4648"/>
        <seriesInfo name="DOI" value="10.17487/RFC4648"/>
      </reference>
    </references>
    <?line 335?>



  </back>
  <!-- ##markdown-source:
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
AAA=

-->

</rfc>
