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.
The information exposed by features might reveal new information about the user, and implementers ought to consider the following considerations, recommendations, and best practices.
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.)
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 [
UA-CH]. Otherwise, the user agent can expose information already available through script (e.g., the Save-Data Client Hints <
https://wicg.github.io/savedata/#save-data-request-header-field>), without increasing the passive fingerprinting surface. User agents supporting Client Hints features which send certain information to opted-in servers
SHOULD avoid sending the equivalent information passively.
Therefore, features relying on this document to define Client Hint headers
MUST NOT 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.
Such features need to take into account the following aspects of the exposed information:
-
Entropy:
-
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.
-
Sensitivity:
-
The feature SHOULD NOT 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), SHOULD NOT be exposed as a Client Hint.
-
Change over time:
-
The feature SHOULD NOT expose user information that changes over time, unless the state change itself is also exposed (e.g., through JavaScript callbacks).
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.
Implementers ought to consider both user- and server-controlled mechanisms and policies to control which Client Hints header fields are advertised:
-
Implementers SHOULD 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.
-
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.
-
Implementations specific to certain use cases or threat models MAY 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.
User agents
MUST clear persisted opt-in preferences when any one of site data, browsing cache, cookies, or similar are cleared.
Deployment of new request headers requires several considerations:
-
Potential conflicts due to existing use of a header field name
-
Properties of the data communicated in a header field value
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 [
FETCH] for more information.
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).
A Client Hints request header negotiated using the Accept-CH opt-in mechanism
MUST have a field name that matches sf-token (
Section 3.3.4 of
RFC 8941).
A user agent that tracks access to active fingerprinting information
SHOULD consider emission of Client Hints headers similar to the way it would consider access to the equivalent API.
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.