Cookie SameSite 之亂

ZiZi Zheng
萬達寵物系統發展部
3 min readFeb 13, 2020

跨平台之系統版本差異帶著不同的瀏覽器大軍直取網站而來

起源

前陣子 Chrome 宣布將在 version 80 對 Cookie 的屬性 SameSite 做檢查,若 SameSite 沒有做設定,將會自動被改成 Lax。關於設置為 Lax 的被影響到的 Request 方式請參考此篇

做出對應調整

團隊注意到這件事後,先確保 SameSite 都有被賦予值,但由於第三方登入等等仍然必須傳遞第三方 Cookie,由上述文章得知 SameSite=None + Secure 屬性可以讓第三方 Cookie 運行正常,但前提要在 SSL 環境下。後端對此做了對應的修改。但此修改上線後,我們開始接收到少數用戶無法登入的狀況,經過查明之後發現,又是你! iOS !

iOS ver.12 Bug

我們先針對不同裝置進行了測試,最後發現這個現象發生在 iphone 6 上 (iphone 6s 沒有這個問題)。此篇解釋 iOS 版本 12 會將 SameSite=None 皆視為 SameSite=Strict,所以 Domain 不同全部都不會送 Cookie,只要有導向第三方的功能就會完全 GG。

oh my

好家在 Chromium Projects 提供了檢驗 ua 的 pseudo code,能夠依照瀏覽器或是裝置版本決定要不要設置 SameSite=None,當然後端實作也必須將 Secure 屬性加上去確保運行正常。經過這個修改後,Cookie 屬性設置會變為:

  1. iOS 12 以及其他不合規範的系統版本會將 SameSite 設為空值
  2. 合法的裝置則設置 SameSite=None 並加上 Secure 屬性,確保第三方 Cookie 執行正常& 未來不會被 Chrome 改為 SameSite=Lax

請注意從 Can I Use 可以得知 iOS 11 以下是不支援 SameSite 屬性的,所以最保險的做法就是不要設定這個屬性

後記

其實要幫 iOS 平反一下,Chrome 也有一些版本是會直接將 SameSite=None 的 Cookie Reject 掉的,但問題就出於 iPhone 6 之前的手機最多只能更新到 iOS 12 而且 Safari 版本跟著系統版本變動啦!所以 iPhone6 以上的使用者其實可以請他們更新系統版本就能解決了,這邊也提供 App Store iOS 版本統計給有需要的開發者;而 Android 就更簡單,更新瀏覽器版本一切搞定。

當然如果公司政策允許,也可以贊助使用者 500 請他們換新手機唷 🤗

--

--