本文首發於我的博客 YILS's Blog,首發地址:第三方Cookie失效時的新解決方案 (yils.blog)
第三方 Cookie 一直是網絡的重要組成部分,這已持續了 25 年。
然而隨着瀏覽器對隱私保護的加強,為了防止跨站跟蹤,第三方 Cookie 的使用變得越來越受限。即使你已經正確設置了 SameSite=None; Secure;,仍然可能會遇到 Set-Cookie 失效的問題。這通常是因為最新版本瀏覽器新的隱私設置或其他安全策略導致的。
為什麼仍舊需要第三方cookie?
先考慮這個問題,你是不是真的需要使用它。
你可能遇到了以下情況:
- 使用單點登錄(SSO)
- 第三方前端 SDK 需要使用 Cookie 來存儲用户標識
- iframe嵌入:通用的聊天、地圖、文檔等通過三方 Cookie 來共享狀態,完成自動登錄
- CDN 緩存:一些 CDN 服務商使用 Cookie 來緩存用户特定的內容
- 嵌入式第三方付款服務
- 第三方靜態資源加載
- 跨站 API 調用
- …
這些場景中,第三方 Cookie 仍然是不可或缺的。
新隱私策略限制下的解決方案
1. 使用具有獨立分區狀態 (CHIPS) 的 Cookie
這是 Chrome 的一個新特性,旨在允許第三方 Cookie 在跨站點上下文中使用,同時仍然提供隱私保護。
值得注意的是,從 Safari 18.4 版本(2025年3月31日發佈)開始也全面支持 CHIPS。
而 Firefox 宣佈,他們會在 ETP 嚴格模式和無痕瀏覽模式下默認對所有第三方 Cookie 進行分區,因此所有跨站 Cookie 都會按頂級網站進行分區。
CHIPS 雖然允許了網站在跨站上下文中使用 Cookie,但這些 Cookie 只能在特定的分區中訪問。
要啓用 CHIPS,你只需在服務器端設置 Partitioned 屬性:
Set-Cookie: __Host-name=value; Path=/; SameSite=None; Secure; Partitioned;
這將使 Cookie 在跨站點上下文中可用,雖然會受到分區的限制,但非常適用被動顯示的嵌入服務、自動登錄、文檔權限控制、CDN 緩存等場景。
2. 使用 Storage Access API 請求用户授權存儲 Cookie
Storage Access API 允許網站主動請求訪問其在第三方上下文中的存儲(包括 Cookie)。這對於需要在 iframe 中使用 Cookie 的場景非常有用。
要使用 Storage Access API,你可以在 iframe 嵌入的網頁中調用 document.requestStorageAccess() 方法:
if (document.requestStorageAccess) {
document
.requestStorageAccess()
.then(() => {
// 成功獲取存儲訪問權限
console.log("Storage access granted");
})
.catch(error => {
// 用户拒絕或發生錯誤
console.error("Storage access denied:", error);
});
} else {
console.warn("Storage Access API is not supported in this browser");
}
Storage Access API 目前已獲得主流現代瀏覽器的廣泛支持,包括 Safari、Firefox、Chrome、Edge 以及基於 Chromium 的其他瀏覽器。
注意,用户必須明確同意才能授予存儲訪問權限,因此這可能會影響用户體驗。
這種方式適用於某些第三方嵌入內容需要訪問未分區的 Cookie 或存儲空間,才能為用户提供更好的體驗情況。
例如,需要登錄會話詳細信息的嵌入式評論插件,嵌入式付款系統或視頻網站等服務。
Storage Access API 規範 提供了更多詳細信息。
3. RWS 與 FedCM
RWS(Related Website Set)是一種網絡平台機制,允許網站聲明它們之間的關係,從而使瀏覽器能夠更好地管理跨站點 Cookie 的使用,並向用户顯示這些信息。
而 FedCM(Federated Credential Management)則是一種聯合身份認證服務方法,不依賴於第三方 Cookie 或導航重定向。
這兩種技術都由谷歌提出,但是目前遭到其他兩家瀏覽器廠商反對或未實現,而且已經超脱Cookie的範疇,所以這裏不做詳細介紹。
相關信息可以在這裏查看:Related Website Sets 提案、Federated Credential Management 提案