同意存放在哪里:Cookie、localStorage 与服务器端记录的比较
两项不同的工作
当访客做出同意选择时,需要发生两件独立的事情。第一,浏览器必须记住这个选择,这样横幅就不会在每个页面上重新出现,标签也知道自己被允许做什么。第二,你以后可能需要证明这个选择已经做出、访客当时看到了什么以及发生在何时。这两项工作往往由不同的存储机制处理,把它们混为一谈会造成实际问题:横幅不断重新出现、选择在某些浏览器上消失,或者在有人询问时拿不出任何记录。
本文比较三种常见方案 — 第一方 Cookie、localStorage 等浏览器存储,以及服务器端同意记录 — 并说明各自适用的场景。
方案 1:第一方 Cookie
Cookie 是存放同意状态的传统位置。支持 TCF 的 CMP 通常把同意字符串存储在第一方 Cookie 中,许多 CMP 也把自己的偏好数据存放在其中。
优势
- 服务器可读取。Cookie 随每个请求发送,因此服务器端代码、边缘逻辑和服务器端标签管理无需等待 JavaScript 就能读取选择。
- 可跨子域共享。在可注册域名上设置的 Cookie 可以覆盖 www、blog 和 shop 子域。
- 被广泛预期。许多广告技术集成都会在 Cookie 中查找同意。
劣势
- 大小限制。浏览器将 Cookie 大小限制在约 4 KB,包含许多供应商的 TCF 字符串加上其他值可能接近这一上限。
- 请求开销。对你域名的每个请求都会携带该 Cookie,包括图片和脚本请求。
- 某些浏览器中的有效期上限。Safari 的智能跟踪预防(Intelligent Tracking Prevention)将通过 JavaScript 创建的 Cookie 的最长有效期限制为七天。由你自己的服务器在 HTTP 响应中设置的 Cookie 通常会被更宽松地对待,尽管也有例外。
方案 2:localStorage 与其他浏览器存储
一些 CMP 把详细的偏好存放在 localStorage 中,有时还会配合一个较小的 Cookie。
优势
- 空间更大。每个源数 MB,足以存放详细的供应商级选择。
- 没有请求开销。不会自动向服务器发送任何内容。
劣势
- 服务器看不到。服务器端代码和边缘逻辑无法读取它,因此任何服务器端的决定都必须等待浏览器。
- 绑定到单个源。www.example.com 上的存储在 shop.example.com 上不可用,因此访客可能在每个子域上再次看到横幅。
- 可能被删除。对于用户在七天的浏览器使用期间没有交互过的网站,Safari 可以删除脚本可写入的存储,包括 localStorage;而隐私浏览模式通常会在会话结束时清除它。
方案 3:服务器端同意记录
服务器端记录是每次做出选择时由你或你的 CMP 提供商存储的一个条目。它通常包含一个假名标识符、时间戳、所做的选择、所展示的横幅或政策版本,以及地区等上下文信息。
优势
- 持久的证据。它不受清除 Cookie 和浏览器限制的影响,因此是证明已取得同意的合适工具。
- 可审计。你可以按时间报告各项选择,并回答有关特定事件的问题。
- 跨设备的潜力。对于已登录的读者,服务器记录可以在设备之间同步选择,前提是你向他们说明了这一点。
劣势
- 不能替代本地状态。浏览器中的标签仍然需要快速的本地信号;每次页面浏览都调用服务器来查询同意会增加延迟。
- 它本身就是个人数据。记录需要保留期限、访问控制,并在你的隐私声明中占有一席之地。
- 依赖标识符。匿名访客只能通过存储在其设备上的标识符与记录匹配,这又回到了本地存储。
并排对比总结
- 最适合在网页上记住选择:第一方 Cookie,最好由你的服务器设置并具有稳定的有效期。
- 最适合在浏览器中存放详细偏好数据:localStorage,并搭配服务器可读取的 Cookie。
- 最适合证明选择:服务器端记录。
- 最糟糕的单一方案:只依赖 localStorage,这会让服务器一无所知,并使选择在某些浏览器上变得脆弱。
实用的组合方案
- 将权威的本地信号 — 例如 TCF 字符串和一份紧凑的偏好记录 — 存储在作用域限定于你的可注册域名的第一方 Cookie 中。
- 仅将 localStorage 用于无需到达服务器的补充数据。
- 为每次选择写入一条服务器端记录,包括所展示的横幅和政策的版本。
- 如果已存储的选择消失,就再次显示横幅,而不是假定存在之前的回答。
- 为已存储的选择设定重新提示的周期,并将其记录在你的政策中。
存储访客的同意选择本身,通常被视为提供访客所要求的服务(即记住其决定)所必需,但请核对你的主要市场所适用的指导意见。
核心要点
- 记住选择与证明选择是两项不同的工作,需要不同的存储。
- Cookie 可被服务器读取并可跨子域共享,但大小有限,并且在 Safari 中由脚本设置时有效期也受限。
- localStorage 空间充足,但服务器看不到,并且可能被浏览器清除。
- 服务器端记录是证据层,而不是本地信号的替代品。
- 将服务器设置的第一方 Cookie、可选的浏览器存储和服务器记录结合使用。