什么是用户代理缩减?

用户代理 (UA) 缩减可尽量减少用户代理字符串中共享的可用于被动式数字“指纹”收集的身份信息。现在,这些更改已正式发布,所有资源请求的 User-Agent 标头都已缩减。因此,某些 Navigator 接口(包括 navigator.userAgentnavigator.appVersionnavigator.platform)的返回值会减少。

网站开发者应检查其网站代码中是否使用了 User-Agent 字符串。如果您的网站依赖于解析 User-Agent 字符串来读取设备型号、平台版本或完整浏览器版本,则需要实现 User-Agent Client Hints API

用户代理客户端提示 (UA-CH)

User-Agent 客户端提示允许访问完整的 User-Agent 数据集,但只有在服务器主动声明明确需要特定数据时才会这样。

通过移除被动泄露的用户数据,我们可以更好地衡量和减少请求标头、JavaScript API 和其他机制有意泄露的信息量。

为什么需要缩减 UA 和 UA-CH?

过去,User-Agent 字符串会在每次 HTTP 请求中广播大量与用户的浏览器、操作系统和版本相关的数据。这存在两个问题:

  • 过于精细且信息量过多可能会导致用户身份识别。
  • 默认情况下,此类信息可供使用,可能会导致隐秘跟踪。

经过缩减的 UA 和 UA-CH 默认只会共享基本信息,从而更好地保护用户隐私。

经过缩减的 User-Agent 包含浏览器的品牌和一个重要版本、请求的来源(桌面设备或移动设备)以及平台。如需访问更多数据,您可以使用 User-Agent 客户端提示请求有关用户设备或条件的具体信息。

此外,随着时间的推移,User-Agent 字符串变得越来越长、越来越复杂,这导致字符串解析容易出错。UA-CH 提供结构化且可靠的数据,更易于解读。用于解析 UA 字符串的现有代码不应中断(但会返回的数据量会减少),如果您的网站需要特定客户端信息,则需要迁移到 UA-CH。

精简版 UA 和 UA-CH 的工作原理是什么?

以下简短示例展示了经过缩减的用户代理字符串和 UA-CH 的运作方式。 如需查看更深入的示例,请参阅利用用户代理客户端提示改善用户隐私和开发者体验

用户打开浏览器,然后在地址栏中输入 example.com

  1. 浏览器发送请求以加载网页。

    1. 浏览器会包含包含缩减后的 User-Agent 字符串的 User-Agent 标头。例如 User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Mobile Safari/537.36
    2. 浏览器会在默认的 User-Agent 客户端提示标头中包含相同的信息。例如:

      Sec-CH-UA: "Chrome"; v="98"
      Sec-CH-UA-Mobile: ?1
      Sec-CH-UA-Platform: "Android"
      
  2. 服务器可以要求浏览器使用 Accept-CH 响应标头发送其他客户端提示,例如设备型号。例如 Accept-CH: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Model

  3. 浏览器会应用政策和用户配置,以确定允许在后续请求标头中返回哪些数据。例如:

    Sec-CH-UA: "Chrome"; v="93"
    Sec-CH-UA-Mobile: ?1
    Sec-CH-UA-Platform: "Android"
    Sec-CH-UA-Model: "Pixel 2"
    

关键客户端提示

如果您需要在初始请求中使用一组特定的客户端提示,可以使用 Critical-CH 响应标头。Critical-CH 值必须是 Accept-CH 请求的值的子集。

例如,初始请求可能包含对 Device-MemoryViewport-Width 的请求,其中 Device-Memory 被视为关键请求。

GET / HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Content-Type: text/html
Accept-CH: Device-Memory, Viewport-Width
Vary: Device-Memory, Viewport-Width
Critical-CH: Device-Memory

如果浏览器需要关键提示 (Critical-CH) 才能正确呈现网页,则服务器可以使用 Accept-CH 标头请求此类额外信息。然后,浏览器可以发送包含关键提示的新页面请求。

总而言之,Accept-CH 会请求您希望网页具有的所有值,而 Critical-CH 只会请求在加载时必须具有的部分值,以便正确加载网页。如需了解详情,请参阅客户端提示可靠性规范

使用 UA-CH API 检测平板电脑设备

随着移动设备、平板电脑和桌面设备之间的界限越来越模糊,动态外形规格(可折叠屏幕、在笔记本电脑模式和平板电脑模式之间切换)越来越常见,建议您使用响应式设计和功能检测来呈现合适的界面。

不过,浏览器为用户代理字符串和用户代理客户端提示提供的信息来自同一来源,因此应该采用相同的逻辑形式。

例如,如果对 UA 字符串检查此模式:

  • 手机图案:'Android' + 'Chrome/[.0-9]* Mobile'
  • 平板电脑模式:'Android' + 'Chrome/[.0-9]* (?!Mobile)'

您可以检查匹配的默认 UA-CH 标头接口:

  • 电话模式:Sec-CH-UA-Platform: "Android"Sec-CH-UA-Mobile: ?1
  • 平板电脑模式:Sec-CH-UA-Platform: "Android"Sec-CH-UA-Mobile: ?0

或等效的 JavaScript 接口:

  • 手机图案:navigator.userAgentData.platform === 'Android' && navigator.userAgentData.mobile === true
  • 平板电脑模式:navigator.userAgentData.platform === 'Android' && navigator.userAgentData.mobile === false

对于硬件专用用例,可以通过高熵 Sec-CH-UA-Model 提示请求设备型号名称。

如何使用和测试精简版 UA?

首先,检查您的网站代码,了解 User-Agent 字符串的实例和用法。如果您的网站依赖于解析 User-Agent 字符串来读取设备型号、平台版本或完整浏览器版本,则需要实现 UA-CH API

更新到 UA-CH API 后,您应进行测试,确保从 User-Agent 中获取预期的数据。测试方式有三种,每种方式的复杂性依次递增。

用户代理字符串缩减功能的范围扩大意味着,所有 Chrome 设备上都将提供经过完全缩减的 UA 字符串。从 2022 年第 2 季度的 Chrome 次要版本开始,我们就开始缩减了。

在本地测试自定义字符串

如果您想使用自定义 User-Agent 字符串来模拟不同的设备来测试您的网站,请使用 --user-agent="Custom string here" 命令行标志启动 Chrome。如需详细了解命令行标志,请点击此处。

或者,您也可以使用 Chrome DevTools 中的设备模拟器。

转换您网站代码中的字符串

如果您在客户端或服务器端代码中处理现有的 Chrome user-agent 字符串,则可以将该字符串转换为新格式,以测试兼容性。您可以通过替换字符串或生成新版本并并排测试来进行测试。

支持客户端提示和关键提示

系统会向服务器返回三个默认客户端提示,包括浏览器名称和主要版本、一个布尔值(指示浏览器是否在移动设备上)以及操作系统名称。这些数据在传输层安全协议 (TLS) 握手后发送。您的浏览器中已提供并支持这些功能。

不过,有时您可能需要检索重要信息,以便网站正常呈现。

优化关键提示

TLS 握手是建立浏览器与网络服务器之间安全连接的第一步。如果不进行干预,Critical-CH 响应标头的设计目的是告知浏览器,如果第一个请求在发送时未附带关键提示,则立即重试该请求。

包含关键提示的客户端提示的序列图。
当服务器请求关键提示时,客户端将重试发送包含关键提示的网页的第一个请求。在此示例中,系统会请求 Sec-CH-UA-Model 的提示两次:一次是使用 Accept-CH 作为客户端提示,另一次是使用 Critical-CH 作为严重提示。

如需优化关键提示(Critical-CH 标头),您必须拦截此握手并为客户端提示提供模型。这些步骤可能很复杂,需要具备高级知识。

ACCEPT_CH HTTP/2 和 HTTP/3 帧TLS ALPS 扩展相结合,是一项连接级优化,可在首次 HTTP 请求时及时传送服务器的客户端提示偏好设置。这些功能需要进行复杂的配置,我们建议仅对真正重要的信息使用此功能。

BoringSSL(OpenSSL 的一个分支)可帮助您在 Chromium 中使用 Google 的实验性功能。目前,ALPS 仅在 BoringSSL 中实现

如果您需要使用重要提示,请参阅我们关于重要提示可靠性和优化的指南。

常见问题解答

系统会发送多长时间通过 Accept-CH 标头指定的提示?

系统会在浏览器会话期间或在指定另一组提示之前,发送通过 Accept-CH 标头指定的提示。

UA-CH 是否支持 HTTP/2 和 HTTP/3?

UA-CH 适用于 HTTP/2 和 HTTP/3 连接。

子网域(和 CNAME)是否需要顶级页面 Permissions-Policy 才能访问高熵 UA-CH?

无论 DNS 端如何定义来源,跨源请求中的请求标头上的高熵 UA-CH 都受到限制。对于任何跨源子资源,必须通过 Permissions-Policy 处理委托,或者通过在跨源上下文中执行的 JavaScript 来获取委托。

用户代理缩减对机器人检测有何影响?

Chrome 对其 User-Agent 字符串所做的更改不会直接影响聊天机器人选择发送的 User-Agent 字符串。

聊天机器人可以选择更新自己的字符串,以反映 Chrome 发送的信息减少的情况,但这完全取决于其实现方式。Chrome 仍会发送相同的 User-Agent 格式,并且将自己的标识符附加到 Chrome User-Agent 字符串末尾的漫游器可以继续这样做。

如果您对特定聊天机器人有任何疑虑,不妨直接与其所有者联系,询问他们是否有更改 User-Agent 字符串的计划。

互动和分享反馈

了解详情