發生了什麼?#
在最近發布的 Chrome 113、114 兩個版本中,有兩個關於 Cookie 的變化:
Chrome 113:Cookie 第一方集(First-Party Sets)進入穩定版本;
Chrome 114:Cookie 獨立分區(CHIPS)默認對所有瀏覽器啟用;
這兩個都是針對 Cookie 訪問方式的變化,為的就是應對即將來臨的三方 Cookie 全面棄用。Chrome 在兩年前就已經計劃全面棄用方 Cookie 了,因為這個變化對現在的網站影響太大了,如果直接棄用,可能會導致大量網站的正常功能無法正常使用。
Chrome 計劃在 2024 年 Q3 徹底禁用第三方 Cookie。
以下內容引自 Google 開發者網站隱私沙箱文章。
棄用了 1% 的第三方 Cookie 以及 Chrome 協助測試#
在 privacysandbox.com 時間表上,您可以看到 2023 年第 4 季度和 2024 年第 1 季度的兩個里程碑,這是 Chrome 協助測試模式的一部分。此測試主要面向測試 Privacy Sandbox 相關性和效果衡量 API 的組織,但在此過程中,我們已為 1% 的 Chrome 穩定版用戶停用第三方 Cookie。
棄用第三方 Cookie 的時間表。作為 Chrome 協助測試的一部分,“使用標籤模式選擇啟用測試” 從 2023 年第 4 季度開始,並於 2024 年 1 月 4 日開始針對 1% 的 3PC 限制。兩者都會持續到 2024 年第 3 季度中期,屆時第三方 Cookie 逐步淘汰開始。
這意味著,從 2024 年初開始,即使您未積極參與 Chrome 協助測試,在停用第三方 Cookie 的情況下,也會有更多 Chrome 用戶訪問您的網站。該測試期將持續到 2024 年第 3 季度。在與 CMA 協商後,為了解決與競爭相關的顧慮,我們計劃開始為所有 Chrome 用戶停用第三方 Cookie。
說了這麼多,什麼是第三方 Cookie?#
在跨網站上下文(例如 iframe 或子資源請求)中發送的 Cookie 通常稱為第三方 Cookie。
這個變動會有什麼影響?#
2019 年,瀏覽器改變了 Cookie 行為,將 Cookie 默認限制為僅限第一方訪問。目前在跨網站上下文中使用的任何 Cookie 都必須使用 SameSite=None 屬性進行設置。但在禁用第三方 cookie 後,即使設置了 SameSite=None,該 cookie 也不能被第三方讀取。
比如我們現在正在抖音上刷視頻,但是抖音上往往會加載很多三方廣告商的請求,這些三方廣告商就可以通過三方 Cookie 來記錄一些用戶的行為。然後下次你逛淘寶的時候,也可能再次加載到這個廣告商,因為這時三方廣告已經通過三方 Cookie 記錄了你的很多用戶行為,已經知道了你喜歡什麼東西,所以你就會收到一些精準的廣告推送,無形之中你的隱私已經泄漏出去了。
在海外,用戶隱私可是相當 ZZ 正確的事,所以 Safira、Firefox 兩大瀏覽器已經迫於壓力禁用了三方 Cookie,也就是說,如果你在這兩個瀏覽器上去訪問 www.douyin.com 這個網站,那麼再發送 bytedance.com 這個域名的請求是種不上 Cookie 的。
如果禁用了三方 Cookie ,那這種正常的在一家公司不同域名下共享 Cookie 的能力也就不能用了,這給正常的業務需求會帶來很大的影響,一個常見的場景就是單點登錄,我們往往在登錄一家公司的不同網站的時候只需要登錄一次,這是因為用戶的個人信息存儲在了一個公共的登錄服務的 Cookie 上,禁用了三方 Cookie,那登錄信息也就無法共享了。下面我們來看看如何解決以上的兩個問題。
解決問題的設想#
Google 為此提供了四種解決辦法:
我們今天以我的 bilibili 論壇高清嵌入為例子,使用第一種方法。其餘方法可以看 https://developers.google.com/privacy-sandbox/3pcd?hl=zh-cn 。
由於這已經是一個用插件解決的問題了,因為我沒有 bilibili 的控制權限(廢話),所以在接下來的情況,若想要讀取第三方 cookie,你至少需要有控制你所需第三方網站 cookie 的能力(包括自己寫個插件,但顯然不能用於大部分必須使用到第三方 cookie 情況),或者是能聯繫他們為你修改 cookie 屬性的能力。
我的插件代碼之前是這麼寫的:
let newCookie = {
url: `https://bilibili.com`,
name: cookie.name,
value: cookie.value,
domain: 'bilibili.com',
path: cookie.path,
secure: true,
httpOnly: cookie.httpOnly,
sameSite: "no_restriction",
expirationDate: cookie.expirationDate
};
這段代碼,在目前的情況下仍然可用,因為我設置修改了這些 cookie 的 samesite 值為 None, 這裡是效果:
但是!!!
如果禁用了第三方 Cookie, 這個屬性就讀不到數據了。測試方法也在 Chrome 的文章裡提供了:
為支持在 Chrome 中棄用第三方 Cookie 的 1% 測試和磨合階段中的測試場景,我們提供了多個 Chrome 標誌。
在 Chrome 121 及更高版本中,您可以模擬逐步淘汰第三方 Cookie 後的狀態:
- 啟用
chrome://flags/#test-third-party-cookie-phaseout
- 使用標記
--test-third-party-cookie-phaseout
通過命令行運行 Chrome
這會將 Chrome 設置為屏蔽第三方 Cookie,並確保新功能和緩解措施均有效。
設置後:
在 i1.yuereqb.cn 這個界面讀不到 cookie 了,但在暮光方塊論壇嵌入這個域名又能讀到,考慮到是不是現在瀏覽器忘記考慮這個情況了。
目前給的方法是,想要在當前網站上保留需要共享的三方 Cookie ,只需要在種這個 Cookie 的時候添加一個 Partitioned
屬性,另外還有個前提是 Cookie 必須具有 Secure
屬性:
Set-Cookie: name=name; SameSite=None; Secure; Path=/; Partitioned;
目前,Chrome 擴展還不能設置Partitioned
這個屬性,會報錯。
Partitioned
的讀取模式,是每個站點單獨讀取,Google 畫了一個示意圖來描述:
上圖描繪的是現狀,沒有 partitioned 的 cookie 讀取模式。
上圖描繪啟用 Cookie 分區功能後,如果某項第三方服務嵌入一個頂級網站時會設置 Cookie,而該服務嵌入到其他頂級網站中時便無法訪問同一 Cookie。
上圖描繪啟用 Cookie 分區功能後,如果某項第三方服務在嵌入網站時設置了 Cookie,那麼即使用戶以頂級網站的身份訪問該服務,該服務也無法訪問同一 Cookie。
所以,目前的情況就是,擴展只能先這樣,必須等 Chrome 日後的更新,看擴展有沒有權限操作這個,若沒有,以後這個項目就只能歇菜了。
對其他服務的建議#
最好以後非必要不使用第三方 cookie,畢竟 cookie 只是傳遞的一種方式,以後盡量使用別的方式,若必須讀取 cookie,就需要考慮這個 cookie 是否需要被第三方讀取,然後再考慮這些第三方網站的情況了。
現在只能祈禱未來的路沒有那麼難走了...
先寫到這裡,待後更新!