Featured image of post Web开发-JWT令牌技术

Web开发-JWT令牌技术

1074字

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安全性的基石!

如对内容有异议,请联系关邮箱2285786274@qq.com修改