繁體中文(香港)
如何通過拆分 cookie 來解決 cookie 大小超過錯誤
對於 cookie 大小超過錯誤的解決方案:將 cookie 拆分為多個較小的 cookie,並在伺服器端重組它們。該解決方案特別適用於無伺服器平台,無需額外的基礎設施。
摘要:當你的 cookie 大小超過 4KB 的瀏覽器限制時,將其拆分為多個較小的 cookie,並在伺服器端重組它們。這個解決方案特別適用於無伺服器平台,無需額外的基礎設施。
在 Logto SDK 中使用 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 拆分提供了一種優雅的解決方案,既易於實施又不會對現有應用架構造成重大干擾。通過簡單地將大型 cookie 拆分為較小的塊,開發人員可以克服瀏覽器的大小限制,而不改變他們的核心會話管理方法或添加外部依賴。