JWT令牌技术学习笔记
一、令牌技术概述
1. 令牌本质
- 本质:令牌是用户身份的标识,实质是一个字符串
- 作用:用于会话跟踪,作为用户合法身份凭证
2. 工作流程
- 登录阶段
✅ 登录成功 → 生成令牌 → 返回给前端
- 存储阶段
📦 前端存储令牌(Cookie/LocalStorage)
- 请求阶段
🔄 每次请求携带令牌 → 服务端校验有效性
3. 核心特点
优点
- 支持PC/移动端
- 解决集群认证问题
- 无服务端存储压力
缺点
二、JWT令牌详解
1. JWT核心概念
全称:JSON Web Token
官网:https://jwt.io/
三大特性:
- 🎯 简洁:简单字符串,可直接通过请求头/参数传递
- 📦 自包含:可存储自定义数据(如用户信息)
- 🔒 安全:基于数字签名防篡改
2. JWT组成结构
部分 |
名称 |
内容示例 |
作用 |
Header |
头 |
{"alg":"HS256","type":"JWT"} |
声明算法和令牌类型 |
Payload |
有效载荷 |
{"id":"1","username":"Tom"} |
携带自定义/默认信息 |
Signature |
签名 |
对Header+Payload的加密签名 |
防篡改保安全 |
✨ 三部分用.
连接:Header.Payload.Signature
3. Base64编码
- 作用:将JSON数据转为字符串
- 特点:
- 使用64个可打印字符(A-Z, a-z, 0-9, +, /)
=
为补位符号
- ❗ 注意:是编码方式而非加密!
三、JWT实战开发
1. 生成与校验流程

2. 代码实现
🔧 依赖引入
1
2
3
4
5
|
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
|
🛠️ 核心工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class JwtUtils {
private static String signKey = "SVRIRUlNQQ==";
private static Long expire = 43200000L;
// 生成令牌
public static String generateJwt(Map<String,Object> claims){
return Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
}
// 解析令牌
public static Claims parseJWT(String jwt){
return Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
}
}
|
🔑 登录成功生成令牌
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Override
public LoginInfo login(Emp emp) {
Emp empLogin = empMapper.getByUsernameAndPassword(emp);
if(empLogin != null){
Map<String,Object> claims = new HashMap<>();
claims.put("id", empLogin.getId());
claims.put("username", empLogin.getUsername());
String jwt = JwtUtils.generateJwt(claims); // 生成令牌
return new LoginInfo(..., jwt); // 返回给前端
}
return null;
}
|
3. 安全注意事项
- 签名密钥:必须与生成时一致
- 篡改检测:任何字符修改都会导致校验失败
- 过期控制:通过
setExpiration
设置有效期
1
|
.setExpiration(new Date(System.currentTimeMillis() + 60 * 1000)) // 60秒过期
|
四、企业应用场景
🌟 典型登录认证流程
- 用户登录 → 服务端生成JWT → 返回前端
- 前端存储JWT(LocalStorage)
- 每次请求携带JWT(Authorization头)
- 服务端拦截校验:
- 无令牌 → 拒绝访问 ❌
- 无效令牌 → 拒绝访问 ❌
- 有效令牌 → 放行 ✅
📊 传统方案 vs JWT方案
方案 |
跨端支持 |
集群适配 |
服务端压力 |
实现复杂度 |
Cookie |
有限 |
不友好 |
高 |
低 |
Session |
有限 |
不友好 |
高 |
中 |
JWT |
✅ 强 |
✅ 强 |
❗ 无 |
需自主实现 |
🚀 现代开发首选:JWT已成为主流会话跟踪方案
五、重点总结
- JWT三大优势:
✔️ 跨平台 ✔️ 无状态 ✔️ 自包含数据
- 安全核心:
🔐 签名机制确保不可篡改
- 开发关键:
- 令牌生成时设置合理有效期
- 前端需妥善存储(防XSS攻击)
- 服务端统一拦截校验
- 调试工具:
🔍 使用jwt.io解码验证令牌
📌 黄金法则:任何令牌修改都会导致校验失败,这是JWT安全性的基石!