记一次cookie跨域跨站问题

记一次cookie跨域跨站问题

背景

在第三方页面上使用iframe嵌入我这边页面,但是访问我这边页面的前提是需要先登录才能访问,这个时候需要将登录信息放入cookie中实现免登,由此引发了一些cookie跨域跨站问题,小记一波,以作留念。

解决过程

一开始我的做法是提供一个接口给第三方,第三方调我接口时,我在后端接口中将登录信息放入cookie中,再使用redirect重定向到最终要访问的页面。当时自测时是没问题的,但是当将接口提供给第三方时却出现了cookie跨域问题,原因是我自测时是直接在浏览器上调用我接口,所以没问题,但是目前的情况是在第三方的页面上使用iframe嵌入我们页面,而出现cookie跨域的问题是因为通过第三方的服务器调用我这边接口,我接口在设置cookie时拿到的是第三方的域名,所以出现了cookie放入第三方域名中,而不是我自己的域名下,最终重定向到要访问的页面时,因为我这边cookie域名下没有登录信息,所以跳转到了登录页。

知道了问题所在,所以排除了在调用接口时,在后端去设置cookie,那我将重定向改成返回我们页面地址,在地址中将登录token拼接上,访问页面时,在前端路由中做个处理,将链接中的登录参数拿到,由前端将登录信息放入cookie中,这总行了吧?结果是:不管前端怎么去setCookie,都无法将参数放入cookie中,前端本就半吊子的我,最后选择在后端提供一个接口,去做cookie操作,然后在我们前端路由中去调用这个接口,哎,结果还是无法放入cookie,但是突然发现了一个东西:
在这里插入图片描述

提示:This Set-Cookie header didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax," and was blocked because it come from a cross-site response which was not the response to a top-level navigation. The Set-Cookie had to have been set with "SameSite=None" to enable cross-site usage.

根据上图的Set-Cookie可以发现,后端已经做了塞cookie的操作了,但是却没有成功,并且出现了上面的提示,查询后发现是跨站了,怪不得不管是前端还是后端去存入cookie都是无效的,后来往这方面深入了解后发现,在设置cookie时,需要加入如下属性:SameSite=None; Secure;不管是前端,还是后端,只要加了这个,就能成功放入cookie。好了,在本地已经解决问题了,部署到测试环境后发现,设置cookie还是无效的,原来是因为测试环境只支持http,而SameSite=None; Secure;这个属性必须在https才能生效。好了,问题解决,记录一下。最后附上SameSite=None; Secure;的一些内容:

  • SameSite 属性
    Cookie 的SameSite属性用来限制第三方 Cookie,从而减少安全风险。
    它可以设置三个值:Strict、Lax、None。

    • Strict
      Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。这个规则过于严格,可能造成非常不好的用户体验。比如,当前网页有一个 GitHub 链接,用户点击跳转就不会带有 GitHub 的 Cookie,跳转过去总是未登陆状态。
    Set-Cookie: CookieName=CookieValue; SameSite=Strict;
    
    • Lax
      Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。
    Set-Cookie: CookieName=CookieValue; SameSite=Lax;
    
    • None
      Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
    下面的设置无效。
    Set-Cookie: CookieName=CookieValue; SameSite=None
    
    下面的设置有效。
    Set-Cookie: CookieName=CookieValue; SameSite=None; Secure
    
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值