什么是用户代理缩减?

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

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

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

用户代理客户端提示允许访问所有的用户代理数据,但前提是服务器主动声明对特定数据片段的明确需要。

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

为什么我们需要减少 UA 和 UA-CH?

过去,用户代理字符串会为每个 HTTP 请求广播一大串与用户浏览器、操作系统和版本相关的数据。这样做有两个原因:

  • 详细且详细的信息有助于识别用户。
  • 此类信息的默认可用性可能会导致隐秘跟踪。

缩减的 UA 和 UA-CH 会默认仅分享基本信息,从而加强用户隐私保护。

缩减的用户代理包括浏览器的品牌信息、请求的来源(桌面设备或移动设备)的重要版本以及平台。如需访问更多数据,您可以通过用户代理客户端提示请求有关用户设备或条件的特定信息。

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

减少的 UA 和 UA-CH 是如何运作的?

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

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

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

    1. 浏览器包含 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 Client Hint 标头中包含相同的信息。例如:

      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?

首先,查看您的网站代码,了解用户代理字符串的实例和使用情况。如果您的网站依靠解析用户代理字符串来读取设备型号、平台版本或完整浏览器版本,则您需要实现 UA-CH API

更新到 UA-CH API 后,您应进行测试,以确保从用户代理获取预期数据。有三种测试方法,每一种都会增加复杂性。

为减少用户代理而扩大可用性意味着,所有 Chrome 设备上搭载的 UA 字符串均会完全缩减。从 2022 年第 2 季度开始,Chrome 次要版本开始减少。

在本地测试自定义字符串

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

或者,使用 Chrome DevTools 中的设备模拟器。

转换网站代码中的字符串

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

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

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

不过,有时您可能需要检索关键信息,以便您的网站呈现。

优化关键提示

TLS 握手是在浏览器和网络服务器之间创建安全连接的第一步。如果不进行干预,关键 CH 响应标头旨在指示浏览器在发出第一个请求时没有提供关键提示,立即重试相应请求。

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

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

ACCEPT_CH HTTP/2 和 HTTP/3 帧TLS ALPS 扩展相结合,是一项连接级优化,可在第一个 HTTP 请求时及时传递服务器的 Client Hint 偏好设置。这些配置需要进行复杂的配置,我们建议您仅将配置用于真正重要的信息。

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 对其用户代理字符串的更改不会直接影响聊天机器人选择发送的用户代理字符串。

聊天机器人可能会选择更新自己的字符串以反映 Chrome 发送的较少信息,但这完全是他们的实现选择。Chrome 仍会发送相同的用户代理格式,并且将自己的标识符附加到 Chrome 用户代理字符串末尾的漫游器可以继续这样做。

如果您对特定漫游器有任何疑问,建议您直接与所有者联系,询问他们是否有更改用户代理字符串的计划。

互动和分享反馈

了解详情