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

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


二、完整认证流程

阶段一:登录 & 颁发 Token

  1. 用户提交用户名 + 密码,发送 POST /login
  2. 认证服务查询数据库,校验密码哈希(bcrypt / Argon2)
  3. 验证通过后,服务端用私钥或密钥签名生成 JWT
  4. 将 JWT 返回给客户端,客户端存入 localStorage 或 HttpOnly 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 认证的完整闭环。

相关推荐
AIgorithmGEEK6 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Java后端的Ai之路8 小时前
06-React-Props
前端·react.js·前端框架
Flynt8 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
唠点键盘之外的8 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨8 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
Csvn9 小时前
渲染管线
前端
ly76899 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
程序员大阳9 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
豆角焖肉9 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
志尊宝9 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js