一锐峭、 問題描述
但是Django后臺發(fā)送給chrome瀏覽器的response header中set-session中默認(rèn)加上了
SameSite=Lax停忿。這個屬性禁止第三方請求攜帶cookie,導(dǎo)致chrom瀏覽器request請求不能攜帶
cookie驾讲。當(dāng)時在Django setting.py中添加以下設(shè)置,禁用chrom中的SamSite屬性或者說Django 返
回的response header中set-session中SameSite=None
二席赂、SamSite解釋
Cookie 的SameSite屬性用來限制第三方 Cookie吮铭,從而減少安全風(fēng)險。
它可以設(shè)置三個值:Strict颅停、Lax谓晌、None
2.1、Strict解釋
Strict最為嚴(yán)格癞揉,完全禁止第三方 Cookie纸肉,跨站點時,任何情況下都不會發(fā)送 Cookie喊熟。換言之柏肪,
只有當(dāng)前網(wǎng)頁的 URL 與請求目標(biāo)一致,才會帶上 Cookie芥牌。
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
這個規(guī)則過于嚴(yán)格烦味,可能造成非常不好的用戶體驗。比如壁拉,當(dāng)前網(wǎng)頁有一個 GitHub 鏈接谬俄,用戶點
擊跳轉(zhuǎn)就不會帶有 GitHub 的 Cookie岩遗,跳轉(zhuǎn)過去總是未登陸狀態(tài)。
2.2凤瘦、Lax解釋
Lax規(guī)則稍稍放寬,大多數(shù)情況也是不發(fā)送第三方 Cookie案铺,但是導(dǎo)航到目標(biāo)網(wǎng)址的 Get 請求除外蔬芥。
Set-Cookie: CookieName=CookieValue; SameSite=Lax;
設(shè)置了Strict或Lax以后,基本就杜絕了 CSRF 攻擊控汉。當(dāng)然笔诵,前提是用戶瀏覽器支持 SameSite 屬性。
2.3姑子、None解釋
Chrome 計劃將Lax變?yōu)槟J(rèn)設(shè)置乎婿。這時,網(wǎng)站可以選擇顯式關(guān)閉SameSite屬性街佑,將其設(shè)為
None谢翎。不過,前提是必須同時設(shè)置Secure屬性(Cookie 只能通過 HTTPS 協(xié)議發(fā)送)沐旨,否則無效森逮。
下面的設(shè)置無效。
Set-Cookie: widget_session=abc123; SameSite=None
下面的設(shè)置有效磁携。
Set-Cookie: widget_session=abc123; SameSite=None; Secure
三褒侧、解決方案
假設(shè)讀者已經(jīng)解決了前后端跨域和CSRF問題,如果沒有請參考博主的另一篇文章:http://www.reibang.com/p/b61f2cdef9d7
該方案現(xiàn)測試適用于django版本 > 2.1.0
#settings.py
#COOKIE_SAMESITE:簡單跨域解決SAMESIT問題
SESSION_COOKIE_SAMESITE = None
#CSRF_COOKIE_SAMESITE:CSRF跨域解決SAMESITE問題
CSRF_COOKIE_SAMESITE = None