学习目标
阅读本文后,您将能够:
- 说出 User-Agent 和 Client Hints 各是一份什么声明
- 分清哪一份跟着请求走,哪一份由浏览器另行提供
- 避免把浏览器的自我声明当成设备身份
User-Agent 是什么
User-Agent 是浏览器放在请求里的一串文字,用来声明自己的产品、版本和平台。
服务器不用跑页面脚本也能读到它。所以很多网站用这串文字做最粗略的一层判断:这是不是某种浏览器、是不是某种大类系统。
这串文字是声明,不是测量。浏览器可以按规范缩短它,也可以在规则允许的范围内改写其中一部分。
为什么现在常常更短
完整的 User-Agent 太容易被拿去区分环境,所以当前主流浏览器会少写细节。
- 大版本还在,小版本常常不再写明。
- 具体系统版本不一定再写全。
- 同一大类浏览器的 User-Agent 会更接近。
少写之后,只看这一串,能分开的环境就变少了。需要更细的平台信息时,浏览器改走 Client Hints。
Client Hints 补的是什么
UA Client Hints 是浏览器主动提供的一组平台字段,用来补上 User-Agent 不再写明的那一部分。
| User-Agent | Client 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,指纹就变了吗?
请求里的这份声明会变。屏幕、时区、渲染结果不会因为这一串文字改了就跟着改。