JWT介绍

一.什么是JWT?

JSONWebToken,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。

二.JWT有什么用?

JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求的之前,都要先进行安全校验,通过之后再进行处理。

三.JWT的组成

JWT由3部分 Header.Payload.Signature组成,用.拼接

eyJhbGcioiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6I1RvbSIsInJvbGUioiJhZG1pbiIsInN1YiI6ImFkbwluLXR1c3QiLCJ1eHAiojE2MjMyMjM2NzUsImp0aSI6ImQ2MTJjzjcxLWI5ZmUtNGMwNy04MzQwLTViOWViZmMyNjExNyJ9.F0S9Y7rYNdc2AOidnSPrgg2XTYePU0yGZ598h2gtabE

1. Header(头部)

javascript 复制代码
  {
    "typ": "JWT",
    "alg": "HS256"
  }

  - typ: 令牌类型,固定为 JWT
  - alg: 签名算法,这里是 HS256(HMAC-SHA256)

  Base64Url 编码后:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

2. Payload(载荷)

javascript 复制代码
  {
    "username": "Tom",
    "role": "admin",
    "sub": "admin-tust",
    "exp": 1623223675,
    "jti": "d612c771-b9fe-4c07-8340-5b9ebfc26117"
  }

  常见字段说明:
  - sub: 主题(subject)
  - exp: 过期时间(Unix 时间戳)
  - jti: 唯一标识符

  Base64Url 编码后:eyJ1c2VybmFtZSI6I1RvbSIsInJvbGUioiJhZG1pbiIs...

3. Signature(签名)

javascript 复制代码
  计算方式:

  signature = HMAC-SHA256(
    base64urlEncode(header) + "." + base64urlEncode(payload),
    secret_key
  )

  即:用 Header 和 Payload 的 Base64Url 编码拼接,再用密钥通过 HS256 算法签名。

四.使用

与Java项目结合

引入依赖

我是jdk1.8所以不需要加入其它依赖

XML 复制代码
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

如果是 JDK 9 及以上,需要额外引入 JAXB 依赖(因为 JAXB 从 JDK 11 起被移除)

XML 复制代码
 <!-- jjwt -->
  <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
  </dependency>

  <!-- JAXB(JDK 11+ 必须) -->
  <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
  </dependency>
  <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-impl</artifactId>
      <version>2.3.0</version>
  </dependency>
  <dependency>
      <groupId>com.sun.xml.bind</groupId>
      <artifactId>jaxb-core</artifactId>
      <version>2.3.0</version>
  </dependency>

编写代码

加密

java 复制代码
private Long time = 1000 * 60 * 60 * 24; // 24小时
private String signature = "admin";

  @org.junit.Test
  public void jwt() {
      String jwtToken = Jwts.builder()
              // header
              .setHeaderParam("typ", "JWT")
              .setHeaderParam("alg", "HS256")
              // payload
              .claim("username", "tom")
              .claim("role", "admin")
              .setSubject("admin-test")
              .setExpiration(new Date(System.currentTimeMillis() + time))
              .setId(UUID.randomUUID().toString())
              // signature
              .signWith(SignatureAlgorithm.HS256, signature)
              .compact();

      System.out.println(jwtToken);
  }

解密

java 复制代码
  @org.junit.Test
  public void parse() {
      String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."; // 待解析的token

      // 创建解析器,设置签名密钥(必须和生成时一致,否则校验失败)
      JwtParser jwtParser = Jwts.parser();
      // 解析并验证签名,得到 Jws 对象(包含 Header + Payload)
      Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
      // 获取 Payload 部分(载荷数据)
      Claims claims = claimsJws.getBody();

      // 读取自定义字段
      System.out.println(claims.get("username"));   // 输出:tom
      System.out.println(claims.get("role"));        // 输出:admin
      // 读取标准字段
      System.out.println(claims.getId());            // 输出:唯一ID
      System.out.println(claims.getSubject());       // 输出:admin-test
      System.out.println(claims.getExpiration());    // 输出:过期时间
  }
相关推荐
王维同学7 小时前
Winsock 协议与名称空间 Provider 目录
网络·c++·windows·安全
yangshicong9 小时前
第19章:AI安全防护与AI安全
人工智能·python·安全·prompt·ai编程
hz5678912 小时前
私有云会议系统选型攻略:企业级安全与高效协同并行
安全·音视频·实时音视频·信息与通信
上海云盾商务经理杨杨12 小时前
2026 生产级 Linux 内核抗 DDoS 调优!全套 sysctl 配置直接套用
网络·安全·ddos
网络安全零基础教程13 小时前
网络安全春招面试避坑与复盘指南
linux·网络·安全·web安全·面试·职场和发展
kirs_ur13 小时前
SSD 安全特性 — 加密与 TCG Opal
服务器·网络·安全
志栋智能15 小时前
超自动化安全:提升安全服务满意度的隐形引擎
大数据·安全·自动化
BullSmall16 小时前
SonarQube 完整手册(2026 最新)
安全·开源·sonar
汉堡包00116 小时前
【工具分享】--威胁情报平台大全
学习·安全·web安全·信息安全
Sirius Wu17 小时前
OpenClaw Model Provider(模型提供商)完整详解
服务器·网络·人工智能·安全·aigc