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

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

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

Sijie
Sijie
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

摘要:當你的 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 拆分為較小的塊,開發人員可以克服瀏覽器的大小限制,而不改變他們的核心會話管理方法或添加外部依賴。