從未分區改用分區 Cookie

將網站轉換為分割 Cookie 時,如果任何用戶端同時出現同名的分割 Cookie 和未分割 Cookie,可能會發生非預期行為。

設定分區 Cookie 不會覆寫或取代名稱相同的現有未分區 Cookie。只要第三方 Cookie 已啟用,這兩個 Cookie 都會存在,但使用不同的 Cookie jar 檔案。當第三方 Cookie 停用時,系統只會接受分區 Cookie。如果這兩種 Cookie 都存在,就無法以程式輔助方式判斷哪個已分區,以及哪一個則否,這可能會導致非預期的行為。

解決方法有兩種: 1. 讓要取代的 Cookie 到期 2. 重新命名 Cookie

重要考量事項

改用分區 Cookie 時,請注意以下幾點:

  1. 無法透過程式設計判斷 HTTP 要求中傳送的 Cookie 是否已分割。不過,您可以在 Chrome 開發人員工具中判斷 Cookie 的分割狀態。您可以使用 CookieStore API,區分沒有 HttpOnly 屬性的分區 Cookie 和未分區 Cookie。
  2. 分割 Cookie 不會覆寫未分割的 Cookie。如果兩個 Cookie 完全相同 (也就是具有相同的屬性,例如名稱、網域或路徑),但只有一個 Cookie 具有 Partitioned 屬性,系統會將兩個 Cookie 視為不同的 Cookie。
  3. 最好避免在同一個網路呼叫中,同時傳回分割 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。舉例來說,您可能同時有 authauth-partitioned Cookie,其中後者是使用 Partitioned 屬性設定的。

每次更新這個值時,建議您嘗試設定這兩個 Cookie。

  • 如果用戶端封鎖了第三方 Cookie,但尚不支援 CHIPS,則系統不會接受這兩種 Cookie。
  • 在封鎖第三方 Cookie 並支援 CHIPS 的用戶端上:系統會拒絕 auth Cookie,但可接受 auth-partitioned Cookie。
  • 在未封鎖第三方 Cookie 的用戶端上 (無論其是否支援 CHIPS):接受 authauth-partitioned

當應用程式需要讀取驗證 Cookie 時,您應該先尋找 auth-partitioned;但如果您需要暫時復原變更,您可以重新尋找 auth Cookie。

當您確定大多數使用者已將 Cookie 重新整理後,auth-partitioned Cookie 可能會淘汰,並且您可將分區屬性加入一般驗證 Cookie。