localhost cookie认证失败,一直跳回登录页面?

2,422 阅读2分钟

问题描述

因为公司系统登录页面是单独的项目,所以每次登录之后(此时为 39.xxx)需要跳转到 localhost来进行开发,但是在经过几天愉快开发之后,localhost 登录不了了。

解决思路

  1. 首先排查前端问题是否获取到了 cookie

    每次前端都获取到了一个新的 cookie(后端认为你在重新登录了),即 localhost 一开始未获取到登录页面的 cookie

  2. 排查后端是否作了修改

    询问之后并未作出修改

  3. 用 postman 测试后端登录是否好使

    结果登录也好使,思路在这卡了很久

逆向思考

为何之前可以通过切换 localhost 来获取 cookie?

切换到 localhost需要去传递 sid 给后端,让后端验证我当前是否登录,而前端则是通过发送 39.xxx/.../login请求验证登录,并将当前 cookie 带到后端。

登录时 cookie 获取正常,那么会不会在 localhost 下验证登录时,验证登录出现了问题呢?

问题原因

谷歌浏览器 80 版本修改了 SameSite 默认值。SameSite决定了是否能够跨站请求(是否使用第三方 cookie)。SameSite的属性:

  • Strict:最为严格,禁止了第三方 cookie,cookie 必须同站或者为其自域

  • Lax(谷歌浏览器 80 之后的默认值):大多数情况也是不发送第三方 Cookie,get 请求除外

  • None:可以允许跨站访问 cookie (我们所期望的值)

    为何会做出这方面修改?猜测是谷歌之前因为用户隐私这块罚太多款了,因为通过第三方 cookie 我们可以了解到用户很多信息(有兴趣可以搜索一下第三方 cookie 关键字),其他浏览器据说也早就禁用了第三方 cookie(自由)。

    为何会突然登录不上呢?猜测可能是谷歌浏览器自动更新了,也可能是谷歌这次改动是灰度发布,让用户一点点进行改动(有兴趣可以搜索一下灰度发布)。

解决方法

  • 浏览器关闭限制(仅在本地有效)

    1. 地址栏输入:chrome://flags/
    2. 找到 SameSite by default cookies 和 Cookies without SameSite must be secure
    3. 将上面两项设置为 Disable
    
  • SameSite设置为 None(适用于单点登录且不在同站)

    我们需要将 SameSite 设置为 None,设置之后,后端也需要将请求改为 https,前端并且设置Secure(只能在HTTPS连接中传输,HTTP连接不会传输)。

    response.setHeader(name: "Set-Cookie", value: "id=xxxx; Path=/;SameSite=None; Secure")
    

总结

发现问题时,我们需要想想其如何工作,然后按照条例来进行分析。

拓展

如果你还想了解更多的 Cookie 知识,请移步浅谈 Cookie,也欢迎斧正。