每個 Cookie 都包含一個鍵/值組合,以及一些 控制 Cookie 的使用時間和位置
引進 SameSite
屬性 (定義請見
RFC6265bis)。
可讓您宣告 Cookie 是否僅限第一方
相同的網站內容。最好能清楚瞭解什麼是「網站」代表。
網站結合了網域字尾和網域部分
。例如,www.web.dev
網域是 web.dev
網站的一部分。
重要字詞:如果使用者位於 www.web.dev
,並要求取得圖片
static.web.dev
,回應為相同網站的要求。
公開後置字元清單定義了計為何種網頁
在同一個網站上不單純仰賴頂層網域 (例如 .com
),
但也可能包含 github.io
等服務這樣一來,
your-project.github.io
和 my-project.github.io
:將系統視為個別網站。
重要字詞:如果使用者位於 your-project.github.io
,並要求取得圖片
my-project.github.io
,這是跨網站的請求。
使用 SameSite
屬性宣告 Cookie 的用途
Cookie 上的 SameSite
屬性提供三種不同的控制方式
也就是行為您可以選擇不指定屬性,也可以使用
Strict
或 Lax
:將 Cookie 限制為相同網站要求。
如果將 SameSite
設為 Strict
,Cookie 就只能在
第一方情境;也就是說,如果 Cookie 的網站與顯示的網站相符
。因此,如果 promo_shown
Cookie 的設定如下:
Set-Cookie: promo_shown=1; SameSite=Strict
當使用者造訪您的網站時,系統會如常傳送 Cookie 與請求。
不過,如果使用者透過其他連結連至你的網站,Cookie 就會是 Cookie
不會在初始要求中傳送
如果 Cookie 必須與初始功能相關
例如變更密碼或購物等等
限制使用 (例如 promo_shown
)。如果讀者追蹤連結
導入網站時,他們希望系統能傳送 Cookie,以便套用自己的偏好設定。
SameSite=Lax
可讓瀏覽器傳送包含這些頂層的 Cookie
導覽。舉例來說,如果其他網站參照了您的網站內容,則
做法是使用您的貓咪相片,並將文章連結
如下:
<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>
請將 Cookie 設為 Lax
,如下所示:
Set-Cookie: promo_shown=1; SameSite=Lax
當瀏覽器要求將 amazing-cat.png
設為他人的網誌時,您的
網站未傳送 Cookie但是,如果讀者按照
連結到您網站上的 cat.html
,但該要求確實包含 Cookie。
建議您以這種方式使用 SameSite
,藉由設定會影響網站的 Cookie
向 Lax
顯示,以及與 Strict
使用者動作相關的 Cookie。
您也可以將 SameSite
設為 None
,表示希望使用 Cookie
會在所有情況下傳送如果您提供其他網站使用的服務,例如
小工具、嵌入內容、聯盟計畫、廣告
有多個網站,請使用 None
確保意圖清楚易懂。
變更不使用 SameSite 時的預設行為
瀏覽器支援
SameSite
屬性受到廣泛支援,但目前尚未廣泛採用。
過去,如果在不含 SameSite
的情況下設定 Cookie,系統將根據預設,將 Cookie 傳送至
導致使用者容易受到 CSRF 攻擊和無意間使用
資訊外洩鼓勵開發人員說明自己的意圖
進而為使用者提供更安全的體驗、IETF 提案
Cookie 成效提升
列出兩項主要變更:
- 不含
SameSite
屬性的 Cookie 會視為SameSite=Lax
。 - 使用
SameSite=None
的 Cookie 也必須指定Secure
,表示需要 而非安全內容
以下兩項變更皆可與使用以下功能的瀏覽器回溯相容:
導入了舊版 SameSite
屬性,以及
不支援舊版 SameSite
的瀏覽器。這個 API 能用來
減少開發人員仰賴瀏覽器取得 Cookie 的預設行為
或明確預期的用途任何無法辨識的用戶端
SameSite=None
應忽略此訊息。
預設使用SameSite=Lax
如果您傳送 Cookie 時未指定 SameSite
屬性,瀏覽器
系統會將該 Cookie 視為設為 SameSite=Lax
。我們仍建議
明確設定 SameSite=Lax
以提供更一致的使用者體驗
。
必須確保「SameSite=None
」安全無虞
使用 SameSite=None
建立跨網站 Cookie 時,也必須一併設定 Cookie
傳送至 Secure
,以便瀏覽器接受:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
如要測試自 Chrome 76 起的這項行為,請啟用
about://flags/#cookies-without-same-site-must-be-secure
和 Firefox 69
將「network.cookie.sameSite.noneRequiresSecure
」設為
about:config
。
此外,我們也建議您盡快將現有的 Cookie 更新為 Secure
。
如果你仰賴的服務在網站上提供第三方內容,請務必確認
您的服務供應商更新他們的 Cookie,並更新任何程式碼片段或
務必要依賴新行為。
SameSite
餅乾食譜
如需更新 Cookie 才能順利處理問題的詳細資訊
變更 SameSite=None
以及瀏覽器行為的差異,請參閱
後續文章:「SameSite Cookie 食譜」。
感謝 Lily Chen、Malte Ubl 和 Mike 的貢獻和意見回饋 West、Rob Dodson、Tom Steiner 和 Vivek Sekhar。