当前位置: 首页 > news >正文

JWT令牌详解及Java中的使用实战

JWT令牌详解及Java中的使用实战

摘要

本文将深入解析**JWT(JSON Web Token)**的核心概念,通过图文并茂的方式详解其工作原理,并手把手教你在Java中实现JWT的生成、验证与解析。无论你是认证授权新手还是想巩固知识的老手,都能在这里找到实用干货!


目录

  1. 什么是JWT?
  2. JWT结构剖析
  3. Java实现JWT实战
  4. 核心API详解
  5. 安全指南
  6. 总结

1. 什么是JWT?

1.1 基本定义

JWT(JSON Web Token) 是一种轻量级的开放标准(RFC 7519),用于在各方之间安全传输JSON格式信息。其典型应用场景包括:

  • 🔑 身份认证(如替代Session)
  • 🔒 跨服务安全通信
  • 🌐 跨域认证(如OAuth2)

1.2 核心优势

特性说明
无状态服务端无需存储会话信息
跨语言支持所有主流语言均有成熟实现库
自包含性令牌自身携带用户信息及元数据
防篡改基于签名机制保障数据完整性

2. JWT结构剖析

2.1 令牌组成

JWT由三部分通过.连接组成:

header.payload.signature

2.1.1 Header(头部)
{"alg": "HS256",  // 签名算法"typ": "JWT"     // 令牌类型
}

Base64Url编码后形成第一部分

2.1.2 Payload(载荷)

包含声明(Claims),分为三类:

  • 注册声明(预定义字段,如exp过期时间)
  • 公共声明(自定义但需避免冲突)
  • 私有声明(业务自定义数据)

示例:

{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022
}

Base64Url编码后形成第二部分

2.1.3 Signature(签名)

通过指定算法对前两部分签名,确保数据完整。以HS256为例:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secretKey)

3. Java实现JWT实战

3.1 环境准备

推荐使用JJWT库(目前最流行的Java 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>

3.2 生成JWT令牌

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;public class JwtDemo {// 生成安全密钥(HS256需要至少256位)private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);private static final long EXPIRATION_TIME = 86400000; // 24小时public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).claim("role", "admin") // 添加自定义声明.signWith(SECRET_KEY).compact();}
}

3.3 解析验证JWT

public static Claims parseToken(String token) {return Jwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token).getBody();
}// 使用示例
public static void main(String[] args) {String token = generateToken("user1");System.out.println("Generated Token: " + token);Claims claims = parseToken(token);System.out.println("Subject: " + claims.getSubject());System.out.println("Expiration: " + claims.getExpiration());System.out.println("Role: " + claims.get("role"));
}

4. 核心API详解

4.1 Jwts.builder() 方法链

方法作用
setSubject()设置主题(通常是用户ID)
setIssuedAt()设置令牌签发时间
setExpiration()设置过期时间
claim(key, value)添加自定义声明
signWith(key)指定签名密钥和算法

4.2 异常处理

解析时需捕获以下异常:

  • SignatureException: 签名不匹配
  • MalformedJwtException: 令牌结构错误
  • ExpiredJwtException: 令牌已过期
  • UnsupportedJwtException: 不支持的JWT格式

示例:

try {Claims claims = parseToken(token);
} catch (ExpiredJwtException ex) {System.out.println("令牌已过期!");
} catch (SignatureException ex) {System.out.println("签名验证失败!");
}

5. 安全指南

  1. 密钥管理

    • 生产环境避免硬编码密钥
    • 推荐使用密钥管理系统(如HashiCorp Vault)
  2. 传输安全

    • 必须通过HTTPS传输JWT
    • 避免URL参数传递(可能被日志记录)
  3. 存储策略

    • 浏览器端建议使用HttpOnly的Cookie
    • 移动端使用安全存储(如Android Keystore)
  4. 最佳实践

    • 设置合理的过期时间(建议≤24小时)
    • 敏感操作要求重新认证
    • 定期轮换签名密钥

6. 总结

通过本文,你应当已经掌握:

  • ✅ JWT的核心组成与工作原理
  • ✅ 在Java中生成/解析JWT的具体实现
  • ✅ 安全使用JWT的最佳实践

Q&A: 欢迎评论区提问交流!👨💻

注:  
1. 实际使用时请替换示例中的GitHub地址、博客链接和图片URL  
2. HS256的密钥生成方式仅用于演示,生产环境需使用更安全的密钥管理方案  
3. 建议在Web应用中结合过滤器进行JWT校验(如Spring Security的`OncePerRequestFilter`)

相关文章:

  • PP-OCRv5
  • 渗透测试靶场PortSwiggerLabs-xss(1-10)lab详解
  • Windows 11 [close recent file browsing history]
  • SQL每日一练(7)
  • clickhouse-1-特性及docker化安装
  • Ubuntu 22.04 高效Python依赖管理指南
  • 工作流长任务处置方案
  • SQL 每日一题(6)
  • Nature图形解析与绘制—热图的绘制及深入解析
  • 【Excel VBA 】窗体控件分类
  • C++引用以及和指针的区别
  • 《数据结构》系列笔记|附扫描手写笔记 1.0开篇-数据结构在学什么?
  • 数据结构第2章 (竟成)
  • Java基础 Day20
  • 【爬虫学习】Python数据采集进阶:从请求优化到解析技术实战
  • 二叉树--OJ2
  • 【数据结构】线性表之“双链表(带头循环双向链表)”
  • 这个方法关闭PowerBI账户的安全默认值
  • 【Android】基于SurfaceControlViewHost实现跨进程渲染
  • IEEE链接Overleaf
  • 网站内套网站代码/企业网站制作方案
  • 商务网站建设与维护流程/永久免费crm客户管理系统
  • 做游戏视频网站用什么程序好/网站推广的100种方法
  • 专门做运动鞋的网站/宁波seo网站
  • 介绍营销的网站/今日最火的新闻
  • discuz 门户网站模板/网站制作费用多少