JWT token 简要介绍以及使用场景和案例
JWT Token 介绍
JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在各方之间安全地传输信息。它是一个紧凑的、URL安全的令牌,用于在客户端和服务器之间传递声明。
JWT 的结构
JWT 由三部分组成,用点(.)分隔:
- Header(头部) - 包含令牌类型和签名算法
- Payload(载荷) - 包含声明(claims)信息
- Signature(签名) - 用于验证令牌的完整性
xxxxx.yyyyy.zzzzz
JWT 的工作原理
- 客户端登录认证后,服务器生成 JWT 并返回给客户端
- 客户端在后续请求中携带 JWT(通常在 Authorization 头中)
- 服务器验证 JWT 的有效性并处理请求
- JWT 可以包含用户信息,避免频繁查询数据库
主要使用场景
- 身份认证:用户登录后获得 JWT,后续请求使用该令牌认证
- 信息交换:安全地在各方之间传输信息
- 单点登录(SSO):在多个应用间共享认证状态
- API 访问授权:为 API 调用提供访问权限验证
JWT 使用案例
以下是一个简单的 JWT 使用示例:
// 生成 JWT Token
String generateToken(String username) {Date now = new Date();Date expiryDate = new Date(now.getTime() + 86400000); // 24小时过期return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(expiryDate).signWith(SignatureAlgorithm.HS512, "secretKey").compact();
}// 验证 JWT Token
boolean validateToken(String token) {try {Jwts.parser().setSigningKey("secretKey").parseClaimsJws(token);return true;} catch (Exception e) {return false;}
}// 从 JWT 中获取用户信息
String getUsernameFromToken(String token) {Claims claims = Jwts.parser().setSigningKey("secretKey").parseClaimsJws(token).getBody();return claims.getSubject();
}
JWT 的优势
- 无状态:服务器不需要存储会话信息
- 跨域支持:可以在不同域之间使用
- 移动友好:适合移动应用和 API
- 自包含:包含所有必要的用户信息
注意事项
- JWT 一旦签发,在有效期内始终有效(除非服务器端黑名单)
- 敏感信息不应存储在 JWT 的 payload 中
- 需要妥善保管签名密钥
- 应设置合理的过期时间
JWT 是现代 Web 应用中广泛使用的认证和授权解决方案,特别适合分布式系统和微服务架构。
JWT Maven 依赖
使用 JWT 通常需要添加以下 Maven 依赖:
基础依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>
旧版本依赖(0.9.x 及以下)
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
说明
jjwt-api
:JWT API 接口jjwt-impl
:JWT 实现类jjwt-jackson
:JSON 处理支持- 建议使用 0.11.x 版本,支持 Java 8+ 并且模块化更好
以上部分内容由大模型生成,注意识别!