两种模型
会话认证把不透明的会话 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。