chrome80默认SameSite导致iframe无法获取cookie问题解决方法
项目背景及问题定位
项目背景
A网站(假设为http://SameSite.a.com)作为iframe内嵌在B网站(假设为http://test.a.com)。在B网站中加载A网站的时候,自动登录失效,导致接口一直重调。
问题定位
- 初步分析,A网站为第三方页面,将A网站直接在外部打开可以单独访问,排除A网站的问题
- 更换浏览器,在火狐和Edge中,A网站可正常在iframe中加载。初步定位为浏览器兼容问题
- 对比不能正常加载和正常加载的chrome浏览器版本,都更新到最新的89版本。发现状态没变,能加载的还是能,不行的依然加载不了。(因为这个现象,导致对是否是浏览器版本兼容问题产生了怀疑)
- 打开浏览器控制台,发现接口请求报错,控制台出现以下提示
错误与SameSite属性有关系,因此去查了一下SameSite相关的问题。SameSite相关属性可参考阮一峰的《Cookie 的 SameSite 属性》
问题出现的原因
Google将在2020年2月4号发布的 Chrome 80 版本(schedule:https://www.chromestatus.com/features/schedule)中默认屏蔽所有第三方 Cookie,即默认为所有 Cookie 加上SameSite=Lax
属性(https://www.chromestatus.com/feature/5088147346030592), 并且拒绝非Secure的Cookie设为 SameSite=None
(https://www.chromestatus.com/feature/5633521622188032) 此举是为了从源头屏蔽 CSRF 漏洞
以下场景会在Chrome80中受到影响:
- 组件数据基于第三方登陆态的 API 请求
- http 本地部署
解决方案
当前项目环境:A网站与B网站主域名保持一致,A网站域名为https。下面方法未奏效可以先考虑一下环境问题
2021/6/9日更新:以下解决方案仅对80版本生效。90版本更新后,方案1已失效,无法手动设置SameSite的值。文末方案初步怀疑也失效了。最好的解决方案还是升级成https协议同时保持二者域名一致
注意事项:
- SameSite=None需要只对chrome80以上版本进行设置,原因在于chrome51-chrome66以及其他某些浏览器不接受SameSite=None
- 如果网站存在http与https同时使用的情况,需要对此做兼容,只有https的时候才设置Secure;SameSite=None。原因在于当Secure设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证。
- 根据谷歌文档Reject insecure SameSite=None cookies中所述,85版本后默认启用“拒绝非安全的samesite=none的cookie”这一特性,要同时显式声明secure=true,这个cookie才能跨域携带。
解决方案
- Chrome中打开标签页,分别输入以下两个链接,将图示配置设为Disabled。(亲测有效,可以当做应急方案,更新配置后得重启浏览器,才能生效)
chrome://flags/#same-site-by-default-cookies
chrome://flags/#cookies-without-same-site-must-be-secure
- 使用火狐或Edge浏览器(有效)或者将chrome降级到79及以下版本,并关闭自动更新(未试验,个人不推荐,方案用户体验太差)
- 将两个系统部署到同一台服务器,通过相同IP同源策略传送cookie。(未试验)
- 购买SSL证书,升级HTTP服务,将API切换成HTTPS协议请求,并且检查响应头中的Set-Cookie中是否包含了SameSite=None和Secure属性(85以后版本需显式设置Secure=true)
总结
- 虽然问题解决了,的确是浏览器版本问题,但是为什么有些电脑能正常加载有些不行,这个还是不清楚原因
- 本次问题使用的方案四解决了,但是在浏览博文的时候,还是踩了很多坑后才找到了最终的解决方法。
简单介绍一下方案4实际解决问题的方案:
- 如果前端所需cookie是后端直接通过Set-cookie的方式来存在浏览器中的,那么则需要后端在
response
响应头上设置属性。每个所需要的cookie都得设置一遍。没设置的就会出现图示的黄色标识(提醒你无法成功设置cookie),这种cookie是读取不了的
response.setHeader(name: "Set-Cookie", value: "_u=xxxx; Path=/Login; SameSite=None; Secure=true")
- 也可以在Nginx中设置,自动给cookie增加这两个属性(给所有cookie都设置这个不是特别安全,不推荐用这个,只给特定的需要的cookie按上面的方案设置一下就行了)
# 只支持 proxy 模式下设置
proxy_cookie_path / "/; httponly; Secure=true; SameSite=None";
- 第一个方法只适用于后端设置的cookie,本次遇见的问题中,cookie是前端将后端返回的数据拿到后再存在浏览器中的,导致按照第一种方法一直解决不了问题。如果是前端将cookie存入浏览器中的话,那只需要写入如下代码,即可设置相应cookie的属性,从而解决问题了
Cookies.set("Admin-Token", res.token);
document.cookie = "Admin-Token=" + res.token + ";SameSite=None; Secure=true";
参考文章
阮一峰:《Cookie 的 SameSite 属性》
关于 Chrome (谷歌浏览器)升级到 80 后可能产生的影响以及解决方案
浏览器的SameSite策略
chrome浏览器跨域Cookie的SameSite问题导致访问iframe内嵌页面异常
chrome80默认SameSite导致iframe无法获取cookie问题解决方法相关推荐
- php使用CURL不依赖COOKIEJAR获取COOKIE的方法
本文实例讲述了php使用CURL不依赖COOKIEJAR获取COOKIE的方法.分享给大家供大家参考.具体分析如下: PHP中CURL类是一个非常牛逼的工具类,具体怎么牛逼就不啰嗦了. 对于COOKI ...
- javascript设置和获取cookie的方法
设置cookie的方法,和获取cookie的方法例如以下 设置cookie document.cookie="name="+value; //获取cookie当中index是coo ...
- html获取cookiejs,javascript设置和获取cookie的方法实例详解
本文实例讲述了javascript设置和获取cookie的方法.分享给大家供大家参考,具体如下: 1. 设置cookie function setCookie(cookieName,cookieVal ...
- 获取cookie的方法
获取cookie的方法- Chrome按F12,点击Application,左边点击Cookies,选择测试的url,获取BAIDUID.BDUSS的name与value 如果用Firefox,则在页 ...
- request 获取cookie的方法
request获取cookie的代码如下: Cookie[] cookieArr = request.getCookies();if(cookieArr != null && cook ...
- python获取cookie的方法_python实现登录后获取cookie并用于之后的请求
初学python接口自动化,一些经验总结,希望遇到同样问题的小伙伴能较快解决: 依据项目的实现逻辑,用户发表评论时需检测用户当前为登录状态,即校验cookie. 用户登录后在响应头里可见到Set-co ...
- php curl cookiejar,php使用CURL不依赖COOKIEJAR获取COOKIE的方法
php在使用curl处理COOKIE是通常都需要创建保存的文件 (cookie.txt) 然后依赖依赖一下两个方法: curl_setopt($ch, CURLOPT_COOKIEFILE, 'coo ...
- js获取cookie的方法【简易】
function getCookie(cname) {let name = cname + "=";let ca = document.cookie.split(";&q ...
- python 导入numpy 导致多进程绑定同一个CPU问题解决方法
python 如果有导入numpy模块的import语句,会导致默认将多进程程序的每个进程都绑定到同一个CPU core上, 失去了多进程在多核CPU上的性能优越性,这和CPU affinity(CP ...
最新文章
- 重装电脑后遇到的问题,其他设备,未知设备
- 深度学习的多个loss如何平衡?
- 人性漫画:打工与创业的残酷区别……
- 游戏企业的“逆袭”,从用好这套解决方案开始 →
- C/C++添加设置任务计划
- 25 个在 Web 中嵌入图表的免费资源
- 打印pdf就一页_PDF 文件转换工具
- 利用C#实现分布式数据库查询
- 2021年暑期旅游数据报告
- C语言#define预处理
- ubuntu软件源更换方法
- HDU 5067 Harry And Dig Machine:TSP(旅行商)
- 我要自学编程,Java和C语言相比哪个好?
- 深度学习之神经网络核心原理与算法-caffekeras框架图片分类
- jdk13新特性(jdk18新特性)
- 微电子学属于计算机专业吗,微电子学
- python 实现扫描器,arp欺骗,数据包分析。
- 域适应(Domain Adaptation)综述
- nao机器人学习笔记1
- 例题5-10 PGA巡回赛的奖金(PGA Tour Prize Money,ACM/ICPC World Finals 1990 UVa207)
热门文章
- 文献综述十九:基于会员通用积分的客户关系管理系统设计与实现
- Struts2 漏洞信息汇总
- linux虚拟IP/yum Invalid version flag: if 错误//configure:错误:HTTP重写模块需要PCRE库。
- 为react组件增加扩展class,解决react组件不能自定义className不生效的问题
- windows 快捷键概述(Windows Accelerators)---严格来说,应该称为键盘加速器
- 企业财务管理利器——凭证导入接口
- python 最好用的数据库模块_Python 使用pymysql模块操作数据库
- 数学建模——多元分析、综合评价与决策
- 关于linux下raid的设备文件和格式化
- 超700万个NFT存储在星际文件系统网络上,总量超54TiB