现象:
- 一些集成了三方sso登录鉴权系统, 需要反向写入自有域名cookie. 但是发现无法写入.
原因分析:
- chrome 一般会为cookie信息设置 SameSite属性,用来防止 CSRF 攻击和用户追踪。谷歌默认SameSite属性的为Lax。
解决方案
解决方法A - 适用于 80 -90 版本
如果是 80 及以上版本, 修改浏览器默认安全策略为 Disabled 状态, 然后重启浏览器, 重试登录即可
1, Chorme 浏览器检查版本号, 80 版本后修改了跨域安全问题, 通过 Chrome 菜单, 选择”关于 Google Chorme”, 检查版本号是否大于或等于 80
2,地址栏输入:chrome://flags/#same-site-by-default-cookies
3、地址栏输入:chrome://flags/#cookies-without-same-site-must-be-secure
4、 部分同学可能设置了严格的安全模式,需要调整cookie限制等级
Chrome → 设置 → 隐私设置和安全性 →设置等级为 (允许所有cookie or 在无痕模式下阻止第三方cookie)
5、重启浏览器。
解决方案B - 适用于91 - 94 版本
Mac:Mac系统下可以通过命令行携带参数打开浏览器的方式来解决,前提须关闭所有浏览器窗口并退出浏览器后再进行操作。
1 | 开启Chrome命令:open -a "Google Chrome" --args --disable-features=SameSiteByDefaultCookies |
解决方案C - 适用于94及以上版本的Chrome浏览器
Chromium项目官网 提到在94版本通过命令行禁用设置SameSite默认值的方式会被移除,到时方案1和方案2的方式都将无法使用,后续可通过nginx等代理工具或软件将跨域请求转为非跨域请求来解决改问题。
或者基于实验属性进行尝试
1、地址栏输入:chrome://flags/ ,并在当前页面搜索: Block insecure private network requests.
, 并且设置为disabled
解决方案D - 最新版本Chrome浏览器(140+)
- 开发调试环境
1 | 使用命令行禁用检查启动chrome(未完全验证是否可行) |
- 生产环境
后端正确配置 CORS 头部,包括 Access-Control-Allow-Credentials: true。
后端发送带有 SameSite=None; Secure 属性的 Set-Cookie(如果使用 Cookie 进行登录认证)。
前端在发送跨域请求时,如果需要携带凭证,确保传递相关选项(如 fetch 的 credentials: ‘include’)。