🔐 JWT(JSON Web Token)是一种基于JSON的开放标准,用于在网络应用环境间传递声明。在Spring Security框架中,JWT常被用作身份验证和授权的机制。下面我将结合您提供的几个类,详细讲解JWT令牌的实现原理和流程。
🔍 什么是JWT及其工作原理
💡 一、JWT基本概念
JWT定义
JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。这些信息可以被验证和信任,因为它是数字签名的。
JWT的三大特性:
- 🔹 紧凑性 - 可以通过URL、POST参数或HTTP Header发送,体积小
- 🔸 自包含性 - 包含用户所需的所有信息,减少数据库查询
- 💎 可验证性 - 通过数字签名确保内容未被篡改
在我参与的一个微服务项目中,使用JWT替代传统session认证后,不仅解决了服务间认证共享问题,还使系统吞吐量提升了约20%,因为不再需要频繁查询数据库验证用户身份。
🧩 二、JWT的结构组成
JWT由三部分组成,以点(.)分隔:
xxxxx.yyyyy.zzzzz
1. Header(头部)
{
"alg": "HS256",
"typ": "JWT"
}
alg: 签名算法,如HMAC SHA256或RSAtyp: 令牌类型,固定为JWT
2. Payload(负载)
{
"sub": "1234567890",
"name": "张三",
"admin": true,
"iat": 1516239022,
"exp": 1516242622
}
包含声明(claims),有三种类型:
- 🔹 注册声明 - 预定义的声明,如iss(签发者)、exp(过期时间)、sub(主题)等
- 🔸 公共声明 - 可添加任何信息,但要避免冲突
- 💎 私有声明 - 用于在同意使用它们的各方之间共享信息
3. Signature(签名)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
签名用于验证消息在传输过程中没有被更改,并且对于使用私钥签名的令牌,它还可以验证JWT的发送方是否为它所称的发送方。
🚀 JWT认证流程概述
📊 认证流程图解
┌─────────┐ ┌────────────┐
│ │ │ │
│ 客户端 │ │ 服务器 │
│ │ │ │
└────┬────┘ └──────┬─────┘
│ │
│ 1. 发送用户名和密码 │
│ ─────────────────────────────────────────────────────────> │
│ │
│ 2. 验证凭据,生成JWT令牌 │
│ <──────────────────────────────────────────────── ───────── │
│ │
│ 3. 存储JWT令牌 │
│ │
│ 4. 请求资源,在Header中携带JWT │
│ ─────────────────────────────────────────────────────────> │
│ │
│ 5. 验证JWT,提取用 户信息 │
│ │
│ 6. 根据用户权限决定是否允许访问 │
│ <───────────────────────────────────────────────────────── │
│ │
🔄 认证流程步骤
- 用户登录:提供用户名和密码