將網站轉換為分割 Cookie 時,如果任何用戶端同時出現同名的分割 Cookie 和未分割 Cookie,可能會發生非預期行為。
設定分區 Cookie 不會覆寫或取代名稱相同的現有未分區 Cookie。只要第三方 Cookie 已啟用,這兩個 Cookie 都會存在,但使用不同的 Cookie jar 檔案。當第三方 Cookie 停用時,系統只會接受分區 Cookie。如果這兩種 Cookie 都存在,就無法以程式輔助方式判斷哪個已分區,以及哪一個則否,這可能會導致非預期的行為。
解決方法有兩種: 1. 讓要取代的 Cookie 到期 2. 重新命名 Cookie
重要考量事項
改用分區 Cookie 時,請注意以下幾點:
- 無法透過程式設計判斷 HTTP 要求中傳送的 Cookie 是否已分割。不過,您可以在 Chrome 開發人員工具中判斷 Cookie 的分割狀態。您可以使用 CookieStore API,區分沒有
HttpOnly
屬性的分區 Cookie 和未分區 Cookie。 - 分割 Cookie 不會覆寫未分割的 Cookie。如果兩個 Cookie 完全相同 (也就是具有相同的屬性,例如名稱、網域或路徑),但只有一個 Cookie 具有
Partitioned
屬性,系統會將兩個 Cookie 視為不同的 Cookie。 - 最好避免在同一個網路呼叫中,同時傳回分割 Cookie 和同名的未分割 Cookie。
讓要取代的 Cookie 到期
如果您的網站或服務無法因應名稱變更,您可以在現有的未分區 Cookie 過期時建立新的分區 Cookie。雖然無法判斷 Cookie 是否已分割,但具有 Partitioned
屬性的 Set-Cookie
標頭不會影響未分割的 Cookie。
以下範例說明如何讓未分區 (名為 example
) 的 Cookie 過期,讓任何分區 Cookie 不受影響 (即使名稱相同)。如果已存在名為 cookieName
的新分割 Cookie,系統會新增或更新該 Cookie。
Set-Cookie: example=-1;HttpOnly;SameSite=None;Secure;Max-Age:0
Set-Cookie: cookieName=value;Secure;SameSite=None;MaxAge=34560000;Partitioned
重新命名 Cookie
如要確保可以順利進行轉換,最可靠的方式就是針對分區與未分區的 Cookie 使用不同的名稱。舉例來說,如果您有名為「example」的未分區 Cookie,可將其遷移至分區 Cookie。
Set-Cookie: example-partitioned=value;Secure;SameSite=None;MaxAge=34560000;Partitioned
由於 Cookie 的到期時間並未以程式設計方式公開,因此無法將新 Cookie 的到期時間設定為與未分割 Cookie 的到期時間一致。在這個過程中,您可以輕易重新整理 Cookie 的值。
同時維護分區和非分區 Cookie
在轉換期間,建議您維持兩個個別同步處理的 Cookie:一個是已分割的 Cookie,另一個則是未分割的 Cookie。舉例來說,您可能同時有 auth
和 auth-partitioned
Cookie,其中後者是使用 Partitioned
屬性設定的。
每次更新這個值時,建議您嘗試設定這兩個 Cookie。
- 如果用戶端封鎖了第三方 Cookie,但尚不支援 CHIPS,則系統不會接受這兩種 Cookie。
- 在封鎖第三方 Cookie 並支援 CHIPS 的用戶端上:系統會拒絕
auth
Cookie,但可接受auth-partitioned
Cookie。 - 在未封鎖第三方 Cookie 的用戶端上 (無論其是否支援 CHIPS):接受
auth
和auth-partitioned
。
當應用程式需要讀取驗證 Cookie 時,您應該先尋找 auth-partitioned
;但如果您需要暫時復原變更,您可以重新尋找 auth
Cookie。
當您確定大多數使用者已將 Cookie 重新整理後,auth-partitioned
Cookie 可能會淘汰,並且您可將分區屬性加入一般驗證 Cookie。