【Django】谷歌浏览器新版本Chrome 80默认SameSite导致跨域登录状态失效的问题

一、 问题描述

但是Django后台发送给chrome浏览器的response header中set-session中默认加上了
SameSite=Lax。这个属性禁止第三方请求携带cookie,导致chrom浏览器request请求不能携带
cookie。当时在Django setting.py中添加以下设置,禁用chrom中的SamSite属性或者说Django 返
回的response header中set-session中SameSite=None

二、SamSite解释

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

三、解决方案

假设读者已经解决了前后端跨域和CSRF问题,如果没有请参考博主的另一篇文章:https://www.jianshu.com/p/b61f2cdef9d7

该方案现测试适用于django版本 > 2.1.0

#settings.py
#COOKIE_SAMESITE:简单跨域解决SAMESIT问题
SESSION_COOKIE_SAMESITE = None
#CSRF_COOKIE_SAMESITE:CSRF跨域解决SAMESITE问题
CSRF_COOKIE_SAMESITE = None

你可能感兴趣的:(【Django】谷歌浏览器新版本Chrome 80默认SameSite导致跨域登录状态失效的问题)