蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
融合 AI、架构与工程实践,沉淀方法论,构建可持续的技术价值。
  1. 首页
  2. 研发说
  3. 正文

JWT 认证:从原理到前后端实战的最佳实践

2026年1月7日 81点热度 0人点赞 0条评论

在现代 Web 应用中,认证(Authentication) 是绕不开的话题。随着前后端分离、微服务、Serverless 的普及,传统的 Session 方案逐渐暴露出扩展性和跨域上的局限,JWT(JSON Web Token) 因此成为主流选择之一。

本文将从 JWT 是什么 → 如何工作 → 前后端如何落地 → 安全注意事项 → 最佳实践 五个层面,带你真正吃透 JWT。


一、JWT 是什么?解决了什么问题

JWT(JSON Web Token)是一种用于在各方之间安全传输信息的自包含令牌标准(RFC 7519)。

一句话概括:

JWT 是一个“服务器签名过的、客户端可以携带的身份凭证”

为什么需要 JWT?

传统 Session 模式的问题:

问题说明
服务端有状态Session 存在服务器内存 / Redis
扩展成本高多实例需 Session 共享
跨域不友好Cookie 限制多
移动端不自然App 没有 Cookie

JWT 的优势:

  • ✅ 无状态(服务端不存 Session)
  • ✅ 天然支持前后端分离
  • ✅ 适合微服务、网关统一鉴权
  • ✅ 移动端 / 小程序友好

二、JWT 的结构与工作原理

1️⃣ JWT 的三段式结构

JWT 本质是一个字符串,由三部分组成:

Header.Payload.Signature

Header(头部)

JSON
{
  "alg": "HS256",
  "typ": "JWT"
}

说明签名算法和类型。


Payload(载荷)

JSON
{
  "sub": "10001",
  "username": "admin",
  "exp": 1735689600,
  "iat": 1735686000
}

常见字段:

字段含义
sub用户唯一标识
iat签发时间
exp过期时间
iss签发者
aud接收方

⚠️ Payload 是 Base64 编码,不是加密,任何人都能解码查看


Signature(签名)

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

作用:

  • 防篡改
  • 验证 JWT 是否由可信服务器签发

2️⃣ JWT 的认证流程(核心)

用户登录
   ↓
服务端校验账号密码
   ↓
生成 JWT(签名)
   ↓
返回给客户端
   ↓
客户端存储 JWT
   ↓
后续请求携带 JWT
   ↓
服务端校验签名 & 有效期

三、前后端如何使用 JWT(实战流程)

1️⃣ 登录阶段(后端)

TypeScript
// 登录成功后生成 JWT
import jwt from 'jsonwebtoken'

function generateToken(user) {
  return jwt.sign(
    {
      sub: user.id,
      username: user.username,
    },
    process.env.JWT_SECRET,
    {
      expiresIn: '2h',
      issuer: 'api.example.com',
    }
  )
}

✅ 只放必要信息
❌ 不要放密码、手机号、权限全集


2️⃣ 客户端如何存 JWT?

存储方式是否推荐原因
localStorage❌容易被 XSS 读取
sessionStorage❌同样有 XSS 风险
Cookie(HttpOnly)✅无法被 JS 读取
内存(变量)✅刷新即失效

👉 推荐方案:HttpOnly + Secure Cookie


3️⃣ 请求时如何携带 JWT

标准做法:Authorization Header

HTTP
Authorization: Bearer <token>

前端示例:

TypeScript
fetch('/api/user', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
})

4️⃣ 服务端中间件校验 JWT

TypeScript
import jwt from 'jsonwebtoken'

function authMiddleware(req, res, next) {
  const auth = req.headers.authorization
  if (!auth) return res.status(401).end()

  const token = auth.replace('Bearer ', '')

  try {
    const payload = jwt.verify(token, process.env.JWT_SECRET)
    req.user = payload
    next()
  } catch {
    res.status(401).end()
  }
}

四、JWT 常见误区与安全风险

❌ 误区 1:JWT 是加密的

JWT 不是加密的,只是签名

任何人都可以解码 Payload。


❌ 误区 2:JWT 一旦签发就无法失效

JWT 无法主动失效,除非:

  • 等过期
  • 使用黑名单(Redis)
  • 使用短 Token + Refresh Token

❌ 误区 3:JWT 里放权限列表很方便

问题:

  • Token 体积变大
  • 权限变更无法即时生效

👉 建议只放 userId,权限实时查


🔥 主要安全风险

风险防御措施
XSSHttpOnly Cookie
CSRFSameSite + Token 校验
Token 泄露HTTPS + 短有效期
重放攻击jti + 黑名单

五、进阶方案:Access Token + Refresh Token

为什么需要 Refresh Token?

  • Access Token 过期时间短(如 15 分钟)
  • Refresh Token 生命周期长(如 7 天)
  • 提升安全性与用户体验

流程示意

登录 → Access Token + Refresh Token
Access Token 过期
   ↓
使用 Refresh Token 换新 Access Token

Refresh Token 的存储建议

  • 只存在服务端(数据库 / Redis)
  • 客户端只存一个标识或 HttpOnly Cookie

六、JWT 最佳实践总结(强烈建议)

✅ 设计层面

  • Token 尽量短
  • 只存必要信息
  • 明确过期时间

✅ 安全层面

  • 全站 HTTPS
  • HttpOnly + Secure Cookie
  • 使用 Refresh Token
  • 设置 aud / iss

✅ 架构层面

  • 网关统一鉴权
  • 微服务只信任网关
  • Token 黑名单兜底

七、JWT 是否适合你?

场景是否推荐 JWT
前后端分离✅
移动端 / 小程序✅
微服务架构✅
纯 SSR + Cookie❌

结语

JWT 并不是“银弹”,而是一把需要正确使用的利器。
真正安全、优雅的认证方案,永远是 机制 + 规范 + 约束 的组合。

如果你正在设计登录系统、统一鉴权方案,JWT + Refresh Token + HttpOnly Cookie,依然是当下最成熟可靠的选择之一。

标签: JSON Web Token JWT JWT Authentication 前后端分离认证
最后更新:2026年1月7日

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

最新 热点 随机
最新 热点 随机
前端开发 TanStack 化:从“框架思维”到“能力组合”的工程演进 Docker 进阶(七):容器化体系设计总结与生产落地经验复盘 Docker 进阶(六):生产环境中的 Docker 安全、监控与日志体系 Docker 进阶(五):Docker + CI/CD —— 从代码提交到自动部署 Docker 进阶(四):使用 Docker Swarm 与 Kubernetes 实现容器编排 Docker 进阶(三):深入理解镜像层(Layer)与缓存机制
Workbox:可直接用于生产环境的 Service Worker 利器快速构建项目文档网站:主流文档站点工具选型与对比DiceBear:30+ 风格、完全可定制的开源头像生成解决方案ES2015 → ES2025:JavaScript 十年演进全景回顾与核心 API 总结ECMAScript 2025(ES16)深度解析20 个现代 JavaScript API 深度盘点
GEO(生成引擎优化)完整指南:AI 搜索时代的企业内容新机会 ECMAScript 2025(ES16)深度解析 移动端ios:active伪类无效的兼容解决方案 Web3.0 全面解析:下一代互联网的技术底座与未来方向 HTML5中input的placeholder颜色设置及兼容性解决方案 双因子认证(2FA)的实现方案与最佳实践
最近评论
渔夫 发布于 3 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8

COPYRIGHT © 2025 蓝戒博客_智构苍穹-专注于大前端领域技术生态. ALL RIGHTS RESERVED.

京ICP备12026697号-2