← 中文资源

简体中文版本

会话认证与令牌认证对比

会话认证把状态保存在服务端并只下发不透明 Cookie,令牌认证由客户端携带凭证。两者在吊销、扩展和 XSS 风险上取舍不同。

阅读英文原文

两种模型

会话认证把不透明的会话 ID 放入 Cookie,服务器保存用户状态并在每次请求时查询。令牌认证把签名或不透明的令牌交给客户端,通常通过 Authorization: Bearer 发送,服务器验证令牌后可以不保存每请求状态。

如何选择与权衡

同站浏览器应用若需要即时登出和细粒度会话控制,优先使用服务端会话;API、移动端、服务间调用和跨域客户端适合令牌。许多系统两者并用:OIDC 登录建立服务端会话,内部服务之间交换令牌。会话吊销只需删除记录,无状态 JWT 则需要黑名单或较短有效期。会话横向扩展依赖 Redis 等共享存储,Cookie 方案还需 CSRF 防护和 HttpOnly、Secure、SameSite 属性;令牌验证成本低,但一旦泄露即可被重放。

示例与误区

app.use(session({
  secret: process.env.SESSION_SECRET,
  cookie: { httpOnly: true, secure: true, sameSite: 'lax' },
  store: new RedisStore({ client: redis }),
}));

令牌并非天然比会话安全,两者威胁模型不同;“无状态”也不等于完全不存储,刷新令牌、签名密钥和黑名单依然存在。会话可以借助共享存储横向扩展。相关概念包括 JWT、CSRF、SameSite Cookie 和 OpenID Connect。