本文首发于我的博客 YILS's Blog,首发地址:第三方Cookie失效时的新解决方案 (yils.blog)
第三方 Cookie 一直是网络的重要组成部分,这已持续了 25 年。
然而随着浏览器对隐私保护的加强,为了防止跨站跟踪,第三方 Cookie 的使用变得越来越受限。即使你已经正确设置了 SameSite=None; Secure;
,仍然可能会遇到 Set-Cookie 失效的问题。这通常是因为最新版本浏览器新的隐私设置或其他安全策略导致的。
为什么仍旧需要第三方cookie?
先考虑这个问题,你是不是真的需要使用它。
你可能遇到了以下情况:
- 使用单点登录(SSO)
- 第三方前端 SDK 需要使用 Cookie 来存储用户标识
- iframe嵌入:通用的聊天、地图、文档等通过三方 Cookie 来共享状态,完成自动登录
- CDN 缓存:一些 CDN 服务商使用 Cookie 来缓存用户特定的内容
- 嵌入式第三方付款服务
- 第三方静态资源加载
- 跨站 API 调用
- …
这些场景中,第三方 Cookie 仍然是不可或缺的。
新隐私策略限制下的解决方案
1. 使用具有独立分区状态 (CHIPS) 的 Cookie
这是 Chrome 的一个新特性,旨在允许第三方 Cookie 在跨站点上下文中使用,同时仍然提供隐私保护。
值得注意的是,从 Safari 18.4 版本(2025年3月31日发布)开始也全面支持 CHIPS。
而 Firefox 宣布,他们会在 ETP 严格模式和无痕浏览模式下默认对所有第三方 Cookie 进行分区,因此所有跨站 Cookie 都会按顶级网站进行分区。
CHIPS 虽然允许了网站在跨站上下文中使用 Cookie,但这些 Cookie 只能在特定的分区中访问。
要启用 CHIPS,你只需在服务器端设置 Partitioned
属性:
Set-Cookie: __Host-name=value; Path=/; SameSite=None; Secure; Partitioned;
这将使 Cookie 在跨站点上下文中可用,虽然会受到分区的限制,但非常适用被动显示的嵌入服务、自动登录、文档权限控制、CDN 缓存等场景。
2. 使用 Storage Access API 请求用户授权存储 Cookie
Storage Access API 允许网站主动请求访问其在第三方上下文中的存储(包括 Cookie)。这对于需要在 iframe 中使用 Cookie 的场景非常有用。
要使用 Storage Access API,你可以在 iframe 嵌入的网页中调用 document.requestStorageAccess()
方法:
if (document.requestStorageAccess) {
document
.requestStorageAccess()
.then(() => {
// 成功获取存储访问权限
console.log("Storage access granted");
})
.catch(error => {
// 用户拒绝或发生错误
console.error("Storage access denied:", error);
});
} else {
console.warn("Storage Access API is not supported in this browser");
}
Storage Access API 目前已获得主流现代浏览器的广泛支持,包括 Safari、Firefox、Chrome、Edge 以及基于 Chromium 的其他浏览器。
注意,用户必须明确同意才能授予存储访问权限,因此这可能会影响用户体验。
这种方式适用于某些第三方嵌入内容需要访问未分区的 Cookie 或存储空间,才能为用户提供更好的体验情况。
例如,需要登录会话详细信息的嵌入式评论插件,嵌入式付款系统或视频网站等服务。
Storage Access API 规范 提供了更多详细信息。
3. RWS 与 FedCM
RWS(Related Website Set)是一种网络平台机制,允许网站声明它们之间的关系,从而使浏览器能够更好地管理跨站点 Cookie 的使用,并向用户显示这些信息。
而 FedCM(Federated Credential Management)则是一种联合身份认证服务方法,不依赖于第三方 Cookie 或导航重定向。
这两种技术都由谷歌提出,但是目前遭到其他两家浏览器厂商反对或未实现,而且已经超脱Cookie的范畴,所以这里不做详细介绍。
相关信息可以在这里查看:Related Website Sets 提案、Federated Credential Management 提案
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。