一、現象
部分用戶在用chrome瀏覽器審批時,在待辦中調用服務重復302,直至滿一分鍾失敗。點開服務詳情, 會看到設置cookie失敗的標識
二、原因及背景
Google 為了杜絕 CSRF(CSRF攻擊參考:https://blog.csdn.net/freeking101/article/details/86537087 )的發生,Chrome會將沒有聲明SameSite值的cookie默認設置為SameSite=Lax。只有采用SameSite=None; Secure設置的cookie可以從外部訪問,前提是通過安全連接(即HTTPS)訪問 (該設置從2020 年7月14全面展開,具體見:https://www.chromestatus.com/feature/5088147346030592),如果設置SameSite=Lax , 並且嵌入Iframe的地址和iframe外的地址不是SameSite,那么嵌入iframe的地址將無法設置設置cookie。所以目前待辦頁通過cookie去登陸拿用戶信息這種鑒權手段將會失效!
那同樣是最新版本Chrome,為什么有些用戶不受影響?
在https://www.chromium.org/updates/same-site中,Chrome官方也給出了解釋,他們也知道SameSite是“具有較大潛在破壞力的功能”,因此他們的策略是針對部分用戶逐步推出,直到最終覆蓋100%的Chrome用戶
什么是SameSite
SameSite是Cookie中的一個屬性,它用來標明這個 cookie 是個“同站 cookie”,“同站 cookie” 只能作為第一方cookie,不能作為第三方cookie,因此可以限制第三方Cookie,解決CSRF的問題。早在Chrome 51中就引入了這一屬性,但是不會默認設置,所以相安無事。
第三方Cookie:由當前a.com頁面發起的請求的 URL 不一定也是 a.com 上的,可能有 b.com 的,也可能有 c.com 的。我們把發送給 a.com 上的請求叫做第一方請求(first-party request),發送給 b.com 和 c.com 等的請求叫做第三方請求(third-party request),第三方請求和第一方請求一樣,都會帶上各自域名下的 cookie,所以就有了第一方cookie(first-party cookie)和第三方cookie(third-party cookie)的區別。上面提到的 CSRF 攻擊,就是利用了第三方 cookie可以攜帶發送的特點 。
“同站cookie”不是根據同源策略判斷,而是PSL(公共后綴列表),子域名可以訪問父域名cookie,但父域名無法訪問子域名cookie。
SameSite總共有三個值:Strict、Lax、None
- Strict:最為嚴格,完全禁止第三方 Cookie,跨站點時,任何情況下都不會發送 Cookie。換言之,只有當前網頁的 URL 與請求目標一致,才會帶上 Cookie。這個規則過於嚴格,可能造成非常不好的用戶體驗。
- Lax:規則稍稍放寬,大多數情況也是不發送第三方 Cookie,但是導航到目標網址的 Get 請求除外。Chrome 80之后默認設置為該值。設置了Strict或Lax以后,基本就杜絕了CSRF攻擊。
- None:瀏覽器會在同站請求、跨站請求下繼續發送cookies,不區分大小寫。網站可以選擇顯式關閉 SameSite 屬性,將其設為 None ,同時必須設置 Secure 屬性(表示Cookie 只能通過 HTTPS 協議發送,HTTP協議不會發送),否則無效。
三、重復302解決辦法
目前解決方法有以下三種:
1. 瀏覽器顯式關閉該功能(由於需要每個用戶去設置,所以不推薦)
Chrome瀏覽器:a) 在Chrome地址欄中輸入:chrome://flags/#same-site-by-default-cookies 和 chrome://flags/#cookies-without-same-site-must-be-secureb) 將指定選項設置為Disabled 后,重啟瀏覽器
Safari瀏覽器:“偏好設置”-“隱私”,去掉「阻止跨站跟蹤」的勾選
2. 更改后端設置cookie的地方,設置響應header,關閉SameSite屬性
這里注意一點 Secure
屬性,這個屬性說明設置的該cookie只能在https下傳輸,因為SameSite=None 要求必須要和Secure=true一起使用,所以采用這個方法解決,嵌入iframe的頁面必須使用https。
Set-Cookie:
JSESSIONID=8479f54ed4104e21a91bc261591e7347; Path=/; HttpOnly; Secure; SameSite=None
3.更改iframe嵌入方式
廢棄采用cookie來做權限認證。改用token鑒權來實現。
四、需要注意事項
chrome瀏覽器在無痕模式下默認是阻止第三方cookie的
不過可以通過點擊右上角的閉着的小眼睛:
再點擊允許使用 Cookie,當前站點就又允許第三方 Cookie 了:
不過當你關閉無痕窗口后,這些設置都不會保留,下次打開依然會屏蔽第三方 Cookie。所以如果非要用無痕模式的話,就改瀏覽器關於cookie的設置,允許所有cookie。