JWT 机制概述JSON Web TokenJWT是一种开放标准RFC 7519用于在网络应用环境间安全传递声明claims。JWT 以 JSON 对象的形式存储信息并通过数字签名或加密确保信息的完整性和安全性。JWT 结构JWT 由三部分组成以点号.分隔Header头部包含令牌类型如 JWT和使用的签名算法如 HMAC SHA256 或 RSA。Payload载荷存储声明claims包含用户信息或其他数据。Signature签名对头部和载荷的签名用于验证消息的完整性和来源。示例结构header.payload.signatureJWT 工作流程用户认证用户通过凭据如用户名和密码登录系统。生成令牌服务器验证凭据后生成 JWT 并返回给客户端。存储令牌客户端如浏览器存储 JWT通常存储在本地存储或 Cookie 中。发送令牌客户端在后续请求中携带 JWT通常通过 HTTP 头的Authorization字段。验证令牌服务器验证 JWT 的签名和有效性并根据载荷信息处理请求。JWT 的优点无状态服务器无需存储会话信息所有必要信息都包含在令牌中。跨域支持适合分布式系统和跨域认证。灵活性可以存储自定义声明支持多种签名和加密算法。JWT 的缺点令牌大小载荷过大时可能增加网络开销。无法撤销一旦签发在有效期内无法直接撤销需结合黑名单或其他机制。安全性依赖存储客户端存储不当可能导致令牌泄露。JWT 的应用场景用户认证替代传统的 Session-Cookie 机制。API 认证保护 RESTful API 的访问。单点登录SSO在多个系统间共享认证状态。JWT 签名算法常见的签名算法包括HS256HMAC SHA-256对称加密需共享密钥。RS256RSA SHA-256非对称加密使用私钥签名、公钥验证。ES256ECDSA SHA-256基于椭圆曲线的非对称加密。安全注意事项密钥管理确保密钥的安全存储和定期轮换。有效期设置合理的令牌过期时间exp声明。HTTPS始终通过 HTTPS 传输 JWT防止中间人攻击。敏感信息避免在载荷中存储敏感信息如密码必要时加密。示例代码生成和验证 JWT以下是一个使用 Node.js 和jsonwebtoken库的示例const jwt require(jsonwebtoken); // 生成 JWT const payload { userId: 123, role: admin }; const secret your-secret-key; const token jwt.sign(payload, secret, { expiresIn: 1h }); // 验证 JWT jwt.verify(token, secret, (err, decoded) { if (err) { console.error(Token verification failed:, err); } else { console.log(Decoded token:, decoded); } });JWT 与 Session 的比较特性JWTSession状态管理无状态有状态服务器存储扩展性高适合分布式系统低依赖会话存储存储位置客户端本地存储/Cookie服务器内存/数据库安全性依赖签名和客户端存储依赖服务器端保护性能减少服务器查询需频繁查询会话存储