Chrome中跨域请求无法携带Cookie的解决方案

Chrome中跨域请求无法携带Cookie的解决方案
最新回答
左手牵右手。

2021-11-09 16:00:20

Chrome中跨域请求无法携带Cookie的解决方案

在Chrome浏览器中,由于安全策略的升级,跨域请求在默认情况下可能无法携带Cookie。这尤其在使用iframe跨系统展示页面时表现得尤为明显,如单点登录(SSO)场景中经常遇到此类问题。以下是根据不同Chrome版本提供的解决方案:

1. 低于91版本的Chrome浏览器

对于低于91版本的Chrome浏览器,可以通过修改浏览器内部设置来解决跨域请求无法携带Cookie的问题:

  • 步骤

    在Chrome浏览器中输入地址栏chrome://flags/#same-site-by-default-cookies。

    将SameSite by default cookies设置为Disabled。

    重启浏览器后运行项目。

  • 说明:该设置默认情况下会将未指定SameSite属性的请求看做SameSite=Lax来处理,禁用后,跨域请求将能够携带Cookie。

2. 91版本及以上的Chrome浏览器

从91版本开始,Chrome移除了上述设置选项,因此需要采用其他方法:

  • Windows系统

    找到Chrome快捷方式的属性。

    在目标字段后添加--disable-features=SameSiteByDefaultCookies。

    点击确定,关闭所有Chrome窗口(包括Chrome浏览器进程)后重启浏览器。

  • 注意:该方法可能会对开发调试造成不便,如JS中的debugger无法被正确定位。

  • Mac系统

    关闭所有浏览器窗口并完全退出浏览器。

    打开终端,输入以下命令之一(根据使用的浏览器选择):

    对于Chrome浏览器:open -a "Google Chrome" --args --disable-features=SameSiteByDefaultCookies

    对于Chromium版Edge浏览器:open -a "Microsoft Edge" --args --disable-features=SameSiteByDefaultCookies

    如果命令执行后问题依旧,尝试重启浏览器后再次执行命令。

  • 图片示例

3. 94及以上版本的Chrome浏览器

从94版本开始,通过命令行禁用SameSite默认值的方式将被移除,因此上述方案将不再适用。此时,可以考虑以下替代方案:

  • 使用代理工具:通过nginx等代理工具或软件,将跨域请求转为非跨域请求。这种方法需要配置代理服务器,并修改前端请求的URL,使其指向代理服务器而非直接跨域访问。

  • 修改后端设置:如果可能,修改后端服务器的设置,允许跨域请求携带Cookie。这通常涉及设置CORS(跨源资源共享)策略,并明确指定哪些源可以访问Cookie。

  • 使用其他浏览器:作为临时解决方案,可以考虑使用其他浏览器(如360浏览器等),这些浏览器可能未实施与Chrome相同的严格安全策略。

总结

Chrome浏览器的安全策略升级对跨域请求携带Cookie造成了影响,但根据不同的浏览器版本,可以采取不同的解决方案来应对。对于开发者而言,了解并适应这些变化是确保应用正常运行的关键。同时,也建议持续关注Chrome浏览器的更新动态,以便及时调整应对策略。