← 返回博客

User-Agent Client Hints 迁移:不用完整 UA 字符串也能测量设备

Chrome 正把 User-Agent 字符串削减为一个被冻结的空壳。本文讲解隐私优先的分析如何通过 Client Hints 读取设备信号,而不做指纹识别。

User-Agent 字符串的缓慢死亡

几十年来,User-Agent 请求头一直是分析领域回答基本问题的主力:哪个浏览器、哪个操作系统、移动端还是桌面端?它同时也是一项指纹识别隐患。像 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxx.0.0.0 Safari/537.36 这样的完整 UA 字符串会泄露精确的版本号和平台细节,与其他信号结合后就能帮助识别出具体的访客。

Google 的 User-Agent 缩减计划已经修剪这串字符好些年了。Chrome 现在发送的是缩减版 UA:平台版本被冻结,次版本号字段被清零。按照 Chrome 文档的说法,其意图是移除可被动获取的熵,同时保留一个结构化的、需主动申请的替代方案:User-Agent Client Hints(UA-CH)。

对于在 2026 年构建分析系统的人来说,实际后果很清楚。解析旧版 UA 字符串来获取浏览器大类之外的任何信息,都会越来越不可靠——也越来越是错误的做法。

Client Hints 究竟如何工作

UA-CH 把设备信息拆成一个个可按需索取的提示,而不是压缩进一串密集的字符串。低熵提示默认随每个请求发送:

  • Sec-CH-UA —— 品牌与主要版本列表
  • Sec-CH-UA-Mobile —— 布尔值 ?0 / ?1
  • Sec-CH-UA-Platform —— 例如 "macOS"

高熵提示——完整平台版本、架构、机型、位数——除非服务器明确索要,否则不会发送。服务器通过 Accept-CH 响应头提出请求,浏览器随后可能在后续请求中带上它们。Sec- 前缀意味着这些请求头由浏览器控制、无法被脚本设置,这是一项很有意义的完整性保证。

这种反转对隐私至关重要。默认姿态是最小披露。额外的熵成了一个需要刻意为之的动作,并记录在你自己的响应头里,而不是从每位访客身上悄悄收割的东西。

以隐私优先的视角解读这一转变

Monoid 刻意留在这条边界的低熵一侧。我们从不发送 Accept-CH 去拉取架构、机型或完整平台版本,也从不把看到的提示组合成稳定的设备签名。那就是指纹识别——从设备特征重建出一个标识符——正是 UA 缩减所要防范的做法,也正是 ePrivacy 指令第 5(3) 条和各浏览器的反指纹政策所认定的"访问终端设备信息"。

默认的低熵提示,足以回答分析本就该问的那些问题:

  • 从 Sec-CH-UA 得到的浏览器大类与主版本号,用于兼容性与支持规划。
  • 从 Sec-CH-UA-Mobile 得到的移动端与非移动端,用于布局和 Core Web Vitals 的分群。
  • 从 Sec-CH-UA-Platform 得到的平台,用于按操作系统拆分。

关键在于:这些是聚合维度,而不是按访客的主键。一个布尔值加一个平台名称由数百万访客共享,单凭它们并不具备任何有意义的识别能力。

在边缘读取提示

由于 Client Hints 就是普通的请求头,边缘 Worker 无需任何客户端脚本即可读取。在 Cloudflare 上,低熵提示会随传入的 Request 对象一起到达:

export default {
  async fetch(request) {
    const brands = request.headers.get('Sec-CH-UA') || '';
    const isMobile = request.headers.get('Sec-CH-UA-Mobile') === '?1';
    const platform = request.headers.get('Sec-CH-UA-Platform') || '';
    // 只推导粗粒度维度;绝不持久化组合键。
    return new Response('ok');
  }
};

请注意这里缺了什么:没有回应 Accept-CH,没有索取高熵提示,也没有对组合后的值做哈希。Sec-CH-UA 的值是一个结构化列表,解析时务必小心——它包含有意加入的 "GREASE" 品牌条目,专门用来阻止脆弱的精确匹配式解析,这一手法是规范从 TLS 借鉴来的。

你的数据管道该改什么

如果你的分析仍在用正则匹配完整的 UA 字符串,随着时间推移会有三处崩坏:版本号会漂移成 .0.0.0,平台版本被冻结,基于子串匹配的移动端检测也越来越不可靠。迁移路径很直接:

  1. 优先使用结构化的低熵提示,而不是解析 UA 字符串。
  2. 把缩减版 UA 字符串仅当作面向老旧客户端的回退方案。
  3. 抵御"以防万一"索取高熵提示的诱惑——每多一个提示,都会扩大你的指纹识别面和合规风险敞口。

更宏观的启示,与我们构建的一切一脉相承。浏览器厂商正在稳步地把被动熵从 Web 平台上清除。正确的应对不是通过新 API 去追逐它,而是设计一套从来就不需要它的测量方式。

Sources

Comments

Loading comments…