JWT 鉴权实战:登录态到底该怎么管才安全

举报
茉莉风铃 发表于 2026/08/26 10:51:06 2026/08/26
【摘要】 前后端分离后,登录态不能像以前那样靠服务端 Session 硬绑了。本文用一张认证流程图讲清 JWT 的工作原理、access/refresh 双 token 设计、前端怎么存、以及新手最容易踩的安全坑。

一、JWT 是什么,解决了什么

JWT(JSON Web Token)本质是一串签过名的 JSON 字符串,长这样:

xxxxx.yyyyy.zzzzz
└─头┘ └─载荷┘ └─签名┘
  • 头(header):声明类型和签名算法(如 HS256 / RS256)。
  • 载荷(payload):你要带的数据,比如用户 id、角色、过期时间。注意:payload 只是 Base64 编码,谁都能解开,不能塞密码等敏感信息。
  • 签名(signature):服务端用密钥对前两部分签名。客户端改不了,服务端拿密钥一验就知道真伪。

它解决的核心问题:服务端不需要存 Session,也能相信"这个请求确实是登录过的用户发的"。因为 token 自带签名,验签即可,不用查库。这对无状态、可水平扩展的后端太友好了。

二、一次鉴权是怎么走的

下面这张图把登录和后续请求的全过程画出来了:

image.png

拆开看:

  1. 登录:客户端把账号密码 POST /login 发给服务端。
  2. 签发:服务端校验账号密码正确,用密钥签发 JWT 返回(通常 access + refresh 两个)。
  3. 带票访问:之后每次请求,客户端在请求头带 Authorization: Bearer <token>
  4. 校验放行:服务端/网关用密钥验签名,通过就返回数据,不通过就 401。

整个过程验 token 不需要查数据库,纯算签名,所以快、且天然支持多实例。

三、为什么需要 access + refresh 两个 token

只发一个 token,会陷入两难:

  • token 有效期长(比如 7 天)→ 一旦泄露,别人能用好久,风险大。
  • token 有效期短(比如 15 分钟)→ 用户老被踢去登录,体验差。

解法就是双 token:

token 有效期 用途 存哪
access token 短(15~30 分钟) 日常接口鉴权 内存 / 易失存储
refresh token 长(7~30 天) 用来换新的 access 更安全的存储(如 httpOnly Cookie)

流程:access 过期了,客户端拿 refresh 去 /refresh 换一对新 token,用户无感;refresh 也过期了,才真正要求重新登录。这样即便 access 泄露,窗口也短。

四、前端怎么存 token(安全重点)

这是新手最容易翻车的地方:

  • 别无脑塞 localStorage:JS 能读 localStorage,一旦有 XSS 漏洞,token 直接被偷。敏感系统慎用。
  • 优先 httpOnly Cookie:设置 HttpOnly + Secure + SameSite 后,JS 读不到,能挡住大部分 XSS 偷 token,而且自动随请求带上。代价是要处理好 CSRF(用 SameSite 或双提交 token 防御)。
  • access 放内存也行:单页应用里把 access token 存在 JS 变量(内存),刷新页面就丢、靠 refresh 换,XSS 拿不到持久 token,但页面关了要重登。

没有绝对安全的存储,只有"风险与体验的权衡"。中小项目用 httpOnly Cookie 方案最省心;纯前端 SPA 又不想碰 CSRF,可以用"access 内存 + refresh Cookie"的组合。

五、服务端要守住的红线

前端再怎么存,服务端才是安全的大门:

  1. 密钥绝不能泄露:HS256 的密钥写进配置中心/环境变量,别硬编码进仓库。多服务场景建议用 RS256(私钥签、公钥验),方便分发。
  2. 过期必须校验:验签名的同时一定检 exp(过期时间),别只验签名不验期。
  3. 敏感操作后台再验权限:token 里带了角色不等于后端不用校验。删库、改权限这种操作,后端必须按当前用户真实权限再判一次。
  4. 必要时能吊销:JWT 天然无法中途作废。若要做"踢下线 / 紧急吊销",需要一个短生命周期的黑名单(如 Redis 存 jti),或把有效期压很短 + 依赖 refresh 机制。
  5. HTTPS 是底线:token 明文在请求头里跑,不挂 HTTPS 等于裸奔,被抓包随便用。

六、常见误区

  • ❌ “JWT 加密了,payload 安全”——JWT 默认只签名不加密,payload 谁都能解,别放机密。
  • ❌ “有了 JWT 就不需要 CSRF 防护”——用 Cookie 带 token 时照样要防 CSRF。
  • ❌ “token 越久越好,少登录”——有效期越长风险越大,用双 token 平衡。
  • ❌ “前端隐藏按钮 = 权限控制”——隐藏只是体验,真正拦截永远在后端。

七、小结

JWT 的本质是"自带签名、服务端免存 Session 的登录态凭证",特别适合前后端分离、后端无状态、要水平扩展的场景。落地记住三件事:双 token 平衡安全与体验、token 存储做好 XSS/CSRF 权衡、所有权限校验最终落在后端

它不神秘,也不是银弹——理解它"签名可验、payload 可读不可信"的特性,就能用得既顺手又安全。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。