当前位置: 首页 > news >正文

理解 JWT:三段分别是什么

JWT(JSON Web Token)是一种把声明(claims)编码成可传递字符串的方式,常见形态是三段用点号连接的 Base64URL 文本。

登录成功后,前端把一长串xxxxx.yyyyy.zzzzz塞进请求头,后端验过就认你是谁。资料里又是签名、加密、鉴权、会话,读完仍常不清楚:三段各自是干什么的,以及它到底防什么

下面按结构拆开讲。

一、先说一个具体麻烦

接口要求:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.signature

有人以为:这段字符串是加密的,用户看不懂,所以安全。
也有人以为:只要有 JWT,就不用 HTTPS,也不用管注销。

两种想法都容易出事。JWT 默认常常是可解码可读、靠签名防篡改,不是保险箱;它也不是完整的会话产品方案。

二、核心思路:明信片 + 火漆印

简单说,常见的签名型 JWT 更像一张明信片:

(1)正面写着你的声明(谁、什么角色、何时过期)——路人可能读得到
(2)火漆印证明「内容没被改过,且来自持有密钥的一方」
(3)没火漆或火漆对不上,接收方直接拒绝

所以 JWT 解决的核心问题是:在分布式服务之间,传递一份可验证的声明,而不必每次都回中心会话库查同一张表(具体架构仍可选择有状态黑名单等,那是附加设计)。

三、三段分别是什么

标准 JWT 长这样:

header.payload.signature

3.1 Header(头部)

描述元数据,常见是 JSON,再 Base64URL 编码。

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

上面代码中,alg说明签名算法,typ说明类型。接收方要按约定算法校验,不能盲目信任头部里「声称」的算法而不做白名单约束(历史上有算法混淆类问题,工程上需按安全实践配置)。

3.2 Payload(载荷)

放声明。仍是 JSON,再 Base64URL 编码。常见字段:

(1)sub:主体,常是用户 id
(2)iat/exp:签发时间 / 过期时间
(3)iss/aud:签发者 / 受众
(4)自定义声明:角色、租户 id 等

注意:默认不是加密。任何人拿到 token,都能解码 payload 看内容。别把密码、身份证号一类敏感数据塞进去。

3.3 Signature(签名)

用密钥(或私钥)对「编码后的 header + payload」计算签名,防止篡改。

直觉公式(HMAC 类):

signature = HMAC_SHA256( base64url(header) + "." + base64url(payload), secret )

上面结构中,改 payload 里的role却不重算合法签名,校验就会失败。这就是「火漆印」的作用。

四、一次典型校验流程

(A)用户登录,认证服务签发 JWT
(B)客户端存储(怎么存是另一话题:内存、HttpOnly Cookie 等各有取舍)
(C)请求业务 API 时带上
(D)API 验签名、查exp、查iss/aud
(E)通过则按声明授权;失败则 401

验签通过,只说明「声明未被篡改且来自可信签发方」。不自动等于「用户此刻仍应拥有全部权限」——权限回收、强制下线,需要额外机制。

五、JWT 不解决什么

(1)保密性:默认可读;要保密需走加密型方案(JWE)或根本别放敏感字段
(2)传输安全:仍要 HTTPS,否则 token 会被窃听
(3)自动注销:未过期的 token,在纯无状态模型下仍有效;要作废需黑名单、短过期 + 刷新令牌、或改密钥版本等
(4)替代授权设计:有 token ≠ 权限模型正确;仍要做对象级授权检查

六、实践上几条最小建议

(1)payload 只放必要声明,控制体积
(2)设合理exp;长会话用刷新令牌旋转,而不是超长 access token
(3)校验时核对算法、签发者、受众、过期时间
(4)密钥用足够强度的随机值,并支持轮换
(5)日志里不要完整打印 token

下面是一个解码示意(仅理解结构,生产请用成熟库验签)。

const[h,p]=token.split('.')constpayload=JSON.parse(Buffer.from(p,'base64url').toString())console.log(payload.sub,payload.exp)

上面代码中,只演示「payload 可读」。缺少签名校验的代码不能当鉴权。

七、常见误区

(1)把 Base64 当成加密
编码 ≠ 加密。

(2)存在 localStorage 就以为万事大吉
XSS 可偷 token。存储位置要和威胁模型一起选。

(3)算法写none或乱信任 header.alg
等于摘掉火漆印。

(4)token 过长塞进一堆权限快照
难轮换、难更新,也更容易泄露面变大。

(5)401 与 403 分不清
token 无效/过期偏 401;token 有效但无权限偏 403。

八、小结

JWT 三段里:Header 说明怎么验,Payload 装声明,Signature 防篡改。

它擅长传递可验证的身份与声明;不擅长当加密容器,也不自动提供完善的会话注销。把三段职责分清,后面的安全讨论才有共同语言。

(完)

http://www.cnnetsun.cn/news/4211901.html

相关文章:

  • 计算机毕业设计之企业社交网络平台的设计与实现
  • HarmonyOS 性能优化工具链:从「手工排查」到「工程化治理」的全栈实战指南
  • 01-具身机器人硬件全景拆解
  • ABAP 里有没有 AI Agent 的 Progressive Disclosure,一套从封装、Released API 到 RAP 暴露层的完整对照
  • 从奈奎斯特判据到无源性:为什么只需保证逆变器导纳无源就能稳定并网?
  • 【python】条件语句
  • 【2015-03-02】《RealView编译工具汇编器指南》摘录:内置变量和常数
  • 手机玩鸣潮 3.6 版本,随时随地开荒新地图不卡顿
  • AIGC 到底是什么:从传统软件到生成式人工智能
  • 规模化养殖冰爽强甘多少钱
  • Go单例模式:sync.Once与双重检查
  • 【第9篇】 EfficientViT(ICCV 2023):基于多尺度线性注意力的高效高分辨率密集预测网络
  • 封神了!Scrapling 火了,AI 时代的数据采集神器来了
  • 经验丰富的杭州园林景观工程公司排名哪个好
  • DC/DC电源怎么选?如何在效率、体积、隔离和EMI之间做平衡?
  • 【代码评测】AI 写代码更快以后,为什么 Review 反而成为瓶颈?
  • 大宗交易折溢价因子怎么挖掘本地化Python全流程实战 IG50免费开源股票数据API接口
  • SRC挖洞变现:业务逻辑漏洞报告怎么写才能评上高危?(附5类报告模板)
  • Claude Code文档访问失败?开发者必备的版本管理与信息同步方案
  • 2026年家长必看!靠谱儿童视光及近视防控该如何选择?
  • 能写的未必能过检:从AIGC检测原理倒推,论文AI工具到底该怎么选
  • 前缀和与差分数组——从O(n²)到O(1)的降维打击
  • 快餐出海,不是把店开出去,而是把供应链搬出去!10月杭州中餐出海研讨会,快餐/简餐出海的供应链适配与本土化策略。限席!
  • 构建AI编程智能体:以DeepSeek Hermes为大脑的多工具协同工作流
  • AI大模型与数学·第49课 级数刷题集训6:泰勒级数完整实战+余项误差分析——大模型轻量化、截断近似底层数学
  • Windows局域网联机全攻略:从文件共享到游戏联机与Docker部署
  • 迷你PC构建Proxmox集群:万兆网络规划与配置实战
  • Qwen3.8本地推理性能优化实战:vLLM、量化与参数调优指南
  • 解锁大模型深度思考:Qwen2.5-72B推理调优与提示工程实战
  • 深入理解C++系列(15)——AVL树