欢迎光临
我们一直在努力

JWT认证流程(JSON Web Token)

在这里插入图片描述

文章目录

  • 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

  • 用户提交用户名 + 密码,发送 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 对比

    维度JWTSession
    存储位置 客户端 服务端(内存/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 认证的完整闭环。

    赞(0)
    未经允许不得转载:171主机测评 » JWT认证流程(JSON Web Token)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址