JWT是什么?
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全地传输信息。JWT最大的特点是自包含——Token本身包含了所有必要的认证信息,服务器不需要查询数据库即可验证用户身份。这使得JWT在微服务架构和前后端分离的应用中极为流行。
JWT的三段结构
一个JWT由三部分组成,用点号分隔:Header.Payload.Signature。
Header(头部):包含令牌类型和签名算法,例如 {"alg": "HS256", "typ": "JWT"}。Base64Url编码后形成JWT的第一段。
Payload(负载):包含声明(Claims),即实际传输的数据。标准声明包括iss(签发者)、exp(过期时间)、sub(主题)、aud(受众)等。你也可以添加自定义声明。Base64Url编码后形成第二段。注意:Payload只是编码,不是加密,任何人都可以解码查看内容。
Signature(签名):使用Header中指定的算法,对编码后的Header和Payload加上密钥进行签名。签名的目的是验证消息在传输过程中没有被篡改。
JWT vs Session:如何选择?
Session是传统的状态认证方案,服务器存储会话信息,客户端只保存Session ID。JWT则是无状态的,所有信息都在Token中。选择依据如下:
- 选择JWT:微服务架构(避免Session共享问题)、移动端应用、需要跨域认证的场景
- 选择Session:需要即时撤销认证、对安全性要求极高(可以随时使Session失效)、单服务器架构
JWT的7大安全陷阱
- 算法设置为none:攻击者将Header中的alg改为none,绕过签名验证。服务端必须拒绝alg为none的Token。
- RS256公钥当HMAC密钥:攻击者用RS256的公钥作为HS256的密钥签名,如果服务端同时支持两种算法就可能被欺骗。
- Payload中存储敏感信息:Base64编码不是加密,不要在JWT中存储密码、密钥等敏感数据。
- 不设置过期时间:永远不过期的Token等同于永久凭证,一旦泄露无法限制其有效期。
- 密钥强度不足:HS256的密钥至少应为256位随机字符串,过于简单的密钥容易被暴力破解。
- JWT未验证签名:只解码不验证签名,等于信任了任何人伪造的Token。
- Token无法即时撤销:JWT的无状态特性意味着一旦签发就难以撤销,需要设计黑名单机制。
JWT最佳实践
设置合理的过期时间(Access Token 15-30分钟,Refresh Token 7天);使用HTTPS传输Token;在Authorization Header中使用Bearer模式传递;使用强密钥(至少32字节随机字符串);实现Token刷新机制;考虑使用短寿命Token + 长寿命Refresh Token的组合策略。
工具推荐
使用我们的在线JWT解码器可以快速解析JWT的Header和Payload,自动识别时间字段并转为可读格式,帮助你在开发调试时快速查看Token内容。