自HTTP頁面轉跳至HTTPS頁面時,瀏覽器將停止傳送Cookies

同事回報一個很詭異的錯誤,當使用者透過A連結(HTTP)到網站並登入後(取得SessionID),網站內容有一個B連結(HTTPS;該連結同時也會驗證是否具備登入身分SessionID),未料到當使用者點選B連結後,後端程式碼抓不到SessionID導致網站提示使用者尚未登入?!

更恐怖的是這個B連結(HTTPS)因為需要使用者重新登入故賦予一組新的SessionID,導致A連結(HTTP)之SessionID被覆寫(也就是Cookies被覆寫),就等同於原先A連結的登入動作報銷了。

經過抽絲剝繭的檢查後發現,就是他媽的Chrome會自動把取消HTTP導向至HTTPS過程中要傳遞的Cookies,進而導致上述發生的莫名其妙結果。在此紀錄測試當下的Chrome(90.0.4430.93),而同時期的MS Edge with chromium(90.0.818.51),FireFox...則都可以順利的把HTTP產生的Cookies帶往HTTPS頁面下。果然是驗證了那句:「勇者屠龍後,勇者即是龍!」

Chrome 89版本的新變革:schemeful-same-site

知道了是Chrome搞的鬼後,就從90版本往前追開發紀錄,在第89版本馬上就追到了schemeful same-site這段落,裡面說明了:

http:// site.example and https:// site.example (note: a space was added between the scheme and the domain to prevent automatic link conversion) will now be considered cross-site to each other.

花惹發,也就是自Chrome 89版開始,同網域但不同通訊協定(協議)會被視為「cross-site」。我不敢相信這麼嚴重的決定竟然會這樣就給他Enabled by default上去了,若有某企業已經購入並且營運的Production(客戶端面向是普羅大眾)碰觸到這個地雷,而且並沒有持續維護的經費,那這個網站可以說是完全廢掉了!我當然知道這是基於CSRF安全考量,但...會影響到廣到使用群眾權益的事情,說明、提示、介面跟警告這些事情都可以無聲無息地略過嗎?

關閉的方法很簡單,只要輸入「chrome://flags/#schemeful-same-site」就可以把它Disabled掉。從下圖我們可以看出這個參數在安裝好後是被設定成預設值(Default)的,而Chrome 89的日誌表明default就是Enabled。

不更改schemeful-same-site flags的解法

基於你不可能叫普羅大眾都去修改自己的瀏覽器設定,經過測試,目前Chrome還是會把Cookies中設定SameSite是Lax等級的資訊往HTTPS拋送,所以如果你有HTTP送Cookies到HTTPS頁面的需求,可以考慮把Cookies自Strict降成Lax即可,但,這個做法我不知道哪時候Google會幫你再擅自做決定的改掉,只能說:且戰且走吧!

延伸參考:same-origin / cross-origin

same-origin考慮的是scheme、host name、port之間的比對檢查。

Url A Url B 結果
https://www.WTF.com:443 https://www.WTF2.com:443 cross-origin
https://www.WTF.com:443 https://WTF.com:443 cross-origin
https://www.WTF.com:443 https://web.WTF.com:443 cross-origin
https://www.WTF.com:443 http://www.WTF.com:443 cross-origin
https://www.WTF.com:443 https://www.WTF.com:80 cross-origin
https://www.WTF.com:443 https://www.WTF.com:443 same-origin
https://www.WTF.com:443 https://www.WTF.com same-origin (implicit)

延伸參考:same-site / cross-site

same-site考慮的是eTLD、eTLD+1之間的比對檢查。(Top-level domains;TLDs)

Url A Url B 結果
https://www.WTF.com:443 https://www.WTF2.com:443 cross-site
https://www.WTF.com:443 https://WTF.com:443 same-site
https://www.WTF.com:443 https://web.WTF.com:443 same-site
https://www.WTF.com:443 http://www.WTF.com:443 same-site
https://www.WTF.com:443 https://www.WTF.com:80 same-site
https://www.WTF.com:443 https://www.WTF.com:443 same-site
https://www.WTF.com:443 https://www.WTF.com same-site (implicit)

延伸參考:schemeful-same-site / cross-site

schemeful-same-site考慮的是scheme、eTLD+1之間的比對檢查。(要注意的是此處的eTLD+1的定義有所變動)

Url A Url B 結果
https://www.WTF.com:443 https://www.WTF2.com:443 cross-site
https://www.WTF.com:443 https://WTF.com:443 schemeful-same-site
https://www.WTF.com:443 https://web.WTF.com:443 schemeful-same-site
https://www.WTF.com:443 http://www.WTF.com:443 cross-site (*Chrome 89)
https://www.WTF.com:443 https://www.WTF.com:80 schemeful-same-site
https://www.WTF.com:443 https://www.WTF.com:443 schemeful-same-site
https://www.WTF.com:443 https://www.WTF.com schemeful-same-site (implicit)

從上面的延伸參考我們可以知道,這種東西隨時在異動,哪時候會被拋棄或是生出新的政策沒人知道,真心的覺得瀏覽器走到此刻已經是個失控的發展,唉~也只能接受了!

參考文章:记一次Chrome更新带来的登录Cookie问题

Chrome Chromium Cookies HTTP HTTPS Won'tSend SameSite SchemefulSameSite