为 Chrome 的用户代理减少功能做好准备

Chrome 会继续减少其用户代理字符串中分享的信息,以帮助保护用户的隐私。

从 Chrome 110(2023 年 2 月)开始,我们将逐步引入固定的 Android 版本和设备型号值,在型号为 K 时,默认值始终为 Android 10。如果您依赖用户代理来检测访问者的操作系统版本、Android 设备型号或详细浏览器版本,则可能需要采取措施。请继续阅读了解详情。

user-agent 是一个字符串,用于提供有关用户浏览器及其环境的信息,例如,您可以知道您网站上的访问者在 Android 设备上运行的是 Chrome 110 版。您的浏览器会在 HTTP 标头中发送此信息,并通过 JavaScript 提供此信息。

完整用户代理字符串的问题在于,它默认会在每个请求中分享有关浏览器的详细信息,这也是允许跨网站跟踪的一个主要因素。我们的目标是减少主动收集此类数据的机会,同时提供 API,以便您在需要时主动访问数据。

到目前为止的用户代理缩减情况

我们已开始移除默认提供的部分用户代理数据,并将其替换为固定值。

Chrome 101 开始,我们将小版本号替换为零,例如 Chrome/101.3.2.1 变为 Chrome/101.0.0.0

Chrome 107 开始,我们将桌面操作系统版本和 CPU 信息替换为平台的固定值。

MacMacintosh; Intel Mac OS X 10_15_7
WindowsWindows NT 10.0; Win64; x64
ChromeOSX11; CrOS x86_64 14541.0.0
LinuxX11;Linux x86_64

从 Chrome 110 开始,修复了 Android 版本和设备型号

Chrome 110 开始,我们将逐步引入固定的 Android 版本和设备型号值。在模型 K 上,默认值将始终Android 10,而不是 Pixel 7 上的 Android 13 之类的内容。

之前:user-agent 包含 Android 版本和设备型号

Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36

后:缩减了用户代理,固定了 Android 版本和设备型号

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.0.0 Mobile Safari/537.36

用户代理格式保持不变

缩减用户代理会更改用户代理中返回的,但格式保持不变。 如果您仅使用用户代理来读取操作系统类型或主要浏览器版本,则这些数据将继续像以前一样更新,您无需采取任何措施

用户代理字符串的平台、浏览器名称、浏览器主要版本和移动指示器部分将继续照常更新。
操作系统类型、设备型号和浏览器次要版本是静态值。用户代理字符串的所有其他部分保持不变。

用户代理的替代方案

如果您目前使用的是更详细的数据,不妨检查是否可以改为使用渐进增强或功能检测

请务必注意,user-agent 与任何其他用户提供的值一样,您应对其进行验证,而不是假定其准确无误。 用户代理值可以由用户、扩展程序、其他客户端轻松更改,或者根本不发送。在大多数情况下,您应该能够向没有用户代理数据的访问者提供正常的内容

使用用户代理客户端提示请求详细数据

有许多正当理由可以访问详细的用户代理数据,例如提供特定于设备的内容、防欺诈功能或精细的日志记录。 如果您确实需要更详细的数据,可以使用 User-Agent Client Hints (UA-CH) API 来访问这些数据。与用户代理一样,UA-CH 可通过 HTTP 标头或 JavaScript 获取。

您可能已经看到发送的默认标头带有 Sec-CH-UA- 前缀,其中包含浏览器、其主要版本、操作系统以及浏览器是否为移动设备的信息。

Chrome 中的默认用户代理客户端提示请求标头

Sec-CH-UA: "Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

您可以在响应中使用 Accept-CH 标头来请求更多数据。在这种情况下,您可以请求 Sec-CH-UA-Platform-VersionSec-CH-UA-Model,以便在后续请求中重新获取该 Android 版本和设备类型。

服务器发送的响应标头,其中指定了平台版本和型号

Accept-CH:
  Sec-CH-UA-Platform-Version,
  Sec-CH-UA-Model

从 Chrome 返回请求标头,包括 Android 版本和型号名称

Sec-CH-UA-Platform-Version: "13.0.0"
Sec-CH-UA-Model: "Pixel 7"

您也可以在 JavaScript 中执行相同的操作,方法是调用 userAgentData API 上的 getHighEntropyValues(),并传入所需值的数组:platformVersionmodel。这会返回一个 promise,其中包含一个包含特定值的对象。

navigator.userAgentData
 .getHighEntropyValues(
   ['platformVersion', 'model']
 ).then(ua => { console.log(ua)
 });

{
  "platformVersion": "13.0.0",
  "model": "Pixel 7"
}

跨源请求或初始请求

如果网页上有需要这些值的跨源资源,您可以通过 Permissions-Policy HTTP 标头或在 HTML 中使用 Delegate-CH 元标记来允许访问

如果您的网站需要在第一个顶级请求中包含这些敏感值,您可以使用 Critical-CH HTTP 标头,该标头会告知浏览器在添加这些额外提示后重试其初始请求。这对于难以更新的旧版系统可能很有用,但理想情况下,您不应依赖这些敏感值来提供初始 HTML。

了解详情

如需查看经过缩减的用户代理字符串的实际效果,请参阅以下内容:

  • 如需查看您的设备的缩减版用户代理字符串,请访问 goo.gle/reduced-ua-demo
  • 如需查看您的设备的所有 JavaScript 和 HTTP 标头 User-Agent 客户端提示,请访问 goo.gle/ua-ch-demo
  • 通过启用 #reduce-user-agent Chrome 标志,在您的浏览器中发送经过缩减的用户代理字符串。

您仍然可以注册用户代理字符串缩减源试用,以便在您的网站上接收经过缩减的用户代理字符串,但我们将于 3 月初结束此试用,因为我们会继续逐步增加默认发送经过缩减的用户代理字符串。

您可以在“用户代理缩减”着陆页上找到更多资源,还可以在我们的专用 user-agent-reduction GitHub 代码库中提出问题。