DNT 请求头曾让浏览器告诉网站别追踪我,但几乎没有网站遵守。了解其原理、失败原因,以及更具法律效力的继任者 GPC。
有几年时间,大多数浏览器都内置了一个看似简单的选项:告诉网站别追踪我,网站就会照做。这就是 Do Not Track(DNT,请勿追踪)——一个单一的 HTTP 请求头,配合一个对应的 JavaScript 属性 navigator.doNotTrack。它背后从未有任何技术强制力:只有接收方网站自愿遵守,它才有效。几乎没有网站这样做,到 2020 年代中期,各大主流浏览器都已移除了这项设置。它的继任者**全局隐私控制(Global Privacy Control,GPC)**建立在同样的单比特信号之上,但在越来越多司法辖区,它有真正的法律作为后盾。
核心要点
- DNT 是一个自愿性的 HTTP 请求头(
DNT: 1),外加一个 JavaScript 属性navigator.doNotTrack——这是一种请求,而非强制执行机制。 - 将 DNT 正式化的 W3C Tracking Preference Expression 规范在 2019 年被放弃,从未完成标准化。
- 网站没有遵守 DNT 的法律义务,广告技术行业和出版商的采用率一直微乎其微,苹果、谷歌、Mozilla 此后都已移除或弃用了浏览器中的这项设置。
- 开启 DNT 反而会让你更容易被识别,而非更难:正因为极少用户开启它,它给你的指纹又添加了一比特的熵。
- 全局隐私控制(GPC)沿用了同样的请求头/信号理念,但在加州 CCPA/CPRA 等法律下被承认为有效的选择退出请求,这赋予了它 DNT 从未拥有过的法律效力。
DNT 请求头究竟是什么
Do Not Track 在两个相互映射的层面运作。在传输层面,开启该设置的浏览器会在每次 HTTP 请求中发送一个请求头:
DNT: 1
值为 0 明确表示"你可以追踪我",而完全不带这个请求头则表示"未表达偏好"。在客户端层面,同样的状态也暴露给 JavaScript,页面无需检查请求头即可读取:
console.log(navigator.doNotTrack); // "1"、"0" 或 null,取决于浏览器/设置
这就是这套机制的全部。没有任何加密证明,没有服务器端校验,网站读取到 DNT: 1 却置之不理也不会有任何后果。按照设计,DNT 只是叠加在普通 HTTP 请求头之上的一句礼貌请求——它是否有效,完全取决于接收网站是否自愿配合。
navigator.doNotTrack 与请求头,以及一段简史
请求头和 JavaScript 属性本应保持同步,但各浏览器在返回值和默认状态上并未统一,这让开发者做特性检测时颇为头疼。Firefox 曾一度返回 "yes"/"no"/"unspecified",后来才逐渐靠拢其他浏览器采用的 "1"/"0"/null 惯例。
大致时间线如下:
- 2009 年——研究人员和隐私倡导者提出了"Do Not Track" HTTP 请求头的构想,大致仿照美国联邦贸易委员会的"Do Not Call"电话禁拨名单。
- 2011 年——Firefox 率先内置了 DNT 开关;Internet Explorer、Safari 和 Chrome 随后几年陆续跟进。
- 2011–2019 年——W3C 的 Tracking Protection 工作组试图将其语义和合规规范标准化,但广告行业成员与隐私倡导者始终未能就"合规"的定义达成一致。
- 2019 年——W3C 正式关闭该工作组;Tracking Preference Expression 规范始终未能超越"候选推荐"阶段。
- 2020 年代——苹果在 2019 年移除了 Safari 中的 DNT 设置(称其存在被用作指纹信号的风险),其他浏览器也陆续跟进或悄悄将其从设置界面中隐去,尽管
navigator.doNotTrack出于兼容性大多仍然存在。
为何网站选择无视它
DNT 要求网站改变关乎商业核心的行为——停止追踪、停止构建广告画像——却没有任何强制力,只能寄望于对方的善意。少数出版商和分析服务商确实遵守了,但广告技术行业整体并未如此,也没有任何法律要求它们这样做。标准化工作陷入停滞也是同样的原因:工作组需要就"追踪"到底意味着什么、怎样的响应才算合规达成一致,而广告商在商业上有充分动机去抵制严格的定义。一个没有任何违反成本的自愿选择退出机制,面向的又是一个营收模式高度依赖追踪的行业,注定无法获得有意义的采用。技术概念、浏览器实际支持与法律强制力之间的这种错位,才是 DNT 真正走向消亡的原因——问题不在于请求头本身缺了什么功能。
指纹识别的悖论
这正是让 DNT 与指纹识别话题产生关联的转折点:开启它反而可能让你更容易被单独识别出来。 任何大多数用户保持默认值的信号,一旦有一小群人偏离默认值,就会增加熵值。正因为极少有用户真正开启 DNT,DNT: 1(或 navigator.doNotTrack === "1")反而成了一个罕见的、具有区分度的取值,而非匿名化的手段——它只是指纹识别脚本可以纳入组合标识符的又一项属性,与你的 User-Agent Client Hints、canvas 输出、已安装字体并列。一项只有一小撮自我选择的少数人会开启的隐私设置,恰恰在与自己的目标背道而驰:一个信号越罕见,就越能缩小"你是谁"的范围。这正是我们在浏览器指纹完整指南中提到的同一条熵原理——真正让指纹起作用的是唯一性,而不是任何单一比特的内容。
全局隐私控制(GPC):DNT 具有法律效力的继任者
GPC 沿用了与 DNT 相同的形态——浏览器发送一个轻量信号(一个 HTTP 请求头 Sec-GPC: 1,外加对应的 JavaScript 属性 navigator.globalPrivacyControl)——但改变的是它背后的支撑。在 W3C Privacy Community Group 主导下开发的 GPC 规范,从一开始就被设计为对接加州 CCPA/CPRA 等法律创设的"禁止出售或共享我的个人信息"选择退出权。在这些法律适用的司法辖区,网站收到 Sec-GPC: 1 后就负有法律义务,必须将其视为有效的选择退出请求——同样是 DNT 发送过的那一比特信号,如今却附带了对无视者的监管后果。
这种法律支撑正是全部的差异所在。GPC 并不需要什么新的追踪检测技术或更聪明的协议;它需要的只是某个司法辖区愿意宣布:一个浏览器信号可以算作一项可强制执行的消费者请求。包括 Brave、DuckDuckGo 和 EFF 的 Privacy Badger 在内的多款浏览器和隐私扩展,都默认启用 GPC 或提供一键开关——这本身就是从 DNT 的失败中得出的教训:一个默认关闭、需要主动开启、几乎无人启用的信号,不管有没有法律撑腰,实际影响力都十分有限。
如何检查你的浏览器是否已启用 GPC
console.log(navigator.globalPrivacyControl); // 若 GPC 已启用并正在发送,则返回 true
如果返回 true,说明你的浏览器正在向外发送 Sec-GPC: 1。并非所有浏览器都已支持这个属性或请求头,因此 undefined 并不必然意味着你正被追踪——它也可能只是说明该浏览器尚未实现 GPC。
常见问题
浏览器还支持 Do Not Track 吗?
出于向后兼容,navigator.doNotTrack 属性在大多数浏览器中依然存在,但面向用户的设置项已在 Safari 中被移除或隐藏,Chrome 和 Firefox 也不再将其宣传为有意义的隐私控制手段。即便技术上仍然存在,也应预期绝大多数网站会无视它。
GPC 真的比 DNT 更有效吗?
从法律角度看,在承认它的司法辖区确实如此——在加州 CCPA/CPRA 等法律下,GPC 被视为有效的选择退出请求,这意味着受监管企业如果无视它将面临真正的合规责任。从技术角度看,它和 DNT 是同一类轻量信号;差异完全在于背后的强制执行机制,而非协议本身。
我该开启 DNT 或 GPC 来减少浏览器指纹吗?
在浏览器支持的情况下开启 GPC 值得一做,因为它在受监管的司法辖区具有法律层面的选择退出效果,但无论 DNT 还是 GPC 都不会缩小你的指纹——两者都只是给任何检测它们的脚本又添加了一比特可区分信息。如果你的目标是专门缩小指纹面,处理 canvas、WebGL、字体和音频信号才更为关键;完整内容请参阅我们的浏览器指纹指南。
苹果为何要从 Safari 中移除 DNT 开关?
苹果在 2019 年表示,由于极少有用户会更改这项默认设置,DNT 反而变成了一种可用于识别和追踪用户的手段——恰与其初衷相悖——因此苹果决定从 Safari 中移除该开关界面。
测试你的浏览器发送了什么
你可以直接在浏览器控制台中通过 navigator.doNotTrack 和 navigator.globalPrivacyControl 检查自己的 DNT 和 GPC 信号。BrowserInsight 的指纹检测工具会连同其余指纹信号一并展示这些值,而我们的隐私工具对比则介绍了 VPN、代理和 Tor 这些针对 IP 层追踪的方案——这类基于请求头的信号(无论 DNT 还是 GPC)从一开始就从未触及 IP 层追踪。

