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());    // 输出:过期时间
  }
相关推荐
qq_4523962334 分钟前
第六篇:《运行时安全:Falco 入侵检测与异常行为监控》
安全
TJHHH.1 小时前
文件包含漏洞
笔记·安全·文件包含
小五传输1 小时前
Serv-U替代方案怎么选?政务机关文件安全传输对比与迁移指南
大数据·运维·安全
其实防守也摸鱼1 小时前
红队技能总结导图:从入门到精通的完整知识体系
开发语言·人工智能·学习·安全·web安全
山东科恩光电2 小时前
折弯机保护装置在生产安全和效率提升中的应用及优势分析
安全
一条泥憨鱼3 小时前
【从0开始学习计算机网络】| CA证书、数字签名与中间人攻击:一次完整的安全握手之旅
计算机网络·安全·http·https
weixin_618232303 小时前
国产开源双响 + 闭源补端 + Agent 安全继续爆雷
安全·开源
街道小厂奔前方4 小时前
你的出行安全锦囊:“友熊地理安全锦囊”使用指南
安全·小程序·地理
研华科技Advantech5 小时前
Windows Server IoT 2025深度技术解析:功能、安全与AI性能突破
人工智能·物联网·安全
复园电子5 小时前
USB服务器架构设计分析:多设备管理、权限控制与安全传输机制
运维·服务器·安全