令牌认证
Bearer、JWT 注意点;衔接 oauth。
30 分钟
令牌认证
Bearer Token 表示:谁持有这个串,谁就享有对应权限——常见于 JWT、opaque token、API Key。Spring REST API 多走 Authorization: Bearer <token>,与 Cookie 会话 并列,是前后端分离的主路径。本课建立 JWT 直觉与坑,完整授权码流见 oauth-essentials。
学习目标
- 区分 opaque token 与 JWT 的校验方式
- 列出 JWT 必须控制的 exp、iss、aud、alg 等要点
- 对接 sb-jwt 与 oauth-resource
Bearer 头格式
GET /api/me HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
服务器 不解析 Cookie,从 Header 取 token 校验。CORS 预检需允许 Authorization(sec-cors)。
Opaque vs JWT
| Opaque | JWT | |
|---|---|---|
| 内容 | 随机 ID,服务端查 session/DB | 自包含 JSON + 签名 |
| 撤销 | 删 session 即失效 | 短 exp + 黑名单 / refresh 轮换 |
| 扩展 | 服务端存权限 | claims 里放 role(注意体积) |
| 校验 | 查存储 | 验签 + 验 exp/iss |
本站 backend 若用 Sa-Token / 自签 JWT,思路与 Spring Security OAuth2 Resource Server 类似:验签密钥保密、过期要短。
JWT 结构(直觉)
header.payload.signature
Payload 示例 claims:
{
"sub": "user-42",
"exp": 1735689600,
"iss": "https://auth.example.com",
"aud": "api.example.com",
"scope": "read:orders"
}
不要在 JWT 里放:密码、信用卡、过大 PII——payload 仅 Base64Url,无加密(除非 JWE,少用)。
安全要点
- 算法:禁止接受
alg: none;RS256 / ES256 优于共享密钥 HS256 泄露一发全灭(视架构而定) - 密钥:
JWT_SECRET放环境变量,长度足够,可轮换(双 key 过渡期) - 过期:access token 分钟级;长期用 refresh token 单独保护