JWT认证流程(JSON Web Token)

文章目录

  • [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 :声明算法类型,如 HS256RS256
  • Payload:携带声明(Claims),如用户 ID、角色、过期时间
  • Signature:对前两段用密钥签名,防止篡改

Payload 是 Base64 编码,不加密,切勿存放密码等敏感数据。


二、完整认证流程

阶段一:登录 & 颁发 Token

  1. 用户提交用户名 + 密码,发送 POST /login
  2. 认证服务查询数据库,校验密码哈希(bcrypt / Argon2)
  3. 验证通过后,服务端用私钥或密钥签名生成 JWT
  4. 将 JWT 返回给客户端,客户端存入 localStorageHttpOnly Cookie

阶段二:携带 Token 请求受保护资源

  1. 每次请求在 HTTP Header 中携带 Token:

    复制代码
    Authorization: Bearer <your_jwt_token>
  2. 服务端 JWT 中间件提取 Token,本地验证签名 + 过期时间,无需查数据库

  3. 验证通过:解析 Payload 中的用户信息,传递给业务服务处理请求

  4. 验证失败:直接返回 401 Unauthorized

这正是 JWT 无状态的核心优势------服务端不需要存储 Session,天然支持水平扩展。

阶段三:Token 过期 & 无感刷新

Access Token 一般设置较短的有效期(15 分钟 ~ 1 小时),搭配有效期更长的 Refresh Token 使用:

  1. Access Token 过期,请求返回 401
  2. 客户端自动携带 Refresh Token 调用 POST /auth/refresh
  3. 服务端验证 Refresh Token(通常需查数据库),颁发新的 Access Token
  4. 用户无感知,继续使用

三、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 认证的完整闭环。

相关推荐
Mike117.7 小时前
GBase 8a 日期边界写法和时间窗口取数偏差
数据库
余人于RenYu7 小时前
Claude + Figma MCP
前端·ui·ai·figma
SPC的存折8 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
杨艺韬10 小时前
vite内核解析-第2章 架构总览
前端·vite
我是伪码农11 小时前
外卖餐具智能推荐
linux·服务器·前端
2401_8858850411 小时前
营销推广短信接口集成:结合营销策略实现的API接口动态变量填充方案
前端·python
小李子呢021111 小时前
前端八股性能优化(2)---回流(重排)和重绘
前端·javascript
程序员buddha11 小时前
深入理解ES6 Promise
前端·ecmascript·es6
吴声子夜歌12 小时前
ES6——Module详解
前端·ecmascript·es6