jwt无状态认证的核心是服务端不存会话,所有身份信息编码于签名token中;其结构为header.payload.signature三部分,header声明类型与算法,payload含标准字段与自定义声明,signature防篡改;登录时验证密码后签发带exp的token,鉴权时校验签名、时效及声明,并加载权限;需强化密钥管理、安全存储、短时效+刷新机制及登出黑名单。

JWT无状态身份认证的核心是:服务器不保存会话状态,所有用户身份信息都编码在签名的 Token 中,每次请求附带 Token,服务端仅校验签名和载荷有效性即可完成鉴权。
JWT 的结构与生成逻辑
JWT 由三部分组成(Header.Payload.Signature),用点号分隔:
- Header:声明类型(JWT)和签名算法(如 HS256、RS256)
-
Payload:存放标准字段(如
sub用户标识、exp过期时间、iat签发时间)和自定义声明(如role、tenant_id) - Signature:对前两部分 Base64Url 编码后,用密钥(对称)或私钥(非对称)签名,防止篡改
示例生成(Node.js + jsonwebtoken):
const token = jwt.sign(
{ sub: 'user_123', role: 'admin', exp: Math.floor(Date.now() / 1000) + 3600 },
process.env.JWT_SECRET,
{ algorithm: 'HS256' }
);
登录流程:颁发 Token
用户凭账号密码请求登录接口,验证通过后生成并返回 JWT:
- 校验用户名密码(建议用 bcrypt 或 argon2 加盐比对)
- 生成 Token 时严格设置
exp(如 1 小时),避免长期有效 - 响应中通过
Authorization: Bearer <token></token>或 JSON Body 返回,前端存入 localStorage 或 httpOnly Cookie(后者更安全防 XSS) - 不返回敏感信息(如密码哈希、原始密钥)
请求鉴权:校验 Token
每个受保护接口在处理前需校验 Token 合法性:
- 从请求头(如
Authorization: Bearer xxx)或 Cookie 提取 Token - 使用相同密钥/公钥验证签名是否被篡改
- 检查
exp是否过期、nbf(not before)是否生效、iss(签发方)是否可信 - 解析出
sub等字段,加载用户权限信息(如从 Redis 缓存查角色,而非每次查库) - 校验失败直接返回 401,不执行后续业务逻辑
安全增强要点
无状态不等于无风险,需主动防御常见漏洞:
- 密钥管理:生产环境禁用硬编码密钥;HS256 密钥长度至少 32 字节;高安全场景优先选 RS256 + 私钥签名/公钥验签
- Token 存储:Web 前端避免存于 localStorage(易受 XSS 窃取);推荐 httpOnly + Secure + SameSite=Strict Cookie
-
短时效 + 刷新机制:设置较短
exp(如 15–60 分钟),配合 Refresh Token(存服务端数据库或 Redis,绑定设备/IP,设长过期时间)实现静默续期 - 登出处理:JWT 本身无法主动失效(无状态),需结合黑名单(Redis 记录已注销的 jti)、缩短有效期、或强制客户端清除 Token











