<?xml version='1.0' encoding='utf-8'?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.13 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902"
     docName="draft-ietf-httpbis-client-hints-15" category="exp"
     obsoletes="" updates="" submissionType="IETF" xml:lang="en"
     tocInclude="true" sortRefs="true" symRefs="true" version="3"
     number="8942" consensus="true">
  <!-- xml2rfc v2v3 conversion 2.47.0 -->
  <front>
    <title>HTTP Client Hints</title>
    <seriesInfo name="RFC" value="8942"/>
    <author initials="I." surname="Grigorik" fullname="Ilya Grigorik">
      <organization>Google</organization>
      <address>
        <email>ilya@igvita.com</email>
        <uri>https://www.igvita.com/</uri>
      </address>
    </author>
    <author initials="Y." surname="Weiss" fullname="Yoav Weiss">
      <organization>Google</organization>
      <address>
        <email>yoav@yoav.ws</email>
        <uri>https://blog.yoav.ws/</uri>
      </address>
    </author>
    <date month="February" year="2021"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>

    <keyword>Content Negotiation</keyword>
    <abstract>
      <t>HTTP defines proactive content negotiation to allow servers to select
      the appropriate response for a given request, based upon the user
      agent's characteristics, as expressed in request headers. In practice,
      user agents are often unwilling to send those request headers, because
      it is not clear whether they will be used, and sending them impacts both
      performance and privacy.</t> 
      <t>This document defines an Accept-CH response header that servers can
      use to advertise their use of request headers for proactive content
      negotiation, along with a set of guidelines for the creation of such
      headers, colloquially known as "Client Hints."</t> 
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>There are thousands of different devices accessing the web, each with
      different device capabilities and preference information. These device
      capabilities include hardware and software characteristics, as well as
      dynamic user and user agent preferences. Historically, applications that
      wanted the server to optimize content delivery and user experience based
      on such capabilities had to rely on passive identification (e.g., by
      matching the User-Agent header field (<xref
      target="RFC7231" sectionFormat="of" section="5.5.3"/>) against an established database of
      user agent signatures), use HTTP cookies <xref target="RFC6265"
      format="default"/> and URL parameters, or use some combination of these
      and similar mechanisms to enable ad hoc content negotiation.</t> 
      <t>Such techniques are expensive to set up and maintain and are not
      portable across both applications and servers. They also make it hard
      for both user agent and server to understand which data are required and
      are in use during the negotiation:</t> 
      <ul spacing="compact">
        <li>User agent detection cannot reliably identify all static
	variables, cannot infer dynamic user agent preferences, requires an
	external device database, is not cache friendly, and is reliant on a
	passive fingerprinting surface.</li> 
        <li>Cookie-based approaches are not portable across applications and
	servers, impose additional client-side latency by requiring JavaScript
	execution, and are not cache friendly.</li> 
        <li>URL parameters, similar to cookie-based approaches, suffer from
	lack of portability and are hard to deploy due to a requirement to
	encode content negotiation data inside of the URL of each
	resource.</li> 
      </ul>
      <t>Proactive content negotiation (<xref target="RFC7231"
      sectionFormat="of" section="3.4.1"/>) offers an alternative approach;
      user agents use specified, well-defined request headers to advertise
      their capabilities and characteristics, so that servers can select (or
      formulate) an appropriate response based on those request headers (or on
      other, implicit characteristics).</t> 

      <t>However, traditional proactive content negotiation techniques often
      mean that user agents send these request headers prolifically. This
      causes performance concerns (because it creates "bloat" in requests), as
      well as privacy issues; passively providing such information allows
      servers to silently fingerprint the user.</t> 

      <t>This document defines Client Hints, a framework that enables servers
      to opt-in to specific proactive content negotiation features, adapting
      their content accordingly, as well as guidelines for content negotiation
      mechanisms that use the framework. This document also defines a new
      response header, Accept-CH, that allows an origin server to explicitly
      ask that user agents send these headers in requests.</t> 

      <t>Client Hints mitigate performance concerns by assuring that user
      agents will only send the request headers when they're actually going to
      be used, and they mitigate privacy concerns of passive fingerprinting by requiring
      explicit opt-in and disclosure of required headers by the server through
      the use of the Accept-CH response header, turning passive fingerprinting
      vectors into active ones.</t> 
      <t>The document does not define specific usages of Client Hints. Such
      usages need to be defined in their respective specifications.</t> 
      <t>One example of such usage is the User-Agent Client Hints <xref
      target="UA-CH" format="default"/>.</t> 
      <section anchor="notational-conventions" numbered="true" toc="default">
        <name>Notational Conventions</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&nbsp;14 <xref target="RFC2119"/> <xref target="RFC8174"/> 
    when, and only when, they appear in all capitals, as shown here.
        </t>
        <t>This document uses the Augmented Backus-Naur Form (ABNF) notation
	of <xref target="RFC5234" format="default"/>.</t> 
      </section>
    </section>
    <section anchor="client-hint-request-header-fields" numbered="true" toc="default">
      <name>Client Hints Request Header Fields</name>
      <t>A Client Hints request header field is an HTTP header field that is
      used by HTTP user agents to indicate data that can be used by the server
      to select an appropriate response. Each one conveys user-agent
      preferences that the server can use to adapt and optimize the
      response.</t> 

      <section anchor="sending-client-hints" numbered="true" toc="default">
        <name>Sending Client Hints</name>
        <t>User agents choose what Client Hints to send in a request based on
	their default settings, user configuration, and server preferences
	expressed in <tt>Accept-CH</tt>. The user agent and server can use an
	opt-in mechanism outlined below to negotiate which header fields need
	to be sent to allow for efficient content adaption, and they can optionally use
	additional mechanisms (e.g., as outlined in <xref
	target="CLIENT-HINTS-INFRASTRUCTURE" format="default"/>) to negotiate
	delegation policies that control access of third parties to those same
	header fields. User agents <bcp14>SHOULD</bcp14> require an opt-in to send any hints
	that are not considered low-entropy.  See the low-entropy hint table
	at <xref target="CLIENT-HINTS-INFRASTRUCTURE" format="default"/> for
	examples of hints that expose low amounts of entropy.</t> 
        <t>Implementers need to be aware of the fingerprinting implications
	when implementing support for Client Hints and follow the
	considerations outlined in the Security Considerations section of this
	document (see <xref target="security-considerations"
	format="default"/>).</t> 
      </section>
      <section anchor="server-processing-of-client-hints" numbered="true" toc="default">
        <name>Server Processing of Client Hints</name>
        <t>When presented with a request that contains one or more Client Hints
	header fields, servers can optimize the response based upon the
	information in them. When doing so, and if the resource is cacheable,
	the server <bcp14>MUST</bcp14> also generate a Vary response header field
	(<xref target="RFC7231" sectionFormat="of" section="7.1.4"/>) to indicate which
	hints can affect the selected response and whether the selected
	response is appropriate for a later request.</t> 
        <t>Servers <bcp14>MUST</bcp14> ignore hints they do not understand nor support. There
	is no mechanism for servers to indicate to user agents that hints were
	ignored.</t> 
        <t>Furthermore, the server can generate additional response header
	fields (as specified by the hint or hints in use) that convey related
	values to aid client processing.</t> 
      </section>
    </section>
    <section anchor="advertising-server-support" numbered="true" toc="default">
      <name>Advertising Server Support</name>
      <t>Servers can advertise support for Client Hints using the mechanism described below.</t>
      <section anchor="accept-ch" numbered="true" toc="default">
        <name>The Accept-CH Response Header Field</name>
        <t>The Accept-CH response header field indicates server support for
	the hints indicated in its value. Servers wishing to receive user agent
	information through Client Hints <bcp14>SHOULD</bcp14> add the Accept-CH response
	header to their responses as early as possible.</t> 
        <t>Accept-CH is a Structured Header <xref
	target="RFC8941" format="default"/>. Its
	value <bcp14>MUST</bcp14> be an sf-list (<xref
	target="RFC8941" sectionFormat="of"
	section="3.1"/>) whose members are Tokens (<xref
	target="RFC8941" sectionFormat="of"
	section="3.3.4"/>). Its ABNF is:</t> 

<sourcecode type="abnf"><![CDATA[
  Accept-CH = sf-list
]]></sourcecode>
        <t>For example:</t>
<sourcecode type="http-message"><![CDATA[
Accept-CH: Sec-CH-Example, Sec-CH-Example-2
]]></sourcecode>
        <t>When a user agent receives an HTTP response containing
	<tt>Accept-CH</tt>, it indicates that the origin opts-in to receive
	the indicated request header fields for subsequent same-origin
	requests. The opt-in <bcp14>MUST</bcp14> be ignored if delivered over non-secure
	transport (using a scheme different from HTTPS). It <bcp14>SHOULD</bcp14> be
	persisted and bound to the origin to enable delivery of Client Hints
	on subsequent requests to the server's origin, for the duration of the
	user's session (as defined by the user agent). An opt-in overrides
	previous persisted opt-in values and <bcp14>SHOULD</bcp14> be persisted in its
	stead.</t>   
        <t>Based on the Accept-CH example above, which is received in response
	to a user agent navigating to "https://site.example", and delivered
	over a secure transport, persisted Accept-CH preferences will be bound
	to "https://site.example". It will then use it for navigations to
	for example, "https://site.example/foobar.html", but not to, for example,
	"https://foobar.site.example/". It will similarly use the preference
	for any same-origin resource requests (e.g., to
	"https://site.example/image.jpg") initiated by the page constructed
	from the navigation's response, but not to cross-origin resource
	requests (e.g., "https://thirdparty.example/resource.js"). This
	preference will not extend to resource requests initiated to
	"https://site.example" from other origins (e.g., from navigations to
	"https://other.example/").</t> 
      </section>
      <section anchor="interaction-with-caches" numbered="true" toc="default">
        <name>Interaction with Caches</name>
        <t>When selecting a response based on one or more Client Hints, and if
	the resource is cacheable, the server needs to generate a Vary
	response header field <xref target="RFC7234" format="default"/> to
	indicate which hints can affect the selected response and whether the
	selected response is appropriate for a later request.</t> 

<sourcecode type="http-message"><![CDATA[
Vary: Sec-CH-Example
]]></sourcecode>
        <t>The above example indicates that the cache key needs to include the
	Sec-CH-Example header field.</t> 

<sourcecode type="http-message"><![CDATA[
Vary: Sec-CH-Example, Sec-CH-Example-2
]]></sourcecode>
        <t>The above example indicates that the cache key needs to include the
	Sec-CH-Example and Sec-CH-Example-2 header fields.</t> 
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <section anchor="information-exposure" numbered="true" toc="default">
        <name>Information Exposure</name>
        <t>Request header fields used in features relying on this document
	expose information about the user's environment to enable
	privacy-preserving proactive content negotiation and avoid exposing
	passive fingerprinting vectors. However, implementers need to bear in
	mind that in the worst case, uncontrolled and unmonitored active
	fingerprinting is not better than passive fingerprinting. In order to
	provide user privacy benefits, user agents need to apply further
	policies that prevent abuse of the information exposed by features
	using Client Hints.</t> 

        <t>The information exposed by features might reveal new information
	about the user, and implementers ought to consider the following
	considerations, recommendations, and best practices.</t> 

        <t>The underlying assumption is that exposing information about the
	user as a request header is equivalent (from a security perspective)
	to exposing this information by other means. (For example, if the
	request's origin can access that information using JavaScript APIs
	and transmit it to its servers.)</t> 

        <t>Because Client Hints is an explicit opt-in mechanism, it means
	that servers wanting access to information about the user's
	environment need to actively ask for it, enabling clients and privacy
	researchers to keep track of which origins collect that data, and
	potentially act upon it. 
    The header-based opt-in means that removal of passive fingerprinting vectors
    is possible. As an example, the user agent can reduce the information
    exposed by the User-Agent string, while enabling active access to that
    information through User-Agent Client Hints <xref target="UA-CH"
    format="default"/>.
    Otherwise, the user agent can expose information already available through
    script (e.g., the Save-Data Client Hints <eref brackets="angle"
    target="https://wicg.github.io/savedata/#save-data-request-header-field"></eref>),
    without increasing the passive fingerprinting surface. User agents supporting
    Client Hints features which send certain information to opted-in servers
    <bcp14>SHOULD</bcp14> avoid sending the equivalent information passively.</t>

        <t>Therefore, features relying on this document to define Client Hint
	headers <bcp14>MUST NOT</bcp14> provide new information that is otherwise not made
	available to the application by the user agent, such as existing
	request headers, HTML, CSS, or JavaScript.</t>
 
        <t>Such features need to take into account the following aspects of
	the exposed information:</t>
 
        <dl newline="false" spacing="normal">
          <dt>Entropy:</dt>
	  <dd>Exposing highly granular data can be used to help
	  identify users across multiple requests to different
	  origins. Reducing the set of header field values that can be
	  expressed, or restricting them to an enumerated range where the
	  advertised value is close to but is not an exact representation of
	  the current value, can improve privacy and reduce risk of
	  linkability by ensuring that the same value is sent by multiple
	  users.</dd> 

          <dt>Sensitivity:</dt>
	  <dd>The feature <bcp14>SHOULD NOT</bcp14> expose user-sensitive
	  information. To that end, information available to the application,
	  but gated behind specific user actions (e.g., a permission prompt or
	  user activation), <bcp14>SHOULD NOT</bcp14> be exposed as a Client Hint.</dd>
 
          <dt>Change over time:</dt>
	  <dd>The feature <bcp14>SHOULD NOT</bcp14> expose user
	  information that changes over time, unless the state change itself
	  is also exposed (e.g., through JavaScript callbacks).</dd> 
        </dl>
        <t>Different features will be positioned in different points in the
	space between low-entropy, non-sensitive, and static information (e.g.,
	user agent information) and high-entropy, sensitive, and dynamic
	information (e.g., geolocation). User agents need to consider the
	value provided by a particular feature vs. these considerations and
	may wish to have different policies regarding that tradeoff on a
	per-feature or other fine-grained basis.</t> 

        <t>Implementers ought to consider both user- and server-controlled
	mechanisms and policies to control which Client Hints header fields
	are advertised:</t> 

        <ul spacing="normal">
          <li>Implementers <bcp14>SHOULD</bcp14> restrict delivery of some or all Client
	  Hints header fields to the opt-in origin only, unless the opt-in
	  origin has explicitly delegated permission to another origin to
	  request Client Hints header fields.</li> 
          <li>Implementers that consider providing user-choice mechanisms that
	  allow users to balance privacy concerns against bandwidth
	  limitations need to also consider that explaining the
	  privacy implications involved to users, such as the risks of passive
	  fingerprinting, may be  challenging or even impractical.</li> 
          <li>Implementations specific to certain use cases or threat models
	  <bcp14>MAY</bcp14> avoid transmitting some or all of the Client Hints header
	  fields. For example, avoid transmission of header fields that can
	  carry higher risks of linkability.</li> 
        </ul>

      <t>User agents <bcp14>MUST</bcp14> clear persisted opt-in preferences when any one of
	site data, browsing cache, cookies, or similar are cleared.</t> 
      </section>
      <section anchor="deployment-and-security-risks" numbered="true" toc="default">
        <name>Deployment and Security Risks</name>
        <t>Deployment of new request headers requires several considerations:</t>
        <ul spacing="compact">
          <li>Potential conflicts due to existing use of a header field name</li>

          <li>Properties of the data communicated in a header field value</li>
        </ul>
        <t>Authors of new Client Hints are advised to carefully consider
	whether they need to be able to be added by client-side content (e.g.,
	scripts) or whether the Client Hints need to be exclusively set by the user
	agent. In the latter case, the Sec- prefix on the header field name
	has the effect of preventing scripts and other application content
	from setting them in user agents. Using the "Sec-" prefix signals to
	servers that the user agent -- and not application content -- generated
	the values. See <xref target="FETCH" format="default"/> for more
	information.</t> 

        <t>By convention, request headers that are Client Hints are encouraged
	to use a CH- prefix, to make them easier to identify as using this
	framework; for example, CH-Foo or, with a "Sec-" prefix,
	Sec-CH-Foo. Doing so makes them easier to identify programmatically
	(e.g., for stripping unrecognized hints from requests by privacy
	filters).</t> 
        <t>A Client Hints request header negotiated using the Accept-CH opt-in
	mechanism <bcp14>MUST</bcp14> have a field name that matches sf-token
	(<xref target="RFC8941" sectionFormat="of"
	section="3.3.4"/>).</t>  
      </section>
      <section anchor="abuse-detection" numbered="true" toc="default">
        <name>Abuse Detection</name>
        <t>A user agent that tracks access to active fingerprinting
	information <bcp14>SHOULD</bcp14> consider emission of Client Hints headers similar
	to the way it would consider access to the equivalent API.</t>
 
        <t>Research into abuse of Client Hints might look at how HTTP
	responses to requests that contain Client Hints differ from those with
	different values and from those without values. This might be used to reveal
	which Client Hints are in use, allowing researchers to further analyze
	that use.</t> 
      </section>
    </section>
    <section anchor="cost-of-sending-hints" numbered="true" toc="default">
      <name>Cost of Sending Hints</name>
      <t>Sending Client Hints to the server incurs an increase in request byte
      size. Some of this increase can be mitigated by HTTP header
      compression schemes, but each new hint sent will still lead to some
      increased bandwidth usage. Servers <bcp14>SHOULD</bcp14> take that into account when
      opting in to receive Client Hints and <bcp14>SHOULD NOT</bcp14> opt-in to receive
      hints unless they are to be used for content adaptation purposes.</t> 

      <t>Due to request byte size increase, features relying on this document
      to define Client Hints <bcp14>MAY</bcp14> consider restricting sending those hints to
      certain request destinations <xref target="FETCH" format="default"/>,
      where they are more likely to be useful.</t> 
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>Features relying on this document are expected to register added
      request header fields in the "Permanent Message Header Field Names" registry
      <xref target="RFC3864" format="default"/>.</t>
 
      <t>This document defines the "Accept-CH" HTTP response header field; 
      IANA has registered it in the same registry.</t> 

      <section anchor="iana-accept-ch" numbered="true" toc="default">
        <name>Accept-CH</name>
        <dl newline="false" spacing="normal">
          <dt>Header field name:</dt>
	  <dd>Accept-CH</dd>
          <dt>Applicable protocol:</dt>
	  <dd>HTTP</dd>
          <dt>Status:</dt>
	  <dd>experimental</dd>
          <dt>Author/Change controller:</dt> 
	  <dd>IETF</dd>
          <dt>Specification document(s):</dt>
	  <dd><xref target="accept-ch" format="default"/> of this
	  RFC</dd> 
          <dt>Related information:</dt>
	  <dd>for Client Hints</dd>
        </dl>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3864.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7231.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7234.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>

<!-- draft-ietf-httpbis-header-structure-19: RFC 8941 -->
<reference anchor='RFC8941' target='https://www.rfc-editor.org/info/rfc8941'>
<front>
<title>Structured Field Values for HTTP</title>
<author initials='M' surname='Nottingham' fullname='Mark Nottingham'>
    <organization />
</author>
<author initials='P-H.' surname='Kamp' fullname='Poul-Henning Kamp'>
    <organization />
</author>
<date month='February' year='2021' />
</front>
<seriesInfo name='RFC' value='8941' />
<seriesInfo name='DOI' value='10.17487/RFC8941' />
</reference>
      </references>

      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6265.xml"/>

        <reference anchor="UA-CH" target="https://wicg.github.io/ua-client-hints/">
          <front>
            <title>User-Agent Client Hints</title>
            <author initials="M." surname="West" fullname="Mike West">
              <organization>Google</organization>
            </author>
            <author initials="Y." surname="Weiss" fullname="Yoav Weiss">
              <organization>Google</organization>
            </author>
            <date month="August" year="2020"/>
          </front>
        </reference>

        <reference anchor="CLIENT-HINTS-INFRASTRUCTURE" target="https://wicg.github.io/client-hints-infrastructure/">
          <front>
            <title>Client Hints Infrastructure</title>
            <author initials="Y." surname="Weiss" fullname="Yoav Weiss">
              <organization>Google</organization>
            </author>
            <date month='July' year='2020'/>
          </front>
        </reference>

        <reference anchor="FETCH" target="https://fetch.spec.whatwg.org/">
          <front>
            <title>Fetch - Living Standard</title>
            <author>
              <organization>WHATWG</organization>
            </author>
          </front>
        </reference>

      </references>
    </references>

 
    <section numbered="false" anchor="acknowledgements" toc="default">
      <name>Acknowledgements</name>
      <t>Thanks to <contact fullname="Mark Nottingham"/>, <contact
      fullname="Julian Reschke"/>, <contact fullname="Chris Bentzel"/>,
      <contact fullname="Ben Greenstein"/>, <contact fullname="Tarun
      Bansal"/>, <contact fullname="Roy Fielding"/>, <contact
      fullname="Vasiliy Faronov"/>, <contact fullname="Ted Hardie"/>,
      <contact fullname="Jonas Sicking"/>, <contact fullname="Martin
      Thomson"/>, and numerous other members of the IETF 
      HTTP Working Group for invaluable help and feedback.</t> 
    </section>
  </back>
</rfc>
