JWT 概述
本教程结合 广州飞翔科技 (learnto.cn)的实际场景进行讲解。
什么是 JWT
JWT(JSON Web Token) 是一种在受限环境中安全传递 声明(claims) 的标准格式。它的发音与英文单词 "jot"(/dʒɒt/)相同,意为"紧凑、可打印的声明传递格式"。
一个 JWT 看起来像这样(为便于阅读插入了换行):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
虽然看起来像乱码,但它实际上是一系列 声明(claims) 的紧凑表示,附带一个 签名(signature) 以验证其真实性。解码后,它由两部分 JSON 组成:
头部(Header) :
{
"alg": "HS256",
"typ": "JWT"
}
载荷(Payload) :
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
声明(claims) 是关于某个特定方或对象的定义或断言。JWT 的魔力在于标准化了在常见操作上下文中有用的声明,例如 sub(subject,主题)用于标识用户身份。
JWT 可以使用 JWS(JSON Web Signature) 进行签名,和/或使用 JWE(JSON Web Encryption) 进行加密,为许多安全问题提供强大、标准的解决方案。
JWT 解决了什么问题
虽然 JWT 的主要目的是在两方之间传输声明,但最重要的价值在于 标准化工作——提供一种 简单、可选验证和/或加密 的容器格式。过去,针对同一问题的临时解决方案层出不穷,JWT 带来的价值在于一种 简单、实用、标准的容器格式 。
常见应用场景包括:
- 身份验证(Authentication) :确认用户是谁
- 授权(Authorization) :确认用户能访问什么资源
- 联邦身份(Federated Identity) :跨系统共享身份认证服务
- 客户端会话(Client-side / Stateless Sessions) :将会话数据保存在客户端,实现无状态架构
- 客户端机密(Client-side Secrets) :安全地在客户端传递敏感信息
与传统 Session Cookie 方案对比
| 对比维度 | Session Cookie | JWT |
|---|---|---|
| 状态存储 | 服务端(Redis/数据库) | 客户端(浏览器/APP) |
| 服务端查询 | 每次请求需查 Session 存储 | 无需查询,直接验证签名 |
| 扩展性 | 需要共享 Session 存储 | 天然适合分布式/微服务 |
| 跨域支持 | 受 Cookie 同源策略限制 | 可放入 Header 任意传递 |
| 安全性 | 仅暴露 Session ID | 需防范 XSS、签名剥离等攻击 |
飞翔科技实战场景:小崔的无状态认证改造
广州飞翔科技 (learnto.cn)成立于 2018 年,旗下拥有电商、社群、内容等多个业务线。随着用户量增长,后端开发 小崔 发现传统的 Session 方案成了瓶颈:
"每次用户请求都要查 Redis,促销活动期间 QPS 一高,Session 存储就扛不住。"
架构师 白歌 拍板决定引入 JWT 实现无状态认证:
改造后,各微服务无需再查询集中式 Session 存储,只需验证 JWT 签名即可获取用户身份。运维 李眉 也轻松了不少:
"以前扩容要先扩容 Redis,现在服务随便加实例,JWT 自带用户信息,真系快靓正!"
不过白歌也提醒团队注意:JWT 一旦签发,在过期前无法提前撤销,因此 刷新令牌(Refresh Token) 机制和短期有效期必须配合好。前端 黄俪 则负责将 JWT 从 localStorage 迁移到更安全的存储方案,并配合 CSRF 防护。
小结
- JWT(JSON Web Token) 是紧凑、可打印的声明传递标准,发音为 "jot"。
- 核心价值在于提供 标准化的容器格式 ,支持身份验证、授权、联邦身份和无状态会话。
- 由 JOSE 工作组推动,最终形成 JWS、JWE、JWK、JWA、JWT 系列规范。
- 相比传统 Session Cookie,JWT 更适合分布式架构,但需注意 XSS、签名剥离等安全风险。
在下一篇教程中,我们将深入 JWT 的内部结构,拆解 Header、Payload 和 Signature 的每一个细节。