JWT 令牌(待更新)

文章目录


前言

JWT (JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象形式安全地传输信息。简单理解,JWT就是经过签名的JSON,常用于身份认证 和信息交换。

一、JWT的结构

一个完整的JWT由三部分组成:Header 、Payload 、Signature ,中间用 . 分隔。

bash 复制代码
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MDAwMDAwMH0.abc123def456...
|--------- header ---------|------------ payload ------------|----- signature -----|

1. Header(头部)

头部通常包含两部分信息:

  • alg:签名算法,如 HS256(HMAC-SHA256)或 RS256(RSA)。
  • typ:令牌类型,固定为 JWT。

Base64Url编码后示例:

2. Payload(载荷)

3. Signature(签名)

二、JWT的认证流程

三、JWT在Java中的使用(JJWT)

JWT与传统Session-Cookie对比

对比维度 Session-Cookie JWT
存储位置 服务端存储Session,客户端存SessionId 客户端存储JWT,服务端不存
状态性 有状态(服务端维护状态) 无状态(自包含所有信息)
扩展性 难以水平扩展(需共享Session) 易扩展,任何服务器都能验证
安全性 SessionId被盗用可伪造身份 密钥安全是关键,Payload明文(不应存敏感信息)
跨域支持 Cookie受同源策略限制 可放在请求头中,天然支持跨域
注销难度 直接删除Session即可 无状态导致即时失效困难,需配合黑名单或其他机制
传输开销 Cookie每次请求自动携带(小) JWT请求头携带,体积较大

常见JWT面试题及答案

  1. JWT的三部分组成是什么?
  • Header(头部):声明类型和签名算法。
  • Payload(载荷):存放声明数据(注册、公开、私有声明)。
  • Signature(签名):使用 Header中的算法,对 Header + "." + Payload 进行签名,保证数据完整性和防篡改。
  1. JWT的认证流程是怎样的?
  • 用户登录成功后,服务端生成JWT返回客户端。
  • 客户端存储JWT(localStorage/内存等),后续每次请求在 Authorization 头中携带。
  • 服务端接收请求后,验证JWT签名和有效期,成功则放行。
  1. JWT如何防止数据被篡改?
  • 通过签名机制。服务端使用密钥对 Header+Payload 做签名,任何改动都会导致签名不匹配,服务端验证时会发现签名错误。
  1. JWT和Session有何区别?
  • Session是有状态的,服务端存储会话信息;JWT是无状态的,信息都编码在Token中。
  • Session扩展性差,分布式下需要共享Session;JWT天然支持水平扩展。
  • JWT体积更大,且无法直接服务端销毁。
  1. JWT过期如何处理?
  • 可使用 Refresh Token 机制:登录时返回一个短期JWT(如30分钟)和一个长期Refresh Token。JWT过期后,客户端用Refresh Token换取新的JWT,Refresh Token可以存储在安全地方(如httpOnly cookie),且可以在服务端控制其失效。
  1. JWT的Payload是加密的吗?
  • 不是。Payload只是Base64编码,可以轻易解码。所以绝对不能在Payload中存放密码等敏感信息。如需加密,可采用JWE(JSON Web Encryption)。
  1. 如何实现JWT的"踢下线"功能?
  • 由于JWT无状态,无法直接失效。常见方案:
    • 维护一个黑名单(Redis),存放失效Token的ID(jti),验证时筛查。
    • 缩短JWT有效期,降低风险窗口。
    • 结合WebSocket实时通知客户端删除Token。
  1. JJWT库中如何生成和解析Token?
  • 生成:使用 Jwts.builder() 设置claims和过期时间,.signWith(key) 签名。
  • 解析:使用 Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody() 获取Claims。
相关推荐
孟陬7 分钟前
JavaScript 反引号(` backtick)和双引号的不完全等价 ≠ 场景
javascript·node.js·bun
恋猫de小郭8 分钟前
Genkit Dart 1.0 发布,Flutter 原生的 AI Agent 终于完整了
android·前端·flutter
sibylyue11 分钟前
SQLite 运行模式
java·jvm·sqlite
专业程序开发源12 分钟前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
思码梁田15 分钟前
CSS transform 转换详解:translate、rotate、scale、skew 与 3D 变换一次讲清
前端·css·transform·skew·scale·translate·rotate
JAVA面经实录91717 分钟前
Java高级后端 · 架构组件开发 + CodeReview(本岗位差异化核心)
java·架构·代码复审
toooooop818 分钟前
宝塔Python项目管理器:环境变量踩坑记录
java·jvm·python
第10086个小白20 分钟前
flutter桌面端打包方式(Inno Setup Compiler)版本
前端·flutter
代码山河22 分钟前
Java语言特点:跨平台、面向对象、安全性详解
java·学习·架构·教程·面向对象·项目
马剑威(威哥爱编程)25 分钟前
【AI全栈后端12-09】Spring Boot 用流式输出做打字机对话:点下去不再干等
java·人工智能·spring boot·后端