在 Java 项目(比如 Spring Boot + Vue)中使用 JWT(JSON Web Token),本质是用一种“无状态的身份认证机制”来替代传统的 Session 登录。
一、JWT 的好处(为什么越来越多人用)
1️⃣ 无状态(核心优势)
传统登录:
用户登录 → 服务端存 Session → Redis / 内存保存
每次请求都要查 Session
JWT:
登录成功 → 服务端直接返回一个 token
后续请求 → 客户端带 token,服务端不存任何登录状态
👉 好处:
不用 Redis 存 Session
服务可以随便扩容(天然支持分布式)
2️⃣ 天然适合前后端分离(你现在用 Vue3 就很适合)
流程非常简单:
前端(Vue)
↓ 登录
后端(SpringBoot)→ 返回 JWT
↓
前端存 token(localStorage)
↓
每次请求带 token(Authorization)
👉 好处:
不依赖 Cookie(避免跨域问题)
前端控制更灵活
3️⃣ 跨服务 / 微服务支持很好
在微服务架构中:
A 服务发 token
B / C / D 服务都能验证
👉 不需要共享 Session
4️⃣ 性能更高(减少 IO)
传统:
每次请求查 Redis / DB
JWT:
只做一次 签名校验(内存计算)
👉 CPU 换 IO,通常更快
5️⃣ 安全性可控(可扩展)
JWT 可以:
设置过期时间(exp)
加自定义信息(用户ID、角色)
二、JWT 的原理(重点)
JWT 本质就是一个字符串:
xxxxx.yyyyy.zzzzz
分为三部分:
1️⃣ Header(头部)
说明:
类型(JWT)
签名算法(如 HS256)
示例:
{
"alg": "HS256",
"typ": "JWT"
}
2️⃣ Payload(载荷)
存放用户信息(但不是加密的!只是 Base64 编码)
{
"userId": 1001,
"username": "yang",
"exp": 1710000000
}
👉 注意:
不要放密码!
任何人都能解码看到
3️⃣ Signature(签名)
核心安全点:
签名 = HMACSHA256(
base64(header) + "." + base64(payload),
secret
)
👉 用服务端的 secret密钥生成
三、完整认证流程(你要重点理解)
登录时:
1. 用户输入账号密码
2. 后端校验成功
3. 生成 JWT(包含 userId)
4. 返回给前端
请求时:
前端请求:
Authorization: Bearer xxx.jwt.token
后端处理:
1. 拿到 token
2. 校验签名(防篡改)
3. 校验过期时间
4. 解析 userId
5. 放行请求
四、JWT vs Session
五、JWT 的缺点
❗1. 无法主动失效(最大问题)
token 一旦发出去
服务端没法“立刻让它失效”
👉 解决:
短有效期 + 刷新 token
或维护黑名单(Redis)
❗2. token 被盗 = 直接登录
👉 所以必须:
HTTPS
不存敏感信息
设置过期时间
❗3. token 体积较大
比 sessionId 大很多
❗4. 登录状态下失效
token如果过期,即使在已登录状态下,也有可能失效,业内做法是双token,1个短期token(30分钟),1个长期刷新token(7天)。
流程如下:
登录
↓
accessToken + refreshToken
↓
请求接口
↓
accessToken过期 ❗
↓
用refreshToken换新token
↓
继续访问
六、总结一句话(你可以记住这个)
👉 JWT 本质是:
用“签名”替代“存储”,实现无状态登录
七、结合你当前技术栈(重点建议)
你是:
Java(SpringBoot 2.7.6)
Vue3
👉 最推荐方案:
JWT + Spring Security + Redis(可选)
结构:
JWT:认证
Redis:黑名单 / 刷新token
Spring Security:拦截器