简体中文
  • cookie
  • nextjs
  • serverless

如何通过拆分 cookie 来修复超出 cookie 大小的错误

一种解决 cookie 大小超出错误的方法:将 cookie 拆分成多个较小的 cookie,并在服务器端重建它们。这个解决方案尤其适用于无需额外基础设施的无服务器平台。

Sijie
Sijie
Developer

总结:当你的 cookie 大小超过 4KB 浏览器限制时,将其拆分成多个较小的 cookie,并在服务器端重建它们。这个解决方案尤其适用于无需额外基础设施的无服务器平台。

在大多数 Logto 针对传统 web 应用的 SDK 中,我们将会话数据存储在仅 HTTP 的 cookie 中以确保安全。我们的方法如下:

当 SDK 执行需要会话数据的操作时,它会:

  • 使用对称加密进行加密
  • 将加密字符串存储在仅 HTTP 的 cookie 中
  • 设置安全标志以确保仅 HTTPS 传输

这种方法不需要外部存储,可以直接部署到像 Vercel 这样的流行无服务器平台,无需任何额外的基础设施变更。

然而,当实现多组织支持时,我们遇到了限制。我们的 cookie 大小超过了 4KB 的浏览器限制,因为我们需要存储:

  • 登录和其他会话数据
  • 用户身份验证的 ID 令牌
  • 刷新令牌
  • 带有不同资源指示符的访问令牌
  • 组织令牌,它们是负载中带有 JWT 的,每个组织一个,当多个组织同时存活时可能会非常大

这导致了错误:

浏览器执行严格的 cookie 大小限制,大多数限制单个 cookie 为 4KB ,每个域的总 cookie 大小为 8KB 。

使用外部存储呢?

使用像 Redis 或数据库这样的外部存储将需要额外的基础设施设置,增加 SDK 用户的成本和复杂性。这与我们提供开发者友好解决方案的目标相悖。

虽然内存中存储可能是一种替代方案,但在实例是短暂的且请求之间不共享内存的无服务器环境中效果不佳。

解决方案:cookie 拆分

一个简单的解决方案是将大型 cookie 拆分成较小的块。本文以 Next.js 为例演示了这种方法:

1. 拆分会话数据

2. 存储这些块

3. 请求时重建

实施的最佳实践

1. 块大小管理

2. 清理会话管理

结论

cookie 拆分提供了一种优雅的解决方案,既易于实现又对现有应用架构的破坏性最小。仅通过将大 cookie 拆分为较小的块,开发人员可以在不改变其核心会话管理方法或增加外部依赖项的情况下克服浏览器大小限制。