User-Agent 与 UA Client Hints

网站要知道「这像是什么浏览器、什么系统」,首先看浏览器自己怎么说。一种说法写在 User-Agent 里,跟着每次请求走。另一种是 UA Client Hints,由浏览器按自己的规则再提供一部分平台和版本信息。

学习目标

阅读本文后,您将能够:

  • 说出 User-Agent 和 Client Hints 各是一份什么声明
  • 分清哪一份跟着请求走,哪一份由浏览器另行提供
  • 避免把浏览器的自我声明当成设备身份

User-Agent 是什么

User-Agent 是浏览器放在请求里的一串文字,用来声明自己的产品、版本和平台。

服务器不用跑页面脚本也能读到它。所以很多网站用这串文字做最粗略的一层判断:这是不是某种浏览器、是不是某种大类系统。

这串文字是声明,不是测量。浏览器可以按规范缩短它,也可以在规则允许的范围内改写其中一部分。

为什么现在常常更短

完整的 User-Agent 太容易被拿去区分环境,所以当前主流浏览器会少写细节。

  • 大版本还在,小版本常常不再写明。
  • 具体系统版本不一定再写全。
  • 同一大类浏览器的 User-Agent 会更接近。

少写之后,只看这一串,能分开的环境就变少了。需要更细的平台信息时,浏览器改走 Client Hints。

Client Hints 补的是什么

UA Client Hints 是浏览器主动提供的一组平台字段,用来补上 User-Agent 不再写明的那一部分。

User-AgentClient Hints
怎么到网站每次请求都带上浏览器按规则另行提供
通常包含产品名和一份缩短后的平台声明品牌、版本、平台、架构等分项
详细程度现在往往较粗略可以比缩短后的 User-Agent 更细

不是每个浏览器都以同样的方式返回这些字段。有的请求里先只有一部分,更细的项要等浏览器再提供。

为什么要先看懂这两份声明?

后面的 Canvas、WebGL、字体,都是测出来或读出来的环境。User-Agent 和 Client Hints 仍是浏览器自己说的。把「声明」和「测量」分开,才不会把一串版本号当成这台设备的身份。

声明不等于设备本身

  • User-Agent 相同,只说明声明相近,不是同一台电脑。
  • User-Agent 不同,也不证明一定是两个用户。
  • Client Hints 更细,仍然是浏览器交出的平台信息,不是硬件清单。
  • 缩短 User-Agent 之后,网站还可能从别的信号看环境。

常见问题

网站能不能只靠 User-Agent 认出我的电脑?

不能。它看到的是浏览器提交的一份声明,而且现在这份声明通常是缩短过的。

Client Hints 是不是比 User-Agent 更真实?

它分得往往更细、更具体。它依旧是浏览器提供的信息,不是对硬件的独立鉴定。

改掉 User-Agent,指纹就变了吗?

请求里的这份声明会变。屏幕、时区、渲染结果不会因为这一串文字改了就跟着改。