谷歌在Chrome 80版本改變了cookie的samesite默認值,在此一起加深下理解。
一、首先簡要說下samesite的幾個值。
- Strict 僅允許一方請求攜帶 Cookie,即瀏覽器將只發送相同站點請求的 Cookie,即當前網頁 URL 與請求目標 URL 完全一致。
- Lax 允許部分第三方請求攜帶 Cookie
- None 無論是否跨站都會發送 Cookie
之前默認是 None 的,Chrome80 后默認是 Lax。如果Chrome80后想要將其設置為None,需要同時將secure
屬性設置為true
。這也意味着你的后端服務域名必需使用https
協議訪問,否則 None是無效的。
二、其次談下 xhr中的cookie,在同域時cookie默認會發送,withCredentials屬性此時是設為false也是無效的;但在跨域時,withCredentials默認為false,是不發送cookie的,設為 true 即可在跨域時 也能發送cookie;
三、此時說下 跨域和跨站 這兩個是不同的定義。
1. 首先要理解的一點就是跨站和跨域是不同的。同站(same-site)/跨站(cross-site)」和第一方(first-party)/第三方(third-party)是等價的。但是與瀏覽器同源策略(SOP)中的「同源(same-origin)/跨域(cross-origin)」是完全不同的概念。
同源策略的同源是指兩個 URL 的協議/主機名/端口一致。例如,https://www.taobao.com/pages/...,它的協議是 https,主機名是 www.taobao.com,端口是 443。
同源策略作為瀏覽器的安全基石,其「同源」判斷是比較嚴格的,相對而言,Cookie中的「同站」判斷就比較寬松:只要兩個 URL 的 eTLD+1 相同即可,不需要考慮協議和端口。其中,eTLD 表示有效頂級域名,注冊於 Mozilla 維護的公共后綴列表(Public Suffix List)中,例如,.com、.co.uk、.github.io 等。eTLD+1 則表示,有效頂級域名+二級域名,例如 taobao.com 等。
舉幾個例子,www.taobao.com 和 www.baidu.com 是跨站,www.a.taobao.com 和 www.b.taobao.com 是同站,a.github.io 和 b.github.io 是跨站(注意是跨站)。
2.根據 跨域 和 跨站 定義的 不同,我們可以知道 跨站一定跨域,但是跨域不一定跨站。
四、最后說下
那么是否存在一種情況,withCredentials屬性值和samesite值會出現沖突,此時誰的權重更高呢?答案是存在的,此時以samesite為主。舉個例子:
在a.demo2.com
域名下,ajax請求a.demo.com
的api,此時是跨站 且跨域 的,需要設置withCredentials
才能帶上cookie,但如果此時cookie中的samesite值為Lax或Strict,此ajax請求是不能攜帶cookie的。
五、具體關於samesite和withCredentials的知識可以查看參考文章
參考文章:withCredentials