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

相关推荐
DFT计算杂谈9 分钟前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
子兮曰12 分钟前
深入 Superpowers:180k Stars 的开源 AI 编程方法论是如何工作的
前端·javascript·后端
沸点小助手25 分钟前
「新晋AI顶流PK:GPT-5.5 vs DeepSeek V4&掘友吐槽小会」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能
隔壁的大叔33 分钟前
Markdown 渲染如何穿插自定义组件
前端·javascript·vue.js
Rik40 分钟前
用 AI Skill 封装你的工作流:从代码规范到全流程提效实战
前端·后端
Dabei44 分钟前
Android TV 焦点处理详解:遥控器与空鼠
android·前端
后端漫漫1 小时前
Redis 客户端工具体系
数据库·redis·缓存
愚者Pro1 小时前
Flutter基础学习
前端·javascript·vue.js
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_17:媒体与 Web Audio API 自动播放指南——策略、检测与最佳实践
前端·笔记·ui·html·音视频·媒体
canonical_entropy1 小时前
Nop Chaos Flux:百度AMIS之后的下一代低代码渲染引擎
前端·低代码·ai编程