JWT回顾
JWT(JSON Web Token)是一种在现代Web开发中广泛使用的身份验证和信息交换技术。下面这个表格能帮你快速把握其核心结构和在Java中的常用组件。
|
JWT 组成部分
|
核心功能与内容
|
Java 开发常用库/组件
|
|
Header (头部)
|
声明令牌类型(typ)和签名算法(alg),如HS256、RS256等。 |
依赖库(如JJWT)自动处理生成与解析。
|
|
Payload (负载)
|
存放核心信息,包括标准声明(如iss签发者、exp过期时间、sub主题)和自定义声明。 |
通过库提供的方法设置和获取声明。
|
|
Signature (签名)
|
对前两部分的签名,用于验证令牌完整性和真实性,防止篡改。 | 依赖库提供签名和验证方法,需开发者保管好密钥。 |
Java中的JWT库
JJWT
JJWT以其API设计直观易懂而广受欢迎。它提供了流式编程(Fluent Interface)的方式来创建和验证JWT。
MAVEN依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<!-- 可选,提供JSON处理支持 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
生成JWT示例
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; import java.security.Key; import java.util.Date; Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 生成一个安全的密钥 String jws = Jwts.builder() .setSubject("user123") // 设置主题 .setIssuedAt(new Date()) // 设置签发时间 .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置过期时间(1小时后) .claim("role", "admin") // 添加自定义声明 .signWith(key) // 使用密钥签名 .compact(); // 生成最终的令牌字符串
使用须知与最佳实践
为了让JWT更好地服务你的应用,有几个关键点需要特别注意:
-
确保安全:签名密钥是JWT安全的基石,必须严格保密,绝不能泄露给客户端。生产环境中应使用强随机密钥,而非简单的字符串。同时,务必通过HTTPS传输JWT,防止令牌在传输过程中被截获。
-
合理设置有效期:为JWT设置一个合理的、相对较短的过期时间(
expclaim),以减少令牌泄露后的风险。对于需要长期保持登录态的场景,可采用Refresh Token机制。 -
避免敏感信息:JWT的Payload内容默认只是Base64编码,任何人都可以解码查看。切勿在Payload中存放密码等敏感信息。
-
理解“无状态”的代价:JWT一旦签发,在到期前始终有效,服务端无法直接作废。这是其“无状态”特性的另一面。若需实现即时登出等功能,可能需要引入额外的有状态机制,如令牌黑名单

浙公网安备 33010602011771号