繁體中文(香港)
  • cookie
  • nextjs
  • serverless

如何通過拆分 cookie 來解決 cookie 大小超過錯誤

對於 cookie 大小超過錯誤的解決方案:將 cookie 拆分為多個較小的 cookie,並在伺服器端重組它們。該解決方案特別適用於無伺服器平台,無需額外的基礎設施。

Sijie
Sijie
Developer

摘要:當你的 cookie 大小超過 4KB 的瀏覽器限制時,將其拆分為多個較小的 cookie,並在伺服器端重組它們。這個解決方案特別適用於無伺服器平台,無需額外的基礎設施。

在大多數用於傳統 web 應用的 Logto SDK 中,我們將會話數據存儲在 HTTP-only cookie 中以確保安全。以下是我們的方法:

當 SDK 執行需要會話數據的操作時,它會:

  • 使用對稱加密對其進行加密
  • 將加密的字串存儲在 HTTP-only cookie 中
  • 設置安全標誌以確保僅限 HTTPS 傳輸

此方法不需要外部存儲,並且可以直接部署到像 Vercel 這樣的流行無伺服器平台上,而不需要任何額外的基礎設施更改。

問題:cookie 大小超過錯誤

然而,在實施多組織支持時,我們遇到了限制。我們的 cookie 大小超過了 4KB 的瀏覽器限制,因為我們需要存儲:

  • 登入和其他會話數據
  • 用於用戶驗證的 ID 令牌
  • 刷新令牌
  • 各種資源指標的訪問令牌
  • 組織令牌,這是帶有負載的 JWT,每個組織一個,當多個組織同時存活時,可能會非常大

這導致了錯誤:

瀏覽器強制執行嚴格的 cookie 大小限制,大多數限制個別 cookie 為 4KB 和每個域總 cookie 大小為 8KB。

使用外部存儲怎麼樣?

使用像 Redis 或數據庫這樣的外部存儲需要額外的基礎設施設置,增加了 SDK 用戶的成本和複雜性。這違背了我們提供開發者友好解決方案的目標。

雖然內存存儲可能是一個替代方案,但它不適用於無伺服器環境,因為實例是短暫的,記憶體不會在請求之間共享。

解決方案:cookie 拆分

一個簡單的解決方案是將大型 cookie 拆分為更小的塊。本文以 Next.js 為例展示了這種方法:

1. 拆分會話數據

2. 存儲這些塊

3. 在請求時重組

實施的最佳實踐

1. 塊大小管理

2. 清除會話管理

結論

cookie 拆分提供了一種優雅的解決方案,既易於實施又不會對現有應用架構造成重大干擾。通過簡單地將大型 cookie 拆分為較小的塊,開發人員可以克服瀏覽器的大小限制,而不改變他們的核心會話管理方法或添加外部依賴。