目录
[一、JWT 核心概述](#一、JWT 核心概述)
[(1)什么是 JWT](#(1)什么是 JWT)
[(3)传统单体 Session 认证 VS 分布式 JWT 认证](#(3)传统单体 Session 认证 VS 分布式 JWT 认证)
[传统 Session 单机架构图](#传统 Session 单机架构图)
[Session 集群共享架构图](#Session 集群共享架构图)
[二、JWT 结构细粒度拆解(三段式)](#二、JWT 结构细粒度拆解(三段式))
[Header 头部(第一部分)](#Header 头部(第一部分))
[Payload 载荷(第二部分,核心)](#Payload 载荷(第二部分,核心))
[Signature 签名(第三部分,安全核心)](#Signature 签名(第三部分,安全核心))
[JWT 内部结构可视化架构图](#JWT 内部结构可视化架构图)
[三、JWT 认证系统完整执行流程](#三、JWT 认证系统完整执行流程)
[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 验签 + 合法性校验(核心鉴权))
[四、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)应用场景
- 移动端 APP 登录认证
- 小程序 / H5 网页免密登录
- 微服务跨服务身份传递
- 第三方授权登录、单点登录 SSO
- 接口开放平台权限校验
(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 载荷(第二部分,核心)
存放用户核心信息,分为标准声明 + 自定义声明
- 标准内置字段
iss:签发人exp:过期时间戳(必用)sub:主题 / 用户 IDaud:接收方iat:签发时间- 自定义业务字段(业务常用)
- userId、username、role 角色、权限标识、部门 ID
- 注意:Payload 仅编码不加密,严禁存放密码、敏感隐私数据
Signature 签名(第三部分,安全核心)
生成规则 :
Header+Payload+秘钥经过加密算法加密生成
- 作用:防止令牌被篡改
- 原理:客户端无法拿到服务端秘钥,无法伪造、修改载荷信息
- 常用算法:
HS256(对称加密,项目最常用)、RS256非对称加密完整拼接规则:
sqlBase64(Header) + . + Base64(Payload) + . + 加密签名
JWT 内部结构可视化架构图
bashJWT完整Token = 头部.载荷.签名 ├─ Header 头部(Base64编码) │ ├─ alg:加密算法 │ └─ typ:令牌类型JWT ├─ Payload 载荷(Base64编码) │ ├─ 系统默认字段 │ └─ 自定义业务用户字段 └─ Signature 签名(加密密文) └─ 头部+载荷+服务端秘钥加密生成
三、JWT 认证系统完整执行流程
整体流程角色
- 客户端:浏览器 / APP / 小程序
- 认证服务:登录签发 JWT 服务
- 业务服务:需要鉴权的接口服务
- 数据库:存储用户账号密码
完整细粒度执行流程
1、用户发起登录请求
客户端输入账号 + 密码 ,调用后端
/login登录接口,明文提交登录参数2、后端接收参数,数据库校验身份
- 后端接口接收用户名、密码
- 查询数据库获取用户加密密码
- 密码比对(MD5/SHA256/Bcrypt 校验)
- 校验失败:直接返回登录失败、账号错误、密码错误
3、身份校验通过,组装 JWT 载荷数据
登录成功后,后端封装用户非敏感信息:
用户 ID、账号、昵称、角色权限、过期时间等,存入 Payload
4、后端生成标准 JWT 令牌
- 构建 Header 头部,指定加密算法
- 组装业务 Payload 用户数据
- 使用服务端固定秘钥生成签名 Signature
- 拼接三段字符串,生成完整 JWT Token
5、服务端返回 JWT 令牌给客户端
登录接口响应结果:
python{ "code":200, "token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expireTime":7200 }
6、客户端本地存储 JWT 令牌
客户端三种存储方式:
- 前端 Vue/React:存入
localStorage / sessionStorage- 移动端 APP:存入本地缓存
- 后端跨服务:存入请求上下文 禁止明文篡改 Token
7、客户端携带 Token 请求受保护接口
后续所有需要登录的业务接口,请求头自动携带 Token 标准请求头:
sqlAuthorization: Bearer 你的JWT令牌8、全局拦截器 / 过滤器拦截请求
后端统一拦截所有接口请求,执行前置鉴权:
- 判断请求头是否携带 Token
- 无 Token → 直接拦截,返回401 未登录
- 有 Token → 进入验签流程
9、服务端 JWT 验签 + 合法性校验(核心鉴权)
细粒度三层校验:
- 格式校验:判断是否为标准三段式 JWT
- 签名校验 :使用服务端秘钥验证签名是否合法
- 签名失败 = 令牌篡改 / 伪造 → 403 非法令牌
- 时效校验 :对比当前时间与 Token 过期时间 exp
- 已过期 → 返回令牌过期,引导重新登录
- 业务权限校验:解析 Payload 获取用户角色、权限,判断是否可访问当前接口
10、鉴权通过,放行执行业务逻辑
- 校验全部通过,从 Token 中解析出用户信息存入当前请求上下文
- 执行正常业务代码、数据库操作
- 接口处理完成,正常返回业务数据给客户端
令牌过期续期流程(细粒度)
- AccessToken 短期有效(2 小时),RefreshToken 长期有效(7 天)
- 前端请求接口返回令牌过期
- 客户端携带 RefreshToken 调用刷新令牌接口
- 后端校验刷新令牌合法性
- 重新生成新 AccessToken 返回客户端,无感续期
- 用户无需重新登录
主动登出流程
- 用户点击退出登录
- 客户端清空本地存储的 JWT 令牌
- 后端将当前 Token 加入Redis 黑名单
- 后续拦截器校验黑名单,拒绝已登出令牌访问
四、JWT 认证系统流程图
小部分架构详解
前后端分离 JWT 整体部署架构图
bash前端项目(H5/APP/小程序) ↓↑ Nginx反向代理 ↓↑ ┌─────────────────────┐ │ 后端微服务集群 │ │ 登录认证服务 订单服务 │ │ 商品服务 用户服务 │ └─────────────────────┘ ↓↑ Redis缓存 (存放Token黑名单、刷新令牌) ↓↑ 业务数据库单点登录 SSO-JWT 架构流程图
bash统一认证中心SSO ↓签发JWT 站点1 ←→ 站点2 ←→ 站点3 所有站点共用一套JWT令牌,实现一次登录全平台通行JWT 完整生命周期架构图
bash令牌创建(登录)→令牌分发(客户端存储)→令牌携带请求→ 令牌验签校验→正常业务访问→令牌过期/主动登出→ 加入黑名单失效→令牌彻底作废双 Token 无感续期架构图
bashAccessToken(短时效) → 接口正常鉴权 ↓过期 客户端携带RefreshToken ↓ 刷新令牌接口校验 ↓ 生成全新AccessToken下发 ↓ 前端无感知替换新令牌JWT 拦截器执行层级架构
bash客户端请求 ↓ 跨域过滤器 ↓ JWT身份认证拦截器 ↓ 权限角色拦截器 ↓ 接口控制器
五、JWT 优缺点细粒度总结
优点
- 无状态:服务端不存储登录信息,扩容集群无压力
- 跨域友好:不依赖 Cookie,完美适配前后端分离
- 分布式友好:微服务任意节点均可独立鉴权
- 减少数据库查询:登录后无需频繁查库拿用户信息
- 轻量化:鉴权逻辑简单,开发成本低
缺点
- 令牌一旦签发,无法中途作废,只能等过期,登出需黑名单
- Token 无法存储大量数据,过长影响请求性能
- 秘钥泄露会导致全线令牌伪造,安全风险高
- 刷新令牌逻辑增加开发复杂度
- Payload 明文可解析,不能存敏感数据
六、企业级 JWT 最佳实践
- 统一使用
HS256对称加密,秘钥长度足够长,严禁硬编码写死- AccessToken 设置短有效期,配合 RefreshToken 无感续期
- 登录成功后密码绝对不存入 JWT 载荷
- 后端统一封装 JWT 工具类,统一签发、统一解析、统一验签
- 全局异常捕获 JWT 解析异常、过期异常、篡改异常
- 高并发系统使用 Redis 存储过期黑名单,实现主动失效
- 接口权限基于 JWT 内角色字段做接口路由拦截
- 内网服务可简化配置,对外公开接口加强秘钥防护
结后语
- JWT 认证是目前前后端分离、分布式系统主流标准认证方案 ,核心精髓就是服务端无状态、客户端存凭证、签名防篡改。
- 掌握从登录签发→携带请求→拦截验签→权限放行全链路细粒度流程,即可完成项目整套登录认证体系开发,同时区分清 Session 与 JWT 适用场景,在实际项目中合理选型。
