Chrome 80 之後的版本,預設的 Cookie 設定將會無法跨站存取 Cookie 值,若想要允許 Cookie 跨網站存取的話(SameSite = None),需要使用 HTTPS 才可以。
- 註:SameSite 用來阻止瀏覽器將 Cookies 跨網站發送 (prevents the browser from sending this cookie along with cross-site requests)
 
PHP Cookie SameSite 的設定方式
Chrome 80 之後的 Cookie SameSite 設定有三種(預設改為 Lax):
- Strict
 - Lax (default)
 - None (需有 HTTPS 搭配,否則一樣等同 Lax)
 
Cookie SameSite 官方文件
- SameSite cookies explained - 此篇建議必看
 - SameSite cookie recipes - 此篇建議必看
 - Cookies default to SameSite=Lax - Chrome Platform Status
 - SameSite Updates - The Chromium Projects
 - RFC-6265 Cookies with SameSite=None must also specify Secure, meaning they require a secure context.
 
Cookie SameSite 跨網域存取
- SameSite=Strict:最嚴謹,只有與目前網頁網址一致才能發送 (remote.example、site.example 互相無法發送)
- Set-Cookie: CookieName=CookieValue; SameSite=Strict;
 
 - SameSite=Lax:使用 GET remote.example 向 site.example 發送,Cookie 將會送向 remote.example (POST 則不會發送 Cookie)
- Set-Cookie: CookieName=CookieValue; SameSite=Lax;
 
 - SameSite=None + HTTPS:允許跨網域存取,但是若沒 HTTPS 則預設「拒絕」跨網域存取
- 無效:Set-Cookie: remote_session=abc123; SameSite=None
 - 有效:Set-Cookie: remote_session=abc123; SameSite=None; Secure
 
 
而 SameSite 的設定,於 PHP 7.2 以前尚未支援,所以 PHP 7.2 以前和 PHP 7.3 寫法不同:
PHP 7.2 以前的 SameStie Cookie 寫法
- header('Set-Cookie: cross-site-cookie=name; SameSite=None; Secure');
 
PHP 7.3 以後的 SameStie Cookie 寫法
- setcookie('cross-site-cookie', 'name', ['samesite' => 'None', 'secure' => true]);
 
相關網頁
- Chrome 80 後針對第三方 Cookie 的規則調整 (default SameSite=Lax) - 此篇說明很清楚
 - Chrome 80將採用新的Cookie安全模型預設無法跨站存取Cookie
 - Google Chrome SaveSite Cookie原則
 - Chrome 80 SameSite Cookie 的影響
 - What’s up with SameSite Cookies Policy ?!
 - 什麼!? SameSite Cookies Policy 更新了— Chrome SameSite Attribute 簡介
 - php - How to fix "set SameSite cookie to none" warning? Chrome Extension
 - 如何修復將 SameSite cookie 設置圍 None 的警告