JWT 鉴权实战:登录态到底该怎么管才安全
【摘要】 前后端分离后,登录态不能像以前那样靠服务端 Session 硬绑了。本文用一张认证流程图讲清 JWT 的工作原理、access/refresh 双 token 设计、前端怎么存、以及新手最容易踩的安全坑。
一、JWT 是什么,解决了什么
JWT(JSON Web Token)本质是一串签过名的 JSON 字符串,长这样:
xxxxx.yyyyy.zzzzz
└─头┘ └─载荷┘ └─签名┘
- 头(header):声明类型和签名算法(如 HS256 / RS256)。
- 载荷(payload):你要带的数据,比如用户 id、角色、过期时间。注意:payload 只是 Base64 编码,谁都能解开,不能塞密码等敏感信息。
- 签名(signature):服务端用密钥对前两部分签名。客户端改不了,服务端拿密钥一验就知道真伪。
它解决的核心问题:服务端不需要存 Session,也能相信"这个请求确实是登录过的用户发的"。因为 token 自带签名,验签即可,不用查库。这对无状态、可水平扩展的后端太友好了。
二、一次鉴权是怎么走的
下面这张图把登录和后续请求的全过程画出来了:

拆开看:
- 登录:客户端把账号密码
POST /login发给服务端。 - 签发:服务端校验账号密码正确,用密钥签发 JWT 返回(通常 access + refresh 两个)。
- 带票访问:之后每次请求,客户端在请求头带
Authorization: Bearer <token>。 - 校验放行:服务端/网关用密钥验签名,通过就返回数据,不通过就 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 直接被偷。敏感系统慎用。 - 优先
httpOnlyCookie:设置HttpOnly+Secure+SameSite后,JS 读不到,能挡住大部分 XSS 偷 token,而且自动随请求带上。代价是要处理好 CSRF(用SameSite或双提交 token 防御)。 - access 放内存也行:单页应用里把 access token 存在 JS 变量(内存),刷新页面就丢、靠 refresh 换,XSS 拿不到持久 token,但页面关了要重登。
没有绝对安全的存储,只有"风险与体验的权衡"。中小项目用
httpOnlyCookie 方案最省心;纯前端 SPA 又不想碰 CSRF,可以用"access 内存 + refresh Cookie"的组合。
五、服务端要守住的红线
前端再怎么存,服务端才是安全的大门:
- 密钥绝不能泄露:HS256 的密钥写进配置中心/环境变量,别硬编码进仓库。多服务场景建议用 RS256(私钥签、公钥验),方便分发。
- 过期必须校验:验签名的同时一定检
exp(过期时间),别只验签名不验期。 - 敏感操作后台再验权限:token 里带了角色不等于后端不用校验。删库、改权限这种操作,后端必须按当前用户真实权限再判一次。
- 必要时能吊销:JWT 天然无法中途作废。若要做"踢下线 / 紧急吊销",需要一个短生命周期的黑名单(如 Redis 存 jti),或把有效期压很短 + 依赖 refresh 机制。
- 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)