
文章目录
- [JWT 认证流程详解](#JWT 认证流程详解)
-
- [一、JWT 是什么?](#一、JWT 是什么?)
- 二、完整认证流程
-
- [阶段一:登录 & 颁发 Token](#阶段一:登录 & 颁发 Token)
- [阶段二:携带 Token 请求受保护资源](#阶段二:携带 Token 请求受保护资源)
- [阶段三:Token 过期 & 无感刷新](#阶段三:Token 过期 & 无感刷新)
- [三、JWT vs Session 对比](#三、JWT vs Session 对比)
- 四、安全最佳实践
- 五、代码示例(Node.js)
- 总结
JWT 认证流程详解
JSON Web Token(JWT)是现代 Web 应用中最主流的无状态认证方案之一。本文从原理到实践,完整梳理 JWT 的认证流程。
一、JWT 是什么?
JWT 是一种开放标准(RFC 7519),用于在各方之间以 JSON 对象的形式安全地传输信息。它由三段 Base64URL 编码的字符串组成,用 . 分隔:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSJ9.SflKxwRJS
──────────────────── ───────────────────── ──────────
Header Payload Signature
- Header :声明算法类型,如
HS256、RS256 - Payload:携带声明(Claims),如用户 ID、角色、过期时间
- Signature:对前两段用密钥签名,防止篡改
Payload 是 Base64 编码,不加密,切勿存放密码等敏感数据。
二、完整认证流程
阶段一:登录 & 颁发 Token
- 用户提交用户名 + 密码,发送
POST /login - 认证服务查询数据库,校验密码哈希(bcrypt / Argon2)
- 验证通过后,服务端用私钥或密钥签名生成 JWT
- 将 JWT 返回给客户端,客户端存入
localStorage或HttpOnly Cookie
阶段二:携带 Token 请求受保护资源
-
每次请求在 HTTP Header 中携带 Token:
Authorization: Bearer <your_jwt_token> -
服务端 JWT 中间件提取 Token,本地验证签名 + 过期时间,无需查数据库
-
验证通过:解析 Payload 中的用户信息,传递给业务服务处理请求
-
验证失败:直接返回
401 Unauthorized
这正是 JWT 无状态的核心优势------服务端不需要存储 Session,天然支持水平扩展。
阶段三:Token 过期 & 无感刷新
Access Token 一般设置较短的有效期(15 分钟 ~ 1 小时),搭配有效期更长的 Refresh Token 使用:
- Access Token 过期,请求返回
401 - 客户端自动携带 Refresh Token 调用
POST /auth/refresh - 服务端验证 Refresh Token(通常需查数据库),颁发新的 Access Token
- 用户无感知,继续使用
三、JWT vs Session 对比
| 维度 | JWT | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务端(内存/Redis) |
| 可扩展性 | 天然支持分布式 | 需共享 Session 存储 |
| 主动吊销 | 困难(需黑名单) | 简单(删除 Session) |
| 网络开销 | Token 较大 | 仅传 Session ID |
| 适用场景 | 微服务、API、移动端 | 传统单体 Web 应用 |
四、安全最佳实践
存储 :优先使用 HttpOnly + Secure Cookie 存储 Token,防止 XSS 窃取;避免存入 localStorage(XSS 可直接读取)。
传输:始终使用 HTTPS,防止 Token 被中间人截获。
有效期:Access Token 设置短有效期(15~60 分钟),Refresh Token 可设 7~30 天但须持久化存储以支持吊销。
吊销 :JWT 本身无法主动吊销,可通过黑名单(Redis)或短有效期 + 刷新策略来规避风险。
算法:生产环境推荐使用非对称算法(RS256),私钥签名、公钥验证,更安全且支持多服务共享验证能力。
五、代码示例(Node.js)
javascript
import jwt from 'jsonwebtoken'
// 生成 Token
function signToken(userId) {
return jwt.sign(
{ sub: userId, iat: Date.now() },
process.env.JWT_SECRET,
{ expiresIn: '15m' }
)
}
// 验证中间件
function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(' ')[1]
if (!token) return res.status(401).json({ error: 'Missing token' })
try {
req.user = jwt.verify(token, process.env.JWT_SECRET)
next()
} catch {
res.status(401).json({ error: 'Invalid or expired token' })
}
}
总结
JWT 认证的核心思路是:将状态从服务端转移到客户端,通过数字签名保证不可伪造。它非常适合无状态 API、微服务架构和移动端应用。理解了登录颁发、请求验证、Token 刷新这三个阶段,就掌握了 JWT 认证的完整闭环。