前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库JWT 结构 header payload signature 校验
身份身份与权限身份认证与授权

JWT 的三个部分分别是什么,服务端验证 JWT 时具体校验哪些内容?

JWT由Header、Payload、Signature三段组成,服务端验证时先验签防止篡改,再逐一校验exp、iss、aud等声明是否满足约束。

前端进阶之旅 · 一题精讲更新于 2026.09.05
身份与权限#身份认证与授权#安全
先看核心答案
理解线索

JWT三段结构速览

  1. Header指定签名算法alg和令牌类型typ
  2. Payload包含注册声明和自定义数据
  3. Signature对前两段签名,验证完整性

内容为Base64URL编码,非加密,勿放敏感信息。

核心回答

先记住这个答案

JWT的Header声明算法与类型,Payload存放用户和元数据声明,Signature由前两段和密钥生成。服务端验签确保令牌完整,然后检查exp未过期、nbf已生效、iss匹配可信签发方、aud包含当前服务标识。任一步骤失败都拒绝令牌并返回401。

  • Header声明算法,Payload含声明,Signature保完整
  • 验签必须用约定算法,不能信任Header的alg
  • exp、iss、aud必须按精确规则校验并处理缺失

验签与声明校验的执行顺序

JWT把Header和Payload分别Base64URL编码,以点连接,然后按alg指定的算法生成签名。服务端收到令牌后,用自己持有的密钥或公钥对同样内容重算签名,并与传来的Signature比较。若不一致,说明内容被改动,立即拒绝。

签名通过后进入声明校验。exp要求当前时间早于声明值,nbf要求不早于生效时刻,iss需要精确匹配可信签发方,aud为字符串时须与自身标识相同,为数组时须包含自身。全部通过才放行请求。

跨服务调用时的声明不一致实例

某系统由认证服务、用户服务、订单服务构成。订单服务使用密码学密钥验签,并配置iss为'auth.example.com',aud为'order-api'。当用户携带已过期的令牌调用,即使签名正确,exp校验失败,接口返回401。另一个场景中令牌aud为'user-api',未过期但aud不匹配,同样拒绝。

考虑带nbf的令牌:签发于10:00,exp为10:30,nbf为10:00:05。服务端10:00:03收到时,令牌未生效。若服务端采用30秒时钟偏差容忍,则可能通过,但容差过大会增加令牌重用时间,通常仅允许几十秒的系统时钟漂移。

声明缺失与算法信任的失效条件

缺少exp的令牌应被默认拒绝,因为没有可验证的生命周期。同样,iss或aud缺失时,除非显式信任,否则不能放行。宽松匹配允许跨服务使用同一个令牌,破坏最小权限边界。

服务端若信任Header中的alg,攻击者可设为'none'并砍掉签名,或改成RS256后自己签名。必须固定允许算法列表,并确保私钥不泄露,才能让验签有意义。

回答前,多想一步

容易答错的地方

Payload经过Base64编码即安全
Base64URL是编码而非加密,任何人解码都能看到。将密码或身份证号放入Payload等于明文泄露,应只放公开可读的必需声明,或用JWE加密内容。
只要Signature正确就信任所有声明
签名只保证内容未被篡改,不保证声明本身合法。比如过期时间可以正确签名但仍超出允许范围,服务端必须单独校验exp等业务声明,不能仅检查签名。
试着用自己的话回答

面试官还会怎么问?

如果JWT没有exp声明,服务端应该怎么处理?

默认应拒收,因为无法控制令牌生命周期。若要支持无过期令牌,必须显式放行并提供服务端侧的撤销或黑名单,但风险极高,通常只用于内部API间调用。

使用RS256验签时,如何获取公钥并防止混淆?

应通过HTTPS访问可信的JWKS端点,按kid字段获取对应公钥。同时需配置允许的iss列表,避免攻击者自建签发服务并替换公钥,导致验签被绕过。

aud的校验规则是什么?

aud表示令牌的接收方。若为字符串,服务端应精确匹配自身标识;若为数组,只要包含服务端标识即可通过。宽松匹配容易导致令牌在互信服务间误用,需用精确值比较。

从一道题,走向一组知识

把知识连起来

身份认证与授权

HS256 的 JWT 密钥应该如何生成、存储和轮换,硬编码在代码里有什么风险?

同属「身份认证与授权」专题,接着看 JWT 密钥管理 轮换 硬编码风险 在具体场景中的处理方式。

身份认证与授权

JWT 验证中 alg=none 与 RS256/HS256 算法混淆攻击是如何发生的,如何防御?

同属「身份认证与授权」专题,接着看 JWT alg none 算法混淆攻击 防御 在具体场景中的处理方式。

参考资料

  • ¶

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 验签与声明校验的执行顺序
  3. 跨服务调用时的声明不一致实例
  4. 声明缺失与算法信任的失效条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑