chrome瀏覽器跨域Cookie的SameSite問題導致訪問iframe內嵌頁面異常

Indicate whether to send a cookie in a cross-site request by specifying its SameSite attribute

問題還原

原先一直訪問正常的系統,最近打開頁面一直加載不出來。

  1. 初步分析,該系統爲iframe內嵌第三方系統頁面,將iframe中的鏈接複製出來可以單獨訪問,排除第三方系統的問題。
  2. 進一步嘗試,將這個帶有鏈接的iframe放在一個全新的html文件中也不能正常訪問,排除當前系統的iframe加載問題。
  3. 發現問題,將剛剛新建的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 本地部署

解決方案

  1. Chrome瀏覽器打開新標籤頁,地址欄中分別輸入
chrome://flags/#same-site-by-default-cookies
chrome://flags/#cookies-without-same-site-must-be-secure

然後如上如圖所示將這兩個配置均設置爲Disabled

  1. 不使用谷歌瀏覽器或者將谷歌瀏覽器降級到 Chrome 79 及以下版本,並關閉自動更新。

  2. 將兩個系統部署在同一臺服務器,通過相同IP同源策略傳送cookie。

  3. 購買SSL證書,升級HTTP服務,將 API 切換爲 HTTPS 協議請求,並且檢查響應頭中的 Set-Cookie 中是否包含了 SameSite=None 和 Secure字樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章