谷歌浏览器SameSite=lax导致嵌入Iframe 地址无法设置cookie问题

 

  • 问题描述:

    页面中通过Iframe嵌入了另外一个网页,但是嵌入的网页无法设置cookie,导致无法访问。仔细检查,在浏览Set-cookie的响应头出发现提示:This Set-Cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=lax", and was blocked because it came from a cross-site response which was not the response to a top-level navigation. ....

  • 原因:谷歌最新版的浏览器默认SameSite=Lax (该设置从2020 年7月14全面展开,具体见:https://www.chromestatus.com/feature/5088147346030592),如果设置SameSite=Lax , 并且嵌入Iframe的地址和iframe外的地址不是SameSite,那么嵌入iframe的地址将无法设置设置cookie。关于什么是SameSite,首先应该理解site,所谓Site就是域名后缀和其前面的第一部分,比如web.dev可以是一个Site,从而www.web.devstatic.web.dev 可以看成相同的Site。具体可以参考SameSite解释https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00

  • 解决方法(提供三种作为参考):

    • 在谷歌浏览器搜索 chrome://flags/#same-site-by-default-cookies        chrome://flags/#cookies-without-same-site-must-be-secure 将这两项设置为Disabled,并重启浏览器。这种方法可以临时解决用户不能使用的问题。

    • 采用一定方法将嵌入Iframe的地址配置成 Same Site ,比如使用nginx 代理。

    • 在设置Cookie的响应头中添加 SameSite=None;Secure ,在Cookie响应头设置SameSite=None就可以替换谷歌浏览器的默认配置,而SameSite=None可以允许跨Site设置Cookie。一个完整的cookie响应头可以像这样: Set-Cookie: JSESSIONID=ACD341E8840C03003E4532921C21C035;Path=/begin01; SameSite=None; Secure ,至于怎么加响应头SameSite=None;Secure,可以考虑在nginx里设置,参考:https://blog.cat73.org/20170802/2017080201.nginx-cookie-sucure/,也可以在后台代码里设置,推荐nginx吧。这里注意一点 Secure 属性,这个属性说明设置的该cookie只能在https下传输,所以要求你使用https,不使用行吗,不行,因为SameSite=None 要求必须要和Secure=true一起使用。所以采用这个方法解决,你嵌入iframe的页面必须使用https。

  • 最后再附上两张解决前和解决后cookie响应头的对比

     解决前:

无法设置cookie

     解决后:

解决后图片

 

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值