關(guān)于 “Chrome 修改對未設(shè)置 SameSite 的 cookie,視作 SameSite:Lax 處理的變更” 的問題,目前看,最妥善的解決方案還是按照規(guī)矩辦事兒,目前 Chrome 是行動最快的,而 FireFox 和 Edge 也在積極跟進(jìn),持支持態(tài)度。
影響范圍:
如果你的項(xiàng)目中有如下跨域場景:
- 跨域的 ajax 請求;
- 跨域嵌入的 iframe;
- 跨域的圖片資源請求;
- 跨域的 POST FORM 表單;
如果存在這類跨域場景,且在服務(wù)端接收請求的時(shí)候,需要使用流量中的 cookie,則需要注意:這個(gè) cookie 在設(shè)置的時(shí)候,是否明確有: SameSite:None; Secure 這兩個(gè)屬性。如果沒有的話,就會受到此策略影響。
例子:
在 a.com 的頁面中,加載 b.com 的 iframe,且希望 iframe 請求的流量中,攜帶 b.com 的 cookie,用其中的 login_token 作為登錄憑證。
+------------------+ +-----------------+
| a.com | | b.com |
| +------------+ | cookie: | |
| | | | login_token | |
| | <iframe> +----------x-----------> |
| | | | | |
| +------------+ | | |
+------------------+ +-----------------+
+----------------------------------------------------------+
| Set-Cookie: login_token=x.xxxxxx; path=/; domain=b.com |
+----------------------------------------------------------+
如果此 token 的 cookie 在設(shè)置的時(shí)候,未指明 SameSite:None; Secure 這兩個(gè)屬性,如:
set-cookie: login_token=x.xxxxxx; path=/; domain=b.com
則實(shí)際請求中,不會攜帶 login_token 這條 cookie,因此,iframe 實(shí)際處于未登錄狀態(tài)。
其他場景,如 Ajax,與此同理。
變更:
在舊策略中,當(dāng) set-cookie 時(shí)不顯式聲明 SameSite 時(shí)(或只聲明 SameSite,未使用 Secure 時(shí)),瀏覽器會自動視為 SameSite:None,即不限制 cookie。此時(shí)上面場景中的 cookie 是可以正常發(fā)送的。
在新策略中,如上場景,會視為 SameSite:Lax,即只有在特定情況下,才會攜帶 cookie。上面場景中的 iframe 的請求中,不會攜帶 cookie。
解決
最正當(dāng)?shù)慕鉀Q方法,就是在對需要跨域發(fā)送的 cookie 進(jìn)行 set-cookie 的時(shí)候,顯式聲明 SameSite:None; Secure 屬性,如:
set-cookie: ck01=vl01; Path=/; Secure; SameSite=None
通過此種方法,允許 cookie 隨跨域流量發(fā)送。
否則,只能通過調(diào)整域、以及攜帶參數(shù)的方式解決。
臨時(shí)的解決方案,可以暫時(shí)讓出現(xiàn)問題的瀏覽器,通過設(shè)置解決,方式如下:
- 在 chrome 地址欄輸入
chrome://flags

- 在配置項(xiàng)中,搜索
samesite

- 將以下幾項(xiàng),設(shè)置為
disabled

- 重啟瀏覽器
相關(guān)資料
SameSite 屬性介紹:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies#SameSite_Cookies關(guān)于 SameSite 機(jī)制的介紹:
https://web.dev/samesite-cookies-explained/
https://web.dev/samesite-cookie-recipes/chrome 關(guān)于更換 SameSite 策略的文章:
https://blog.chromium.org/2019/10/developers-get-ready-for-new.html測試 SameSite 特性的網(wǎng)站:
https://samesite-sandbox.glitch.me/