用途
Auth Security 是一个认证安全最佳实践技能,聚焦 OAuth 2.1 与 JWT。它适用于实现认证、API 授权、令牌管理等场景,并遵循 RFC 9700(2025 年 1 月)。
核心原则
- OAuth 2.1:遵循 RFC 9700(2025 年 1 月)。
- PKCE 必需:所有客户端必须使用 PKCE。
- 短生命周期令牌:访问令牌在 5-15 分钟内过期。
- 令牌轮换:刷新令牌为单次使用。
- HttpOnly 存储:浏览器令牌存放于 HttpOnly Cookie。
- 显式算法:绝不信任 JWT 头部算法。
- 无向后兼容:删除已废弃的认证流程。
OAuth 2.1 关键变更
已废弃流程(请勿使用):
| 流程 | 状态 | 替代方案 |
|---|---|---|
| 隐式授权(Implicit Grant) | 已移除 | 授权码 + PKCE |
| 密码授权(Password Grant) | 已移除 | 授权码 + PKCE |
| 无 PKCE 的授权码 | 已移除 | 必须使用 PKCE |
必需:授权码 + PKCE。资料提供了生成 code verifier(43-128 字符)、生成 code challenge、构造授权请求以及令牌交换的 TypeScript 代码示例。
JWT 最佳实践
算法选择(2025)优先级:
| 优先级 | 算法 | 说明 |
|---|---|---|
| 1 | EdDSA (Ed25519) | 最安全,具备抗量子特性 |
| 2 | ES256 (ECDSA P-256) | 广泛支持,签名紧凑 |
| 3 | PS256 (RSA-PSS) | 比 RS256 更安全 |
| 4 | RS256 (RSA PKCS#1) | 兼容性最佳 |
资料以 ES256 为例,给出使用 jose 库进行签名与验证的代码,包括设置受保护头部(alg、typ、kid)、issuer、audience、过期时间、签发时间与 jti。
令牌结构包含标准声明(iss、sub、aud、exp、iat、jti)与自定义声明(scope、email、roles)。
验证(关键):必须显式指定允许的算法(如 algorithms: ['ES256']),校验 issuer 与 audience,设置时钟容差(clockTolerance: 30),并进行额外校验(如 scope 是否包含所需权限),同时区分 JWTExpired、JWTClaimValidationFailed 等错误类型。
令牌存储
Web 应用:将令牌设置于 HttpOnly Cookie,属性包括 httpOnly: true、secure: true、sameSite: 'strict'、maxAge(访问令牌 15 分钟)、path(仅发送到 API 路由)。刷新令牌使用更长有效期(7 天)并限定 path 为刷新端点。
单页应用(SPA):将访问令牌存放于内存(而非 localStorage/sessionStorage),配合刷新令牌轮换,刷新令牌放 HttpOnly Cookie,访问令牌放内存。
存储对比:
| 存储方式 | 防 XSS | 防 CSRF | 持久性 |
|---|---|---|---|
| HttpOnly Cookie | 是 | 需要 SameSite | 是 |
| 内存 | 是 | 是 | 否(刷新后丢失) |
| localStorage | 否 | 是 | 是 |
| sessionStorage | 否 | 是 | 仅当前标签页 |
刷新令牌轮换
流程:客户端发送 refresh_token → 服务器验证 → 生成新的 access_token 与 refresh_token → 使旧 refresh_token 失效 → 返回新令牌 → 客户端存储新令牌。
实现要点:在数据库中查找令牌(存储哈希值);若发现已使用(usedAt 存在)则判定为潜在令牌窃取,吊销该用户全部令牌并告警安全团队;检查过期时间;将旧令牌标记为已使用(保留用于重用检测);生成并存储新刷新令牌,通过 previousTokenId 形成审计链。
攻击防护
- 算法混淆:错误做法是 jwt.verify(token, key)(使用头部算法);正确做法是显式指定 algorithms: ['ES256']。
- CSRF 防护:使用 SameSite Cookie(strict 或 lax),或双提交 Cookie 模式(客户端在头部发送 csrf token)。
- XSS 防护:配置 Content-Security-Policy 头部;使用 HttpOnly Cookie 存放令牌;绝不将令牌存入 localStorage。
- 令牌绑定(DPoP):演示持有证明(Proof of Possession),将令牌绑定到客户端密钥对,构造包含 htm、htu、ath 的 DPoP 证明,并在请求头中发送 Authorization: DPoP <token> 与 DPoP 证明。
令牌吊销
吊销用户全部令牌(如密码修改、全部登出):删除该用户全部刷新令牌;若对访问令牌使用黑名单,则在 Redis 中记录吊销时间并设置过期(15 分钟,即访问令牌生命周期)。验证时检查黑名单:若吊销时间晚于令牌签发时间则视为已吊销。
检查清单
OAuth 2.1:使用授权码流程;所有客户端启用 PKCE;无隐式或密码授权;重定向 URI 精确匹配。
JWT:使用 ES256 或 EdDSA 算法;显式算法验证;短过期时间(≤15 分钟);每个令牌唯一 jti;校验 issuer 与 audience。
令牌:Web 应用使用 HttpOnly Cookie;启用刷新令牌轮换;实现重用检测;具备令牌吊销机制。
安全:全程 HTTPS;SameSite Cookie;配置 CSP 头部;认证端点限流;暴力破解防护。
相关参考
- reference/oauth2.1.md — OAuth 2.1 深入
- reference/jwt.md — JWT 模式
- reference/attacks.md — 攻击防护
- templates/typescript/auth.service.ts — TypeScript 认证服务起始模板
限制
资料未提供该技能的安装命令、收费与价格、支持平台、实际效果数据等信息,暂未提供。