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一旦签发,在到期前始终有效,服务端无法直接作废。这是其“无状态”特性的另一面。若需实现即时登出等功能,可能需要引入额外的有状态机制,如令牌黑名单
posted @ 2026-01-05 09:01  轻寒  阅读(2)  评论(0)    收藏  举报