JWT 认证系统全流程细粒度拆解

目录

[一、JWT 核心概述](#一、JWT 核心概述)

[(1)什么是 JWT](#(1)什么是 JWT)

(2)应用场景

[(3)传统单体 Session 认证 VS 分布式 JWT 认证](#(3)传统单体 Session 认证 VS 分布式 JWT 认证)

[传统 Session 单机架构图](#传统 Session 单机架构图)

[Session 集群共享架构图](#Session 集群共享架构图)

[二、JWT 结构细粒度拆解(三段式)](#二、JWT 结构细粒度拆解(三段式))

[Header 头部(第一部分)](#Header 头部(第一部分))

[Payload 载荷(第二部分,核心)](#Payload 载荷(第二部分,核心))

[Signature 签名(第三部分,安全核心)](#Signature 签名(第三部分,安全核心))

[JWT 内部结构可视化架构图](#JWT 内部结构可视化架构图)

[三、JWT 认证系统完整执行流程](#三、JWT 认证系统完整执行流程)

整体流程角色

完整细粒度执行流程

1、用户发起登录请求

2、后端接收参数,数据库校验身份

[3、身份校验通过,组装 JWT 载荷数据](#3、身份校验通过,组装 JWT 载荷数据)

[4、后端生成标准 JWT 令牌](#4、后端生成标准 JWT 令牌)

[5、服务端返回 JWT 令牌给客户端](#5、服务端返回 JWT 令牌给客户端)

[6、客户端本地存储 JWT 令牌](#6、客户端本地存储 JWT 令牌)

[7、客户端携带 Token 请求受保护接口](#7、客户端携带 Token 请求受保护接口)

[8、全局拦截器 / 过滤器拦截请求](#8、全局拦截器 / 过滤器拦截请求)

[9、服务端 JWT 验签 + 合法性校验(核心鉴权)](#9、服务端 JWT 验签 + 合法性校验(核心鉴权))

10、鉴权通过,放行执行业务逻辑

令牌过期续期流程(细粒度)

主动登出流程

[四、JWT 认证系统流程图](#四、JWT 认证系统流程图)

小部分架构详解

[前后端分离 JWT 整体部署架构图](#前后端分离 JWT 整体部署架构图)

[单点登录 SSO-JWT 架构流程图](#单点登录 SSO-JWT 架构流程图)

[JWT 完整生命周期架构图](#JWT 完整生命周期架构图)

[双 Token 无感续期架构图](#双 Token 无感续期架构图)

[JWT 拦截器执行层级架构](#JWT 拦截器执行层级架构)

[五、JWT 优缺点细粒度总结](#五、JWT 优缺点细粒度总结)

[六、企业级 JWT 最佳实践](#六、企业级 JWT 最佳实践)

结后语


一、JWT 核心概述

(1)什么是 JWT

JWT :全称 JSON Web Token,JSON 格式网络令牌,是一种轻量级、无状态的身份认证凭证。

  • 作用:替代传统 Session 实现用户登录认证、接口权限鉴权
  • 优势:无需服务端存储会话数据,天然适配分布式、微服务、前后端分离项目
  • 传输形式:字符串,可放在Header、URL、Cookie中传输

(2)应用场景

  1. 移动端 APP 登录认证
  2. 小程序 / H5 网页免密登录
  3. 微服务跨服务身份传递
  4. 第三方授权登录、单点登录 SSO
  5. 接口开放平台权限校验

(3)传统单体 Session 认证 VS 分布式 JWT 认证

对比维度 传统 Session 认证 JWT 令牌认证
存储位置 服务端内存 / Redis 存储会话 令牌存客户端,服务端不存会话
状态 有状态认证 无状态认证
集群部署 需 Session 共享、黏包、Redis 同步 无需共享,任意服务均可鉴权
跨域 / 移动端 兼容性差,Cookie 限制多 无 Cookie 限制,移动端友好
性能开销 服务端压力大 服务端仅校验签名,压力极小
失效控制 服务端主动销毁简单 只能等过期,需黑名单兜底
传输大小 体积小 携带用户信息,体积偏大

核心结论单体小项目用 Session,分布式、前后端分离、高并发项目统一用 JWT

传统 Session 单机架构图

bash 复制代码
客户端浏览器
      ↓
     Nginx
      ↓
  单体Web服务器
(存储Session会话)
      ↓
    数据库

Session 集群共享架构图

bash 复制代码
客户端 → Nginx负载均衡
          ↙     ↘
    服务节点1   服务节点2
          ↘     ↙
        Redis共享Session池
              ↓
            数据库

二、JWT 结构细粒度拆解(三段式)

标准 JWT 由Header.Payload.Signature 三部分组成,.分割

Header 头部(第一部分)

  • 存储信息:加密算法、令牌类型
  • 字段:alg加密算法、typ=JWT
  • 作用:告诉服务端用什么算法验签
  • 编码格式:Base64Url 编码

Payload 载荷(第二部分,核心)

存放用户核心信息,分为标准声明 + 自定义声明

  1. 标准内置字段
    • iss:签发人
    • exp:过期时间戳(必用)
    • sub:主题 / 用户 ID
    • aud:接收方
    • iat:签发时间
  2. 自定义业务字段(业务常用)
    • userId、username、role 角色、权限标识、部门 ID
  • 注意:Payload 仅编码不加密,严禁存放密码、敏感隐私数据

Signature 签名(第三部分,安全核心)

生成规则Header+Payload+秘钥 经过加密算法加密生成

  • 作用:防止令牌被篡改
  • 原理:客户端无法拿到服务端秘钥,无法伪造、修改载荷信息
  • 常用算法:HS256(对称加密,项目最常用)、RS256非对称加密

完整拼接规则:

sql 复制代码
Base64(Header) + . + Base64(Payload) + . + 加密签名

JWT 内部结构可视化架构图

bash 复制代码
JWT完整Token = 头部.载荷.签名
├─ Header 头部(Base64编码)
│  ├─ alg:加密算法
│  └─ typ:令牌类型JWT
├─ Payload 载荷(Base64编码)
│  ├─ 系统默认字段
│  └─ 自定义业务用户字段
└─ Signature 签名(加密密文)
   └─ 头部+载荷+服务端秘钥加密生成

三、JWT 认证系统完整执行流程

整体流程角色

  • 客户端:浏览器 / APP / 小程序
  • 认证服务:登录签发 JWT 服务
  • 业务服务:需要鉴权的接口服务
  • 数据库:存储用户账号密码

完整细粒度执行流程

1、用户发起登录请求

客户端输入账号 + 密码 ,调用后端/login登录接口,明文提交登录参数

2、后端接收参数,数据库校验身份

  1. 后端接口接收用户名、密码
  2. 查询数据库获取用户加密密码
  3. 密码比对(MD5/SHA256/Bcrypt 校验)
  4. 校验失败:直接返回登录失败、账号错误、密码错误

3、身份校验通过,组装 JWT 载荷数据

登录成功后,后端封装用户非敏感信息:

用户 ID、账号、昵称、角色权限、过期时间等,存入 Payload

4、后端生成标准 JWT 令牌

  1. 构建 Header 头部,指定加密算法
  2. 组装业务 Payload 用户数据
  3. 使用服务端固定秘钥生成签名 Signature
  4. 拼接三段字符串,生成完整 JWT Token

5、服务端返回 JWT 令牌给客户端

登录接口响应结果:

python 复制代码
{
  "code":200,
  "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expireTime":7200
}

6、客户端本地存储 JWT 令牌

客户端三种存储方式:

  1. 前端 Vue/React:存入localStorage / sessionStorage
  2. 移动端 APP:存入本地缓存
  3. 后端跨服务:存入请求上下文 禁止明文篡改 Token

7、客户端携带 Token 请求受保护接口

后续所有需要登录的业务接口,请求头自动携带 Token 标准请求头:

sql 复制代码
Authorization: Bearer 你的JWT令牌

8、全局拦截器 / 过滤器拦截请求

后端统一拦截所有接口请求,执行前置鉴权:

  1. 判断请求头是否携带 Token
  2. 无 Token → 直接拦截,返回401 未登录
  3. 有 Token → 进入验签流程

9、服务端 JWT 验签 + 合法性校验(核心鉴权)

细粒度三层校验:

  1. 格式校验:判断是否为标准三段式 JWT
  2. 签名校验 :使用服务端秘钥验证签名是否合法
    • 签名失败 = 令牌篡改 / 伪造 → 403 非法令牌
  3. 时效校验 :对比当前时间与 Token 过期时间 exp
    • 已过期 → 返回令牌过期,引导重新登录
  4. 业务权限校验:解析 Payload 获取用户角色、权限,判断是否可访问当前接口

10、鉴权通过,放行执行业务逻辑

  1. 校验全部通过,从 Token 中解析出用户信息存入当前请求上下文
  2. 执行正常业务代码、数据库操作
  3. 接口处理完成,正常返回业务数据给客户端
令牌过期续期流程(细粒度)
  1. AccessToken 短期有效(2 小时),RefreshToken 长期有效(7 天)
  2. 前端请求接口返回令牌过期
  3. 客户端携带 RefreshToken 调用刷新令牌接口
  4. 后端校验刷新令牌合法性
  5. 重新生成新 AccessToken 返回客户端,无感续期
  6. 用户无需重新登录
主动登出流程
  1. 用户点击退出登录
  2. 客户端清空本地存储的 JWT 令牌
  3. 后端将当前 Token 加入Redis 黑名单
  4. 后续拦截器校验黑名单,拒绝已登出令牌访问

四、JWT 认证系统流程图

小部分架构详解

前后端分离 JWT 整体部署架构图

bash 复制代码
前端项目(H5/APP/小程序)
      ↓↑
     Nginx反向代理
      ↓↑
┌─────────────────────┐
│   后端微服务集群     │
│ 登录认证服务  订单服务 │
│ 商品服务      用户服务 │
└─────────────────────┘
      ↓↑
    Redis缓存
(存放Token黑名单、刷新令牌)
      ↓↑
     业务数据库

单点登录 SSO-JWT 架构流程图

bash 复制代码
统一认证中心SSO
    ↓签发JWT
站点1 ←→ 站点2 ←→ 站点3
所有站点共用一套JWT令牌,实现一次登录全平台通行

JWT 完整生命周期架构图

bash 复制代码
令牌创建(登录)→令牌分发(客户端存储)→令牌携带请求→
令牌验签校验→正常业务访问→令牌过期/主动登出→
加入黑名单失效→令牌彻底作废

双 Token 无感续期架构图

bash 复制代码
AccessToken(短时效) → 接口正常鉴权
        ↓过期
客户端携带RefreshToken
        ↓
刷新令牌接口校验
        ↓
生成全新AccessToken下发
        ↓
前端无感知替换新令牌

JWT 拦截器执行层级架构

bash 复制代码
客户端请求
    ↓
跨域过滤器
    ↓
JWT身份认证拦截器
    ↓
权限角色拦截器
    ↓
接口控制器

五、JWT 优缺点细粒度总结

优点

  1. 无状态:服务端不存储登录信息,扩容集群无压力
  2. 跨域友好:不依赖 Cookie,完美适配前后端分离
  3. 分布式友好:微服务任意节点均可独立鉴权
  4. 减少数据库查询:登录后无需频繁查库拿用户信息
  5. 轻量化:鉴权逻辑简单,开发成本低

缺点

  1. 令牌一旦签发,无法中途作废,只能等过期,登出需黑名单
  2. Token 无法存储大量数据,过长影响请求性能
  3. 秘钥泄露会导致全线令牌伪造,安全风险高
  4. 刷新令牌逻辑增加开发复杂度
  5. Payload 明文可解析,不能存敏感数据

六、企业级 JWT 最佳实践

  1. 统一使用HS256对称加密,秘钥长度足够长,严禁硬编码写死
  2. AccessToken 设置短有效期,配合 RefreshToken 无感续期
  3. 登录成功后密码绝对不存入 JWT 载荷
  4. 后端统一封装 JWT 工具类,统一签发、统一解析、统一验签
  5. 全局异常捕获 JWT 解析异常、过期异常、篡改异常
  6. 高并发系统使用 Redis 存储过期黑名单,实现主动失效
  7. 接口权限基于 JWT 内角色字段做接口路由拦截
  8. 内网服务可简化配置,对外公开接口加强秘钥防护

结后语

  • JWT 认证是目前前后端分离、分布式系统主流标准认证方案 ,核心精髓就是服务端无状态、客户端存凭证、签名防篡改
  • 掌握从登录签发→携带请求→拦截验签→权限放行全链路细粒度流程,即可完成项目整套登录认证体系开发,同时区分清 Session 与 JWT 适用场景,在实际项目中合理选型。
相关推荐
m0_7381207221 小时前
渗透测试基础知识——从零认识JWT(JSON Web Token)身份令牌
服务器·前端·安全·web安全·网络安全·json
_xaboy21 小时前
开源Vue组件FormCreate通过 JSON 生成AntdvNext表单
vue.js·开源·json
Wang15302 天前
js核心概念
json
逍遥德2 天前
Java编程高频的“踩坑点”-01:fastjson.JSON 转换时泛型擦除问题
java·spring boot·spring·系统架构·json
Roselind_Yi2 天前
【快速熟悉容器】企业 Docker 从 0 到落地全流程(分角色版)
java·运维·redis·docker·容器·json·改行学it
sa100273 天前
京东评论 API 实战:JSON 数据结构、字段含义与解析技巧
前端·数据结构·json
查拉图斯特拉面条3 天前
JMeter 实战技巧:JSON 数组筛选指定对象并剔除首尾大括号
jmeter·json
霸道流氓气质3 天前
Spring AI 结构化输出 Agent 实战:让大模型返回精准 JSON
人工智能·spring·json
查拉图斯特拉面条3 天前
JMeter 实战:JSON 响应中文节点 + 数值精准断言(附真实接口案例)
jmeter·json