JWT令牌技术学习笔记

一、令牌技术概述

1. 令牌本质

  • 本质:令牌是用户身份的标识,实质是一个字符串
  • 作用:用于会话跟踪,作为用户合法身份凭证

2. 工作流程

  1. 登录阶段
    ✅ 登录成功 → 生成令牌 → 返回给前端
  2. 存储阶段
    📦 前端存储令牌(Cookie/LocalStorage)
  3. 请求阶段
    🔄 每次请求携带令牌 → 服务端校验有效性

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. 生成与校验流程

image.png

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. 安全注意事项

  1. 签名密钥:必须与生成时一致
  2. 篡改检测:任何字符修改都会导致校验失败
  3. 过期控制:通过setExpiration设置有效期
    1
    .setExpiration(new Date(System.currentTimeMillis() + 60 * 1000)) // 60秒过期

四、企业应用场景

🌟 典型登录认证流程

  1. 用户登录 → 服务端生成JWT → 返回前端
  2. 前端存储JWT(LocalStorage)
  3. 每次请求携带JWT(Authorization头)
  4. 服务端拦截校验:
    • 无令牌 → 拒绝访问 ❌
    • 无效令牌 → 拒绝访问 ❌
    • 有效令牌 → 放行 ✅

📊 传统方案 vs JWT方案

方案 跨端支持 集群适配 服务端压力 实现复杂度
Cookie 有限 不友好
Session 有限 不友好
JWT ✅ 强 ✅ 强 需自主实现

🚀 现代开发首选:JWT已成为主流会话跟踪方案


五、重点总结

  1. JWT三大优势
    ✔️ 跨平台 ✔️ 无状态 ✔️ 自包含数据
  2. 安全核心
    🔐 签名机制确保不可篡改
  3. 开发关键
    • 令牌生成时设置合理有效期
    • 前端需妥善存储(防XSS攻击)
    • 服务端统一拦截校验
  4. 调试工具
    🔍 使用jwt.io解码验证令牌

📌 黄金法则:任何令牌修改都会导致校验失败,这是JWT安全性的基石!