| rfc8942v3.txt | rfc8942.txt | |||
|---|---|---|---|---|
| Internet Engineering Task Force (IETF) I. Grigorik | Internet Engineering Task Force (IETF) I. Grigorik | |||
| Request for Comments: 8942 Y. Weiss | Request for Comments: 8942 Y. Weiss | |||
| Category: Experimental Google | Category: Experimental Google | |||
| ISSN: 2070-1721 October 2020 | ISSN: 2070-1721 January 2021 | |||
| HTTP Client Hints | HTTP Client Hints | |||
| Abstract | Abstract | |||
| HTTP defines proactive content negotiation to allow servers to select | HTTP defines proactive content negotiation to allow servers to select | |||
| the appropriate response for a given request, based upon the user | the appropriate response for a given request, based upon the user | |||
| agent's characteristics, as expressed in request headers. In | agent's characteristics, as expressed in request headers. In | |||
| practice, user agents are often unwilling to send those request | practice, user agents are often unwilling to send those request | |||
| headers, because it is not clear whether they will be used, and | headers, because it is not clear whether they will be used, and | |||
| skipping to change at line 43 ¶ | skipping to change at line 43 ¶ | |||
| publication by the Internet Engineering Steering Group (IESG). Not | publication by the Internet Engineering Steering Group (IESG). Not | |||
| all documents approved by the IESG are candidates for any level of | all documents approved by the IESG are candidates for any level of | |||
| Internet Standard; see Section 2 of RFC 7841. | Internet Standard; see Section 2 of RFC 7841. | |||
| Information about the current status of this document, any errata, | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | and how to provide feedback on it may be obtained at | |||
| https://www.rfc-editor.org/info/rfc8942. | https://www.rfc-editor.org/info/rfc8942. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| skipping to change at line 84 ¶ | skipping to change at line 84 ¶ | |||
| 7.1. Normative References | 7.1. Normative References | |||
| 7.2. Informative References | 7.2. Informative References | |||
| Acknowledgements | Acknowledgements | |||
| Authors' Addresses | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| There are thousands of different devices accessing the web, each with | There are thousands of different devices accessing the web, each with | |||
| different device capabilities and preference information. These | different device capabilities and preference information. These | |||
| device capabilities include hardware and software characteristics, as | device capabilities include hardware and software characteristics, as | |||
| well as dynamic user and user-agent preferences. Historically, | well as dynamic user and user agent preferences. Historically, | |||
| applications that wanted the server to optimize content delivery and | applications that wanted the server to optimize content delivery and | |||
| user experience based on such capabilities had to rely on passive | user experience based on such capabilities had to rely on passive | |||
| identification (e.g., by matching the User-Agent header field | identification (e.g., by matching the User-Agent header field | |||
| (Section 5.5.3 of [RFC7231]) against an established database of user- | (Section 5.5.3 of [RFC7231]) against an established database of user | |||
| agent signatures), use HTTP cookies [RFC6265] and URL parameters, or | agent signatures), use HTTP cookies [RFC6265] and URL parameters, or | |||
| use some combination of these and similar mechanisms to enable ad hoc | use some combination of these and similar mechanisms to enable ad hoc | |||
| content negotiation. | content negotiation. | |||
| Such techniques are expensive to set up and maintain and are not | Such techniques are expensive to set up and maintain and are not | |||
| portable across both applications and servers. They also make it | portable across both applications and servers. They also make it | |||
| hard for both user agent and server to understand which data are | hard for both user agent and server to understand which data are | |||
| required and are in use during the negotiation: | required and are in use during the negotiation: | |||
| * User-agent detection cannot reliably identify all static | * User agent detection cannot reliably identify all static | |||
| variables, cannot infer dynamic user-agent preferences, requires | variables, cannot infer dynamic user agent preferences, requires | |||
| an external device database, is not cache friendly, and is reliant | an external device database, is not cache friendly, and is reliant | |||
| on a passive fingerprinting surface. | on a passive fingerprinting surface. | |||
| * Cookie-based approaches are not portable across applications and | * Cookie-based approaches are not portable across applications and | |||
| servers, impose additional client-side latency by requiring | servers, impose additional client-side latency by requiring | |||
| JavaScript execution, and are not cache friendly. | JavaScript execution, and are not cache friendly. | |||
| * URL parameters, similar to cookie-based approaches, suffer from | * URL parameters, similar to cookie-based approaches, suffer from | |||
| lack of portability and are hard to deploy due to a requirement to | lack of portability and are hard to deploy due to a requirement to | |||
| encode content negotiation data inside of the URL of each | encode content negotiation data inside of the URL of each | |||
| resource. | resource. | |||
| skipping to change at line 174 ¶ | skipping to change at line 174 ¶ | |||
| User agents choose what Client Hints to send in a request based on | User agents choose what Client Hints to send in a request based on | |||
| their default settings, user configuration, and server preferences | their default settings, user configuration, and server preferences | |||
| expressed in "Accept-CH". The user agent and server can use an opt- | expressed in "Accept-CH". The user agent and server can use an opt- | |||
| in mechanism outlined below to negotiate which header fields need to | in mechanism outlined below to negotiate which header fields need to | |||
| be sent to allow for efficient content adaption, and they can | be sent to allow for efficient content adaption, and they can | |||
| optionally use additional mechanisms (e.g., as outlined in | optionally use additional mechanisms (e.g., as outlined in | |||
| [CLIENT-HINTS-INFRASTRUCTURE]) to negotiate delegation policies that | [CLIENT-HINTS-INFRASTRUCTURE]) to negotiate delegation policies that | |||
| control access of third parties to those same header fields. User | control access of third parties to those same header fields. User | |||
| agents SHOULD require an opt-in to send any hints that are not | agents SHOULD require an opt-in to send any hints that are not | |||
| considered low-entropy. See the low-entropy hint table at | considered low-entropy. See the low-entropy hint table at | |||
| [CLIENT-HINTS-INFRASTRUCTURE] for examples of ones that are. | [CLIENT-HINTS-INFRASTRUCTURE] for examples of hints that expose low | |||
| amounts of entropy. | ||||
| Implementers need to be aware of the fingerprinting implications when | Implementers need to be aware of the fingerprinting implications when | |||
| implementing support for Client Hints and follow the considerations | implementing support for Client Hints and follow the considerations | |||
| outlined in the Security Considerations section of this document (see | outlined in the Security Considerations section of this document (see | |||
| Section 4). | Section 4). | |||
| 2.2. Server Processing of Client Hints | 2.2. Server Processing of Client Hints | |||
| When presented with a request that contains one or more Client Hints | When presented with a request that contains one or more Client Hints | |||
| header fields, servers can optimize the response based upon the | header fields, servers can optimize the response based upon the | |||
| skipping to change at line 207 ¶ | skipping to change at line 208 ¶ | |||
| values to aid client processing. | values to aid client processing. | |||
| 3. Advertising Server Support | 3. Advertising Server Support | |||
| Servers can advertise support for Client Hints using the mechanism | Servers can advertise support for Client Hints using the mechanism | |||
| described below. | described below. | |||
| 3.1. The Accept-CH Response Header Field | 3.1. The Accept-CH Response Header Field | |||
| The Accept-CH response header field indicates server support for the | The Accept-CH response header field indicates server support for the | |||
| hints indicated in its value. Servers wishing to receive user-agent | hints indicated in its value. Servers wishing to receive user agent | |||
| information through Client Hints SHOULD add the Accept-CH response | information through Client Hints SHOULD add the Accept-CH response | |||
| header to their responses as early as possible. | header to their responses as early as possible. | |||
| Accept-CH is a Structured Header [RFC8941]. Its value MUST be an sf- | Accept-CH is a Structured Header [RFC8941]. Its value MUST be an sf- | |||
| list (Section 3.1 of [RFC8941]) whose members are Tokens | list (Section 3.1 of [RFC8941]) whose members are Tokens | |||
| (Section 3.3.4 of [RFC8941]). Its ABNF is: | (Section 3.3.4 of [RFC8941]). Its ABNF is: | |||
| Accept-CH = sf-list | Accept-CH = sf-list | |||
| For example: | For example: | |||
| skipping to change at line 331 ¶ | skipping to change at line 332 ¶ | |||
| application, but gated behind specific user actions (e.g., a | application, but gated behind specific user actions (e.g., a | |||
| permission prompt or user activation), SHOULD NOT be exposed as a | permission prompt or user activation), SHOULD NOT be exposed as a | |||
| Client Hint. | Client Hint. | |||
| Change over time: The feature SHOULD NOT expose user information | Change over time: The feature SHOULD NOT expose user information | |||
| that changes over time, unless the state change itself is also | that changes over time, unless the state change itself is also | |||
| exposed (e.g., through JavaScript callbacks). | exposed (e.g., through JavaScript callbacks). | |||
| Different features will be positioned in different points in the | Different features will be positioned in different points in the | |||
| space between low-entropy, non-sensitive, and static information | space between low-entropy, non-sensitive, and static information | |||
| (e.g., user-agent information) and high-entropy, sensitive, and | (e.g., user agent information) and high-entropy, sensitive, and | |||
| dynamic information (e.g., geolocation). User agents need to | dynamic information (e.g., geolocation). User agents need to | |||
| consider the value provided by a particular feature vs. these | consider the value provided by a particular feature vs. these | |||
| considerations and may wish to have different policies regarding that | considerations and may wish to have different policies regarding that | |||
| tradeoff on a per-feature or other fine-grained basis. | tradeoff on a per-feature or other fine-grained basis. | |||
| Implementers ought to consider both user- and server-controlled | Implementers ought to consider both user- and server-controlled | |||
| mechanisms and policies to control which Client Hints header fields | mechanisms and policies to control which Client Hints header fields | |||
| are advertised: | are advertised: | |||
| * Implementers SHOULD restrict delivery of some or all Client Hints | * Implementers SHOULD restrict delivery of some or all Client Hints | |||
| skipping to change at line 470 ¶ | skipping to change at line 471 ¶ | |||
| [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, | |||
| Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", | |||
| RFC 7234, DOI 10.17487/RFC7234, June 2014, | RFC 7234, DOI 10.17487/RFC7234, June 2014, | |||
| <https://www.rfc-editor.org/info/rfc7234>. | <https://www.rfc-editor.org/info/rfc7234>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [RFC8941] Nottingham, M. and P-H. Kamp, "Structured Field Values for | [RFC8941] Nottingham, M. and P-H. Kamp, "Structured Field Values for | |||
| HTTP", RFC 8941, DOI 10.17487/RFC8941, October 2020, | HTTP", RFC 8941, DOI 10.17487/RFC8941, January 2021, | |||
| <https://www.rfc-editor.org/info/rfc8941>. | <https://www.rfc-editor.org/info/rfc8941>. | |||
| 7.2. Informative References | 7.2. Informative References | |||
| [CLIENT-HINTS-INFRASTRUCTURE] | [CLIENT-HINTS-INFRASTRUCTURE] | |||
| Weiss, Y., "Client Hints Infrastructure", July 2020, | Weiss, Y., "Client Hints Infrastructure", July 2020, | |||
| <https://wicg.github.io/client-hints-infrastructure/>. | <https://wicg.github.io/client-hints-infrastructure/>. | |||
| [FETCH] WHATWG, "Fetch - Living Standard", Living Standard, | [FETCH] WHATWG, "Fetch - Living Standard", Living Standard, | |||
| September 2020, <https://fetch.spec.whatwg.org/>. | September 2020, <https://fetch.spec.whatwg.org/>. | |||
| End of changes. 9 change blocks. | ||||
| 10 lines changed or deleted | 11 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||