Chrome瀏覽器版本升級帶來的跨域訪問問題

一、背景

最近在公司研發羣,發現有人反饋內部網站跨域訪問莫明的出現站點重定向問題,而且都是谷歌80 版本以後出現。 javascript

準確的說是78版本以後,而且可能存在同一版本不一樣人的瀏覽器表現不一樣,做者本人也升級了谷歌版本爲最新,沒有發現這個問題。換句話說這TM就是一樁冤案。做爲一個苦逼的研發,冤案不是第一次 見,仍是要解決的。

二、探索

重定向的緣由無非就是沒有cookie,致使沒有登陸態。沿着這個思路咱們展開了一系列的探索。java

2.1 探索1,谷歌設置,容許第三方Cookie

結果:失敗,沒有解決問題 git

2.2 探索2,瀏覽器改變SameSite設置

  • 谷歌瀏覽器地址欄輸入:chrome://flags/
  • 找到:SameSite by default cookies、Cookies without SameSite must be secure
  • 設置上面這兩項設置成 Disable

結果:成功解決,可是,這個方案有點侷限,若是全部人都遇到這個問題,你還須要給每個人都去說一遍,你須要打開chrome://flags/ ,設置SameSite,天,太麻煩了。出口堵住太麻煩了,固然這也是一種臨時方案,因此咱們仍是要像一個簡單點的方案,就是歷來源去解決。 github

2.3 探索3,set-cookie改變SameSite設置

網站跨域訪問莫明的出現站點重定向,源頭在哪,就是在統一登陸的地方,若是咱們在統一登陸的地方設置了SameSite,哪是否是就在全部用到當前登陸態的地方就解決了這個問題。怎麼操做了。 操做很簡單,其實就是在報文裏面set-cookie,添加SameSite=None; Secure chrome

結果:完美解決,一勞永逸。不要給全部人解釋你須要怎麼怎麼作了。 api

三、緣由

最後我回過來思考一下爲何會出現這樣的緣由了。你們發如今探索的過程當中,基本都是改變了SameSite的設置,才成功解決的。 Cookie 的SameSite屬性用來限制第三方 Cookie,從而減小安全風險。它能夠設置三個值:跨域

  • Strict

Strict最爲嚴格,徹底禁止第三方 Cookie,跨站點時,任何狀況下都不會發送 Cookie。換言之,只有當前網頁的 URL 與請求目標一致,纔會帶上 Cookie。瀏覽器

Set-Cookie: CookieName=CookieValue; SameSite=Strict;
複製代碼

這個規則過於嚴格,可能形成很是很差的用戶體驗。好比,當前網頁有一個 GitHub 連接,用戶點擊跳轉就不會帶有 GitHub 的 Cookie,跳轉過去老是未登錄狀態。安全

  • Lax

Lax規則稍稍放寬,大多數狀況也是不發送第三方 Cookie,可是導航到目標網址的 Get 請求除外。bash

Set-Cookie: CookieName=CookieValue; SameSite=Lax;
複製代碼

設置了Strict或Lax之後,基本就杜絕了 CSRF 攻擊。固然,前提是用戶瀏覽器支持 SameSite 屬性。

  • None

網站能夠選擇顯式關閉SameSite屬性,將其設爲None。不過,前提是必須同時設置Secure屬性(Cookie 只能經過 HTTPS 協議發送),不然無效。

Set-Cookie: widget_session=abc123; SameSite=None; Secure
複製代碼

chrome升級到80版本以後(準確的說是78版本以後),cookie的SameSite屬性默認值由None變爲Lax,這個纔是本次事件的根本緣由。

這個問題在社區也是有討論的,討論地址:github.com/google/goog…

相關文章
相關標籤/搜索