關於cookie的 samesite和xHr 的withCredentials的思考


谷歌在Chrome 80版本改變了cookie的samesite默認值,在此一起加深下理解。

一、首先簡要說下samesite的幾個值。

  1. Strict 僅允許一方請求攜帶 Cookie,即瀏覽器將只發送相同站點請求的 Cookie,即當前網頁 URL 與請求目標 URL 完全一致。
  2. Lax 允許部分第三方請求攜帶 Cookie
  3. 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  

  samesite1

  samesite2

        cookie


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM