Indicate whether to send a cookie in a cross-site request by specifying its SameSite attribute
問題還原
原先一直訪問正常的系統,最近打開頁面一直加載不出來。
- 初步分析,該系統爲iframe內嵌第三方系統頁面,將iframe中的鏈接複製出來可以單獨訪問,排除第三方系統的問題。
- 進一步嘗試,將這個帶有鏈接的iframe放在一個全新的html文件中也不能正常訪問,排除當前系統的iframe加載問題。
- 發現問題,將剛剛新建的html文件再火狐瀏覽器中打開可以正常訪問。 最後定位是瀏覽器兼容性問題,當前瀏覽器:Google Chrome ,版本85.0.4183.102(正式版本) (64 位)。
打開瀏覽器控制檯發現接口請求報500錯,控制檯出現以下提示(Indicate whether a cookie is intended to be set in a cross-site context by specifying its SameSite attribute):
原因分析
Google 在2020年2月4號發佈的 Chrome 80 版本(schedule:https://www.chromestatus.com/features/schedule)中默認屏蔽所有第三方 Cookie,即默認爲所有 Cookie 加上 SameSite=Lax 屬性(https://www.chromestatus.com/feature/5088147346030592),並且拒絕非Secure的Cookie設爲 SameSite=None(https://www.chromestatus.com/feature/5633521622188032)
SameSite的作用就是防止跨域傳送cookie,從而防止 CSRF 攻擊和用戶追蹤,此舉是爲了從源頭屏蔽 CSRF 漏洞。
關於 SameSite 屬性的介紹,可參考阮一峯的《Cookie 的 SameSite 屬性》。
上述問題中,在當前系統訪問第三方系統時,帶了一些cookie過去,然後被這個SameSite機制攔截掉了。
可能在 Chrome 80 中受到影響的場景如下
組件數據基於第三方網站的登錄態返回相關用戶數據的API請求
HTTP 本地部署
解決方案
- Chrome瀏覽器打開新標籤頁,地址欄中分別輸入
chrome://flags/#same-site-by-default-cookies
chrome://flags/#cookies-without-same-site-must-be-secure
然後如上如圖所示將這兩個配置均設置爲Disabled
-
不使用谷歌瀏覽器或者將谷歌瀏覽器降級到 Chrome 79 及以下版本,並關閉自動更新。
-
將兩個系統部署在同一臺服務器,通過相同IP同源策略傳送cookie。
-
購買SSL證書,升級HTTP服務,將 API 切換爲 HTTPS 協議請求,並且檢查響應頭中的 Set-Cookie 中是否包含了 SameSite=None 和 Secure字樣。