第三方Cookie被浏览器拦截了怎么办?

シ建宇 阅读 16

我在做嵌入式Widget开发,主站A要嵌入到第三方网站B的iframe里,需要读取之前在A站设置的Cookie来识别用户。但最近Chrome和Safari直接不发这个Cookie了,导致用户状态丢失。

我试过给Cookie加SameSite=None; Secure,也确认了域名是HTTPS,但还是不行。是不是现在第三方Cookie默认就被禁了?有没有其他办法能跨站保持登录状态?

document.cookie = "user_token=abc123; Domain=.example.com; Path=/; SameSite=None; Secure";
我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
慕容金利
第三方Cookie确实现在默认被Chrome、Safari这些主流浏览器干掉了,你那个SameSite=None; Secure设置本身没问题,但现在浏览器根本不认这个,该拦还是拦。

几个可行的替代方案:

方案一:CNAME把第三方域名变成第一方

这是最干脆的办法。把B站嵌入的iframe域名(比如widget-a.example.com)通过CNAME解析到主站A的域名(比如www.example.com),或者反过来让A站域名解析到B站。这样Cookie就变成第一方Cookie了,浏览器不会拦截。代价是要改DNS配置。

方案二:postMessage通信

让第三方网站B通过window.postMessage把domain信息发给A站的iframe,A站后端根据这个信息查表获取用户状态。不需要Cookie了,直接走接口。但这种方式需要B站配合改代码。

方案三:后端Session中转

用户登录时在A站域名下生成session,第三方iframe加载时先调用A站的后端接口,后端根据请求的Origin判断是否允许访问,返回用户信息。这样完全绕过Cookie。

方案四:Storage Access API

Safari支持的比较积极,Chrome也开始支持了。代码大概是:

if (document.requestStorageAccess) {
document.requestStorageAccess().then(
() => { console.log('获得权限'); },
() => { console.log('被拒绝'); }
);
}


但这个需要用户主动授权,体验不太好,而且只有部分浏览器支持。

我的建议: 优先看能不能CNAME,这是改动最小效果最好的方案。如果域名不能改,就走postMessage或者后端接口中转。第三方Cookie被淘汰是早晚的事,劝你早点迁移方案。
点赞
2026-03-17 13:16