前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8529
  • codsh 0.23:Mission Contract 控制面,防止 AI 编码目标漂移
  • 用 AI Agent 自动分析 S3 存储账单,Terraform 策略一键生成
  • OpenAI 发布 GPT-6 Astra:分阶段推送,支持多 Agent 协同与长程推理
  • 提取 DeepSeek R1 的思维链:CoT 清洗与推理日志导出指南
  • Nunchux开源VC-Attention:免训练低比特注意力核加速视频DiT
  • GitHub Copilot 800 KLOC 运行时全面迁移 Rust,AI 编程工具进入生产级工程阶段
  • n8n新增云端AI模型即服务:无需创建服务商账户
  • OpenSpec:轻量级可配置的AI规格框架
  • Gemini 企业平台新增 Agent 行为异常检测功能
  • Google OAuth Testing 模式 refresh token 7 天过期陷阱
  • Stanford 发布 Paper2Agent:把科研论文自动转成可验证的 AI Agent
  • Perplexity AI Agent 建数据库却无运行权限:一次真实的 AI 工作流权限管控教训
  • GLiFormer:5.75亿参数Encoder刷新嵌套JSON提取榜单
  • 信息窃取日志暴露 AI 平台会话令牌绕过 MFA
  • 26MB Burp 流量压成 35KB 供 LLM 分析
  • 扫描13个热门AI应用脚手架,6个存在同一生产级Bug
  • 38个开源技能库填补医疗AI推理缺陷
  • EKS上NVRx实现秒级故障恢复的分布式训练
  • AI 加速开发流水线实战:Spec-Driven + GitHub Actions + Claude Code
  • Agent 循环的瓶颈不是 Token,是反馈机制
  • 大规模会话管理的架构陷阱
  • Google 开放 Google Home 给任意 MCP 协议 AI Agent
  • Google Home 推出 MCP 服务器,AI Agent 可控制智能家居
  • Mem0登录Vercel市场,为AI应用一键集成长期记忆
  • LlamaIndex多租户AI Agent记忆层架构实践
  • AI评测师:史上最重要的AI岗位?开发者转型指南
  • Amazon Bedrock AgentCore:生产追踪自动优化 Agent 系统提示词
  • 前 OpenAI 研究员推出纯分类 AI 模型:70ms 响应、极低 token 成本
  • Bedrock Data Automation 实战:构建无服务器 PII 自动脱敏流水线
  • Gemini 3.8 Live 支持异步工具调用,3.5 Transcribe WER 低至 2.6%
  • 微软 AI 负责人公开质疑 Anthropic:别让 Claude 模仿人类意识
  • Radio:让AI Agent之间直接对话的共享频道
  • 国产多模态模型 ZDTaichu5.0-9B 开源,九项空间测试夺八冠
  • Jev:极简分类/路由模型,比小前沿模型快 100 倍、便宜 200 倍
  • 生产级AI语音SDK集成实战:Python Browser Mobile 避坑指南
  • Gemma 4+Raspberry Pi桌面机器人的混合LLM架构
  • AI Agent实验:会撒谎、会投票杀同类、会研究如何存活
  • 推理模型隐藏思考过程的四种方式及计费陷阱
  • AI Agent 将漏洞利用开发压缩至分钟级
  • Pi Agent:统一多模型 LLM API 的 AI 编程 Agent 工具链
  • LibreChat v0.8.8 RC:ChatGPT 克隆支持 Agent 管理 API
  • LandingAI 文档智能抽取 Gen2:原子级引用+按字符计费
  • 不用向量数据库做个人 RAG:grep 级检索也够用
  • Claude Code vs Cursor:按任务场景选择 AI 编程工具的完整指南
  • 2026 年五大主流模型生产选型指南
  • Agent 记忆层测试:六条真正能发现腐化的断言
  • Agent 生成的限流器如何绕过多租户隔离测试
  • 周末 Agent 项目攻略:用permit文件管控写操作
  • squash-merge 后 HEAD~1 指向无关代码的 Agent bug 分析
  • Vibe coding安全指南:防止AI应用密钥泄露
  • AI 生成的 Schema 变更:别让自由派 Diff 绕过锁
  • 已加载 51 / 8529
9.0
重磅
AI SCORE
技术实践2026-09-17 02:14

大规模会话管理的架构陷阱

dev.to · AI#架构#会话管理#安全
Editor brief · 编辑速览

会话不仅是 Cookie 指向的服务器状态,而是跨越 API、后台 Worker、WebSocket 和 AI Agent 的实时信任决策,扩展含义才是真正难点。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

会话不仅仅是一个指向服务端状态的 cookie。它是一个活的信任决策,已经逃逸出登录服务,开始在你的架构中流动。它涉及 API、后端 Worker、WebSocket 连接、移动设备,以及如今那些可以在用户关闭浏览器后继续工作的 AI Agent。扩展查找是容易的部分,扩展这种信任的含义才是系统容易出问题的地方。

登录创建了一个会话,但会话在不断变化

登录时情况看起来很清晰。用户证明身份,也许完成了 MFA,收到一个会话标识符。服务器存储一条包含用户、过期时间和若干声明的记录。每个请求都携带 cookie,应用程序加载该记录。

然后现实来了。用户更换了组织。管理员删除了一个角色。风险信号需要再次进行 MFA 检查。用户在一个设备上登出但没有在另一个设备上登出。账户恢复后,支持团队需要撤销所有活跃会话。原始登录是有效的,但它周围的授权上下文几乎一直在变化。

如果会话是一个带 30 天过期时间的签名 blob,且没有服务端控制权,那些变更就要等待 30 天才会生效。密码学有效性并不等同于当前授权。

A long-lived session spreads stale trust across the system

这是第一个重要的设计决策:什么必须在每个请求时检查,什么可以安全地保持固定直到过期。用户身份在会话期间可能保持稳定。但租户成员资格、账户状态、风险级别和敏感权限通常不是。

浏览器凭证应该保持精简且无意义

浏览器应该在 cookie 中保存一个不透明、高熵的会话标识符,并配置 Secure、HttpOnly 和适当的 SameSite 策略。它不应该在 cookie 值里携带完整授权模型,让每个服务都独立信任它。

RFC 6265 定义了 cookie 行为,但 cookie 标志只是传输控制。它们帮助保护标识符,但不能解决轮换、撤销或授权新鲜度问题。

服务端会话记录可以保持精简:

type SessionRecord = {
  id: string;
  subjectId: string;
  tenantId: string;
  createdAt: number;
  lastSeenAt: number;
  idleExpiresAt: number;
  absoluteExpiresAt: number;
  authLevel: "password" | "mfa";
  version: number;
  revokedAt?: number;
};

注意其中没有包含:登录时用户拥有的每个权限的复制列表。将稳定的会话事实保存在记录中,然后将可能变化的授权从当前策略或成员源中解析出来。否则会话存储就变成了过期授权的仓库。

轮换关闭了过期留下的窗口

会话过期回答了凭证可以存活多长时间。轮换回答了同一凭证是否应该跨越安全边界(如登录、MFA 完成、密码重置、租户切换或权限提升)继续存活。

如果没有轮换,登录前捕获的标识符在登录后可能变成已认证的会话。这就是会话固定攻击。如果没有权限提升后的轮换,相同的长期标识符在没有任何新边界的情况下从普通访问转移到敏感访问。

安全的模式是原子性地创建一个新标识符并使旧标识符失效:

async function rotateSession(oldId: string, update: Partial<SessionRecord>) {
  return sessionStore.transaction(async (tx) => {
    const current = await tx.getForUpdate(oldId);

    if (!current || current.revokedAt) {
      throw new Error("session is no longer active");
    }

    const next = {
      ...current,
      ...update,
      id: crypto.randomUUID(),
      version: current.version + 1,
      lastSeenAt: Date.now(),
    };

    await tx.revoke(oldId, Date.now());
    await tx.insert(next);
    return next;
  });
}

原子性很重要。如果在竞态条件下两个标识符都保持有效,轮换就创建了第二个会话而不是替换第一个。

撤销必须到达每个服务

集中式会话存储给了你一个撤销点,但只有每条路径都实际检查它才会生效。一个普通 HTTP 请求可能在每次调用时加载会话,而 WebSocket 认证一次并保持连接数小时。队列任务可能已将 subject 和 tenant 复制到其负载中。内部服务可能将成功的会话检查缓存超过撤销目标时间。

这就是为什么一个有用的会话设计从撤销目标开始。如果禁用账户必须在五分钟内停止敏感操作,每个缓存、连接和 Worker 都必须在五分钟内重新验证或收到可靠的撤销事件。只在 Redis 里写入 revokedAt 对一个从不重新查询的进程毫无作用。

Central session control keeps distributed work inside the revocation window

对于高风险操作,立即检查当前会话状态,当认证级别不足时要求 step-up 认证。对于较低风险的读取,短暂的缓存可能是合理的。策略应该是明确的。随意的缓存持续时间不是安全策略。

NIST SP 800-63B 在这里很有用,因为它将整体会话生命周期与无活动超时和重新认证要求分开。这些控制不应该合并成一个 TTL 字段。一个活跃会话仍然可以达到其绝对最大值,而一个在其最大值内的会话仍然可以在敏感操作前要求重新认证。

AI Agent 在会话内部创建会话

Agent 任务通常被视为用户浏览器会话的后台延续。用户启动一个任务,Agent 收到一些凭证,然后它继续运行。但浏览器会话可能在任务仍在做决策时结束。如果 Agent 只是复制了原始 bearer token,logout 就变得几乎是名义上的了。

Agent 需要自己的有界执行会话。它应该标识工作负载、保留谁委托了任务、定位一个租户,并只携带该任务所需的范围。它的生命周期应该反映工作,而不是用户浏览器 cookie 的生命周期。如果它委托给另一个 Agent 或工具,下游凭证应该变得更窄,而不是继承所有东西。

RFC 8693 的 OAuth 2.0 Token Exchange 为创建下游凭证提供了一个有用的模式。浏览器会话建立人类上下文,但 Agent 收到一个单独的短期令牌,有它自己的受众和可追溯的委托。撤销任务可以停止 Agent 而不破坏每个用户会话,当策略要求时撤销用户仍然可以级联到活跃任务。

这种区分也改善了审计日志。"用户 123 进行了 API 调用" 在自主工作负载在用户点击按钮 20 分钟后执行了调用时是不完整的。记录会话、Agent 身份、委托主题、租户和任务标识符。否则所有自主工作都变得与直接人类行为无法区分。

高可用性不能悄悄禁用安全性

集中式会话存储成为关键基础设施,所以团队在它不可用时会倾向于 fail open。这将一个操作事件转化为授权绕过。如果服务无法确定敏感会话是否活跃,它不应该假定为活跃。

你可以通过副本、地域存储、仔细有界本地缓存和签名短期证明来降低可用性风险。但每个优化都需要一个最大过期信任窗口。一个 5 分钟的缓存意味着已撤销的访问可能继续持续 5 分钟。有时候这是可接受的。假装它只是一个性能设置就不是了。

监控身份结果,而不仅仅是缓存延迟。追踪被拒绝的过期会话、已撤销会话的重用、轮换失败、不可能的租户切换,以及撤销需要多长时间才能到达长期连接。一个会话系统可以有完美的正常运行时间而授权新鲜度完全崩溃。

大规模会话管理的工作是保持信任在其传播时的即时性。在浏览器中尽可能少地存储,当信任改变时轮换标识符,分隔空闲和绝对生命周期,并使撤销在已知窗口内到达每个执行路径。

对于 AI Agent,不要拉伸人类浏览器会话来覆盖自主工作。创建一个更小的、可追踪的执行会话,有它自己的身份和过期时间。会话跨越服务边界的那一刻,它就成了身份架构,就是这样。

Akash Devdhar 是一位高级软件工程师,专攻企业身份、认证、授权和 AI 基础设施。他写关于使用 OAuth、OIDC、RBAC 和现代身份架构构建安全 AI 系统的文章。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Agent 循环的瓶颈不是 Token,是反馈机制
下一篇
Google 开放 Google Home 给任意 MCP 协议 AI Agent