JWT(JSON Web Token)
一、JWT 基本概念与结构
定义
JWT 是一种开放标准(RFC 7519),用于在网络应用间以 JSON 格式安全传输信息。其核心功能是 身份验证 和 信息交换 ,尤其适用于分布式系统中无状态认证场景。组成结构
JWT 由三部分通过.拼接而成: • Header(头部):声明加密算法(如HS256、RS256)和令牌类型(固定为JWT),经 Base64URL 编码。 • Payload(负载):存储用户声明(Claims),包括预定义字段(如exp过期时间、iss签发者)和自定义数据,仅 Base64URL 编码,未加密,需避免存储敏感信息。 • Signature(签名):对 Header 和 Payload 的编码结果拼接后进行加密(如 HMAC、RSA),确保数据完整性。示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0...base64.AdwNx4NtEumBL5SkcOiBQ
二、JWT 工作原理与流程
认证流程
• 用户登录成功后,服务端生成 JWT 并返回客户端。 • 客户端存储 JWT(如 Cookie 或 LocalStorage),后续请求携带在Authorization头中。 • 服务端验证签名、过期时间等,确认用户身份。与传统 Session 对比
• Session:服务端存储会话信息,需维护状态,存在跨域和扩展性问题。 • JWT:无状态,信息自包含,适合分布式系统,但需注意令牌撤销问题。
三、JWT 生成与验证
生成步骤
• 定义 Header 和 Payload。 • 使用密钥(对称加密)或公私钥(非对称加密)生成签名。 • 拼接三部分并编码。验证逻辑
• 分割 Token 为三部分,解码 Header 和 Payload。 • 根据 Header 中的算法重新计算签名,与原始签名对比,确保数据未被篡改。代码示例(Python):
pythonimport jwt token = jwt.encode({"user": "admin", "exp": datetime.utcnow() + timedelta(hours=1)}, "secret_key", algorithm="HS256") decoded = jwt.decode(token, "secret_key", algorithms=["HS256"])
四、JWT 安全攻防
常见漏洞
• 空加密算法(None):攻击者篡改 Header 的alg为None,绕过签名验证。 • 密钥混淆攻击:将非对称算法(如RS256)改为对称算法(如HS256),利用公钥伪造签名。 • 密钥爆破:弱密钥可被暴力破解工具(如jwt_tool)破解。防御措施
• 禁用alg: None,严格校验算法类型。 • 使用强密钥,定期更换。 • 结合 HTTPS 传输,防止中间人攻击。
五、JWT 使用注意事项
安全性设计
• 短过期时间:减少令牌泄露风险。 • 双 Token 机制:access_token(短有效期)和refresh_token(长有效期,存储于服务端),通过后者刷新前者,实现无感登录。 • 敏感数据加密:Payload 中敏感字段需额外加密。运维建议
• 监控异常 Token 使用(如高频请求)。 • 实现 Token 黑名单(如 Redis 存储失效 Token)。
六、实际应用场景
- 单点登录(SSO)
JWT 可跨域传递用户信息,减少服务端会话管理负担。 - API 鉴权
微服务架构中,服务间通过验证 JWT 实现无状态通信。 - 移动端认证
移动 App 通过 JWT 实现用户身份持久化。
七、工具推荐
- 生成与解析工具
• 在线工具:jwt.io • 命令行工具:jwtctl(支持跨平台生成与读取)。 - 渗透测试工具
• Burp Suite 插件:JSON Web Tokens、HAE。 • 密钥爆破工具:jwt_tool。