基础概念
定义:一种紧凑的、URL 安全的令牌,用于在各方之间传递经过加密的数据,主要用于认证和授权
结构:由三部分组成:Header、Payload 和 Signature,中间用点(.)分隔
- 完整的 JWT:
xxxxx.yyyyy.zzzzz
- Header
- 令牌类型和所使用的签名算法
- 比如:
{ "alg": "HS256", "typ": "JWT" }
alg
:签名算法,例如 HMAC SHA256 (HS256
) 或 RSAtyp
:令牌类型,这里是JWT
- Payload
- 要传递的实际数据
- 三种类型
- 注册声明(Registered claims):预定义的声明,如
iss
(发行者)、exp
(过期时间)、sub
(主题)、aud
(受众) - 公共声明(Public claims):可以自定义,使用 JWT 官方注册或开放标准的声明
- 私有声明(Private claims):自定义的声明,用于在双方之间传递的信息
- 注册声明(Registered claims):预定义的声明,如
- Signature
- 用于验证消息的真实性和防止篡改
- 通过 Header、Payload 和密钥生成
工作原理
- 用户登录:用户使用用户名和密码登录
- 服务器验证:服务器验证用户身份
- 生成 JWT:验证成功后,服务器生成一个 JWT,并返回给客户端
- 客户端存储:客户端(如浏览器)存储 JWT,可以是 Local Storage 或 Cookies
- 发送请求:客户端在每次请求时,将 JWT 添加到 HTTP 头部,通常是
Authorization: Bearer <token>
- 服务器验证 JWT:服务器接收到请求后,验证 JWT 的有效性和完整性
- 处理请求:验证通过后,服务器处理请求并返回响应
安全性
- 签名算法:JWT 使用的签名算法通常是 HMAC SHA256(对称密钥)或 RSA(非对称密钥)
- 密钥保护:必须保护签名密钥的安全,密钥泄露会导致 JWT 被伪造
- 过期时间:应设置
exp
(过期时间)声明,防止令牌长期有效 - 加密:JWT 本身是明文的,如果需要传输敏感数据,应使用 JWE(JSON Web Encryption)进行加密
优缺点
优点
- 自包含:JWT 包含所有需要的信息,减少服务器查询数据库的次数
- 紧凑性:JWT 使用 JSON 格式,体积小,适合 URL 传输
- 可扩展性:JWT 可以自定义声明,满足不同需求
- 无状态:服务器无需存储会话信息,适用于分布式系统
缺点
- 无法撤销:一旦签发,无法撤销 JWT,只能等待其过期
- 体积较大:相较于传统会话 ID,JWT 包含的信息更多,体积较大
- 安全隐患:如果不使用 HTTPS 传输,可能被窃取;如果密钥泄露,可能被伪造