你的浏览器每次请求都说了什么:HTTP 头部泄露
除了 IP,浏览器在每个 HTTP 请求里都自带一串"自我介绍":语言、时区、编码偏好……这些头部加起来就是一张画像。讲清楚常见请求头暴露的信息与最小化方案。
提到隐私泄露,大家先想到 Cookie 和 IP。但还有一个每时每刻都在发生的"自报家门":HTTP 请求头。浏览器每次请求都会携带十几个头部字段,拼起来是一张相当完整的画像。
常见请求头里的信息量
打开 DevTools 的 Network 面板看任意请求,几个高信息量的头部:
User-Agent——浏览器与操作系统的自我声明:Chrome/130.0.0.0 Windows NT 10.0 一句话交代了引擎、版本、系统。它还是指纹追踪的基础维度(详见浏览器指纹详解)。
Accept-Language——语言偏好列表:zh-CN,zh;q=0.9,en;q=0.8。不止暴露你懂中文,多语言的组合与优先级本身就是区分度很高的信号。
Accept-Encoding——支持的压缩算法列表:gzip, deflate, br。不同浏览器版本的组合有细微差别,可辅助指纹。
Sec-CH-UA 系列——新的 Client Hints 头:浏览器品牌、平台、是否移动设备。Chrome 引入的结构化版本,比 UA 更诚实(UA 可以改,这些头来自浏览器内核)。
Referer——你从哪个页面点过来的。给第三方服务发请求时,这个头会把你的浏览路径直接送给对方。
加上 TLS 层的 JA3/JA4 指纹(握手指纹暴露 TLS 实现),不用 Cookie,服务器已经能拼出:这个人用 Windows + Chrome 130 + 中文系统 + 懂一点英文 + 从某个页面跳转来。
服务端能看到但你自己不知道的
请求头之外,TCP/IP 协议栈还会额外"赠品":
- TCP 窗口大小与选项:暴露操作系统类型(Linux/Windows/macOS 的默认值各不相同)
- IP 的 TTL 初值:操作系统指纹的另一个来源
- TLS 扩展顺序:不同浏览器引擎的扩展列表顺序不同,JA4 就是从这算的
这些层面 JavaScript 无法控制、浏览器设置也无法关闭——比请求头更深一层,也是"改 UA 没用"的原因:字面声明能改,协议栈的行为特征改不了。
最小化方案:能做什么
语言列表精简:浏览器设置里只留必需的语言。zh-CN 单条比 zh-CN,en-US,en,ja 的人群大得多。
Referer 策略:现代浏览器默认只发送跨域时的 origin(strict-origin-when-cross-origin),进阶可用扩展改成全站 no-referrer。
主流配置:UA 与 Client Hints 的伪装度来自"稀有度"——最新版 Chrome 的默认配置就是最大人群,装小众浏览器反而更显眼。
接受协议栈的现实:TCP/TLS 层的泄露无法在浏览器层面解决。真有对抗需求的场景,方向是换指纹浏览器或专门的网络栈伪装方案——超出普通用户必要性的范畴。
验证效果:改完配置,到 IPchase 指纹检测跑一遍,看语言列表、UA、一致性评分的变化。
网站为什么收集这些
不全是恶意:Accept-Language 用来切换界面语言、Accept-Encoding 决定压缩方式、UA 用于特性降级,都是正当用途。变味的部分是——把本该匿名的统计信号拿去做跨站追踪与画像。
这也是各国的隐私立法(GDPR、中国的个保法)都盯紧头部信息的原因:IP + 请求头 + 指纹的组合,足以构成"可识别个人信息",网站处理它们需要合规基础。
小结
- 每个 HTTP 请求都自带语言、UA、跳转来源等十余项自我声明
- TCP/TLS 协议栈的特征(窗口、JA3/JA4)比请求头更深,浏览器层关不掉
- 普通用户能做的:精简语言列表、收紧 Referer、保持主流配置
- 想看自己暴露了多少,跑一次指纹检测一目了然
检测你的网络环境:回到首页做一次完整检测,或试试 指纹检测。