在现代 Web 开发里,身份认证几乎躲不开。前后端分离、微服务一多,传统的 Session-Cookie 方案就开始显得笨重:状态要同步,跨域要处理,CSRF 也得额外防。
JWT 正是为了解这类问题出现的。它的思路不复杂:服务端只负责签发和校验,不再保存会话状态。客户端拿到令牌后自己保存,请求时带回去即可。
JWT 是什么
JWT(JSON Web Token)是一个紧凑、URL 安全的字符串,格式固定为:
Header.Payload.Signature
中间用两个点隔开,分别对应三部分:
- Header
- Payload
- Signature
Header
Header 记录令牌元数据,通常包含签名算法和类型:
{ "alg": "HS256", "typ": "JWT" }
这部分会先做 Base64Url 编码。
Payload
Payload 放的是声明(Claims),也就是要传递的数据。标准里已经定义了一些常见字段:
iss:签发人exp:过期时间sub:主题,通常是用户 IDiat:签发时间
也可以放自定义字段:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
这里有个容易踩坑的地方:Payload 只是编码,不是加密。任何人拿到 Token 都能解码看到内容,所以别把密码之类的敏感信息塞进去。
Signature
签名负责防篡改。生成方式大致是:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret )
服务端收到 Token 后,用同样的算法和密钥重新计算一次。如果结果一致,说明内容没被改过,Token 也确实是自己签出来的。
JWT 的工作流程
流程其实很直白:
- 用户登录,客户端提交用户名和密码。
- 服务端验证通过后生成 JWT 并返回。
- 客户端保存 Token,常见位置是 LocalStorage 或 Cookie。

