一个用户最多 5 个 Session,超出自动踢掉最早的。聊聊 Session 管理的实现细节。
为什么限制 Session 数量
不限制的话,一个用户可以在无数设备上登录,Session 数据无限膨胀。另外还有安全考虑:如果账号被盗,攻击者可以无限创建 Session。
RuiTool AI 设置为 每个用户最多 5 个 Session。
Session 存储设计
Session 存储在 Cloudflare KV 中,key 格式为:
| |
每个 Session 对象包含:
| |
创建 Session 时自动淘汰
创建新 Session 时,如果已达到上限,自动淘汰最早的 Session:
| |
淘汰策略:
- 按过期时间排序,淘汰最早的
- 删除数量 = 当前数量 - 上限 + 1(为新 Session 腾位置)
- 直接删除 KV 中的记录
Session 版本管理
Session 结构可能随产品迭代变化。如果改了 Session 的字段,老的 Session 数据就和新的代码不兼容了。
解决方案:版本号
| |
验证 Session 时,如果版本号不匹配,自动更新:
| |
这样改了 Session 结构后,只需要递增 CURRENT_SESSION_VERSION,用户下次请求时自动迁移。
Session 元数据
每个 Session 记录了一些有用的元数据:
- 登录方式:密码 / Passkey / Google OAuth
- 地理位置:从 Cloudflare 的
cf对象获取 country、city、continent - IP 地址:从信任的请求头获取
- User Agent:浏览器和设备信息
这些数据在"管理 Session"页面上展示给用户,如果发现异常登录(陌生地点、陌生设备),用户可以手动下线。
用户主动管理 Session
用户在设置页面可以看到所有 Session 并手动删除:
| |
总结
- 上限 5 个 Session,超出自动淘汰最早的
- 版本号机制让 Session 结构变更零停机
- 记录登录地、设备信息,方便用户识别异常
- 支持用户主动查看和删除 Session
