什么是JWT
JWT(JSON Web Token)是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT可以被签名,因此可以验证信息的完整性和真实性。
JWT通常用于身份认证和信息交换场景。与传统的Session认证不同,JWT是无状态的,服务器不需要保存会话信息,非常适合分布式系统和微服务架构。
令牌结构
JWT由三部分组成,用点号(.)分隔:
Header(头部):包含令牌类型和签名算法信息。
Payload(载荷):包含实际的数据,如用户ID、角色、过期时间等。
Signature(签名):用于验证令牌的完整性和真实性。
例如:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTYifQ.dGVzdA
工作原理
JWT的工作流程如下:
- 用户登录时,服务器验证用户名和密码
- 验证通过后,服务器生成JWT令牌并返回给客户端
- 客户端在后续请求中将JWT放在Authorization头中发送
- 服务器验证JWT的签名和有效期,解析出用户信息
- 如果JWT有效,服务器处理请求并返回结果
签名验证
JWT支持多种签名算法:
HS256(HMAC-SHA256):对称签名,使用同一个密钥进行签名和验证。适合单一服务内部使用。
RS256(RSA-SHA256):非对称签名,使用私钥签名、公钥验证。适合微服务间认证。
ES256(ECDSA-SHA256):基于椭圆曲线的签名算法,性能更好,密钥更短。
应用场景
1. 用户认证:JWT最常见的用途是用户登录后的身份认证,替代传统的Session机制。
2. API认证:为第三方应用提供API访问权限,使用JWT进行授权验证。
3. 单点登录(SSO):JWT的跨域特性使其非常适合实现单点登录系统。
4. 信息交换:JWT可以安全地在各方之间传输信息,因为签名可以验证内容是否被篡改。
安全建议
1. 使用HTTPS:始终通过HTTPS传输JWT,防止中间人攻击。
2. 设置合理的过期时间:JWT应设置较短的过期时间(如15-30分钟),配合Refresh Token使用。
3. 不要在Payload中存放敏感信息:JWT的Payload是Base64编码的,不是加密的,任何人都可以解码查看。
4. 使用强密钥:签名密钥应足够复杂,定期更换。