Indicate whether to send a cookie in a cross-site request by specifying its SameSite attributehtml
問題還原
原先一直訪問正常的系統,最近打開頁面一直加載不出來。chrome
- 初步分析,該系統爲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。cookie
-
購買SSL證書,升級HTTP服務,將 API 切換爲 HTTPS 協議請求,而且檢查響應頭中的 Set-Cookie 中是否包含了 SameSite=None 和 Secure字樣。網站