2020年7月29日 星期三

使用 Chrome 無法在 http 的網站裡置放 cookie 的解決辦法

今天在使用 Chrome 測試網站時遇到了一個問題,該網站是採用 ASP.NET Core 的 Cookie 授權認證的方式驗證使用者,但明明使用者已經輸入帳號密碼且 API 也顯示登入成功,照裡來說使用者應該要能通過網站的驗證且 Cookies 裡會有相關的加密字串值才對,但怎麼找就是沒有,後來改透過安全連線(https)來嘗試,竟然就成功了!?這時才想到好像之前有看到一則新聞有關於 Google 針對 Cookies Policy 的更新,馬上上網查了一下是不是跟這有關,果不其然,較詳細的內容及解決方式我就直接列在下面了。


根據官方 Chrome 這兩則 Cookies default to SameSite=LaxReject insecure SameSite=None cookies 公告,若你的 Set-Cookie 裡的 SameSite 值為 None 或是 Lax(若是Get為例外)或是根本沒有 SameSite 屬性時,你的 Set-Cookie 裡必須還要含有 Secure 值才會讓此次要求(Request)裡的 Cookies 成功送出,以下為兩張比較圖

走 http 時 Set-Cookie 裡並不會加上 Secure
Image

走 https 時 Set-Cookie 裡會自動加上 Secure
Image



但以我是網站開發者的角度來說,這樣的規範其實有些時候會造成開發上的困擾,基本上我們並不會把每個測試網站都特別去申請一個 SSL 憑證來掛,因此這邊提供了一個較簡易的 Workaround 處理方式,如下

1. 在 Chrome 網址列輸入 chrome://flags 後確定

2. 輸入 CookiesCookies without SameSite must be secure 並搜尋
Image

3. 將 Cookies without SameSite must be secure 設定改為 Disabled Image

重要(2021.10.14 更新):

Chrome 在 91 版以後已將此 flag 移除(94 版後也不再支援使用引數方式),所以該 Workaround 也不適用了,詳細資訊可參考這裡




參考資料

[Google Chrome Help] How can I get around this cookies getting blocked during development

訪客統計

103131