
文章目录
- JWT 认证流程详解
-
- 一、JWT 是什么?
- 二、完整认证流程
-
- 阶段一:登录 & 颁发 Token
- 阶段二:携带 Token 请求受保护资源
- 阶段三:Token 过期 & 无感刷新
- 三、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
阶段二:携带 Token 请求受保护资源
这正是 JWT 无状态的核心优势——服务端不需要存储 Session,天然支持水平扩展。
阶段三:Token 过期 & 无感刷新
Access Token 一般设置较短的有效期(15 分钟 ~ 1 小时),搭配有效期更长的 Refresh Token 使用:
三、JWT vs 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)
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 认证的完整闭环。

