繁體中文(台灣)
  • cookie
  • nextjs
  • serverless

如何透過拆分 cookie 解決 cookie 大小超限的錯誤

解決 cookie 大小超限錯誤的一種方法:將 cookie 拆分成多個較小的 cookie 並在服務器端重建它們。這種解決方案特別適合無伺服器平台,且不需要額外的基礎設施。

Sijie
Sijie
Developer

簡單說明:當你的 cookie 大小超過瀏覽器的 4KB 限制時,將其拆分為多個較小的 cookie,並在服務器端重建它們。此方案尤其適合無伺服器平台,不需要額外的基礎設施。

在大多數傳統 web 應用的 Logto SDK 中,我們為了安全性將會話數據存儲在僅限 HTTP 的 cookie 中。以下是我們的方法:

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

  • 使用對稱加密來加密
  • 將加密的字串存儲在一個僅限 HTTP 的 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 拆分為較小的部分,開發者可以在不改變其核心會話管理方法或添加外部依賴的情況下克服瀏覽器的大小限制。