令牌攻击与强化
防御身份验证流程遭受滥用。
令牌攻击与强化 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
令牌即凭据
在现代身份认证中,令牌就是凭据。持有有效持有者令牌的任何人,在令牌过期或被撤销前,都会被视为已认证主体。
- 这意味着令牌被盗等同于凭据被盗。
- 强化措施的重点是限制令牌生命周期、将令牌绑定到持有者,并支持快速撤销。
本课介绍针对 OAuth/OIDC/SAML 令牌的攻击,以及用于应对这些攻击的防御控制措施。
JWT 算法混淆
一种经典的 JWT 攻击会利用 alg 标头。
- 如果接受 alg: none,攻击者就能伪造未签名的令牌。
- RS256 与 HS256 混淆:攻击者使用公开的 RSA 密钥作为 HMAC 密钥,为令牌重新签名。
防御措施:在服务器端固定预期算法,绝不让令牌决定运行哪条验证路径。
Vulnerable: verify(token, key) // alg taken from header
Hardened: verify(token, key, { algorithms: ["RS256"] })
// reject alg:none, reject HS* when RS* expected通过 XSS 和日志窃取令牌
最常见的令牌泄露方式,就是直接窃取有效令牌。
- XSS 会从
localStorage或内存中读取令牌。 - 令牌出现在网址中时,会通过浏览器历史记录、引用方标头和服务器日志泄露。
- 详细记录
Authorization标头。
浏览器会话优先使用 httpOnly、Secure、SameSite Cookie,并从日志和网址中清除令牌。
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax
// keeps JS (and thus XSS) from reading the token重放攻击
重放攻击会重新使用捕获到的有效令牌,以受害者身份执行操作。
- 可通过较短的过期时间、一次性
nonce(OIDC)以及断言 ID 跟踪(SAML)来缓解。 - TLS 可防止被动网络捕获。
- 发送方约束型令牌即使被盗,也能阻止令牌重用。
Replay defenses:
short exp + nonce/jti uniqueness
TLS everywhere
sender-constrained tokens (mTLS / DPoP)发送方约束型令牌
任何持有持有者令牌的人都可以使用它。发送方约束型令牌会将令牌绑定到特定的客户端密钥。
- mTLS 绑定令牌(RFC 8705)会将令牌绑定到客户端 TLS 证书。
- DPoP(RFC 9449)会将令牌绑定到持有证明密钥,客户端针对每个请求使用该密钥签名。
这样一来,没有匹配的私钥,窃取到的令牌就毫无用处。
DPoP: each request carries a signed proof JWT
DPoP: <proof-jwt signed with client private key>
Authorization: DPoP <access_token>较短的生命周期与刷新轮换
限制任何被盗令牌可发挥作用的时间窗口。
- 让访问令牌保持较短生命周期(几分钟)。
- 使用刷新令牌轮换:每次刷新都会签发新的刷新令牌,并使旧令牌失效。
- 将轮换后的刷新令牌再次重用检测为被盗信号,并撤销整条令牌链。
On /token refresh:
issue new RT, invalidate old RT
if old RT presented again -> breach -> revoke family令牌撤销与自省
自包含 JWT 会一直有效到过期,这使撤销变得复杂。请提供能够快速切断访问权限的机制。
- 撤销端点(RFC 7009)会使刷新令牌和访问令牌失效。
- 自省(RFC 7662)允许资源服务器实时检查令牌状态。
- 对于关键撤销操作,可根据
jti维护拒绝列表。
POST /introspect token=...
-> { "active": true, "sub": "...", "scope": "read" }
POST /revoke token=...受众与作用域强制校验
有效令牌并不会自动获得访问您 API 的授权。请强制校验令牌用途。
- 检查 aud,确保为其他服务签发的令牌无法重放到您的服务。
- 按端点强制执行作用域;不要假定有效令牌意味着拥有完整访问权限。
- 验证 iss,阻止来自不受信任签发方的令牌。
这可以阻止跨服务令牌重用和混淆代理滥用。
混淆与跨提供方攻击
当客户端支持多个身份提供方时,混淆攻击可能诱使客户端将某个 IdP 签发的授权码或令牌发送到攻击者指定的其他端点。
- 客户端无法确定响应来自哪个 AS。
- 防御措施:使用
iss参数(RFC 9207)将响应绑定到签发方,并按提供方验证state。
/authorize ... &state=<provider-bound>
callback must include &iss=<expected-AS>
client verifies iss matches the AS it started with安全存储与传输
令牌的存储位置和方式决定其暴露风险。
- 浏览器会话:使用 httpOnly、Secure、SameSite Cookie;避免使用
localStorage。 - 移动设备:使用 OS 密钥链/密钥库,绝不使用明文文件。
- 服务器:使用密钥管理器,静态加密,并按作用域实施最小权限。
- 传输过程中始终使用 TLS;绝不把令牌嵌入查询字符串。
令牌强化检查清单
将这些控制措施整合为一套可执行的基线。
- 固定算法;拒绝
alg: none和算法混淆攻击。 - 验证 iss、aud、exp、签名、nonce/state。
- 设置较短的访问令牌 TTL,并配合刷新轮换和重用检测。
- 对于高价值 API,优先使用发送方约束型令牌(DPoP/mTLS)。
- 支持撤销和自省。
- 安全存储令牌;不要将令牌放入网址和日志中。
Hardening baseline:
[ ] alg pinned, none rejected
[ ] iss/aud/exp/sig/nonce validated
[ ] short TTL + RT rotation + reuse detection
[ ] DPoP/mTLS for sensitive scopes
[ ] revoke + introspect available快速检查:化解被盗令牌的危害
请选择最能限制令牌被盗本身所造成损害的控制措施。
回顾:令牌攻击与强化
核心要点:
- 令牌就是凭据;令牌被盗等同于账户接管。
- 通过固定算法并验证 iss、aud、exp、签名、nonce 来防御 JWT。
- 通过较短生命周期以及带重用检测的刷新轮换来限制暴露。
- 发送方约束型令牌(DPoP/mTLS)可以使被盗的持有者令牌失效。
- 提供撤销和自省,并避免将令牌放入网址、日志和 localStorage 中。
常见问题解答
「令牌攻击与强化」课时是免费的吗?
是的 — 「令牌攻击与强化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「令牌攻击与强化」这节课中我会学到什么?
防御身份验证流程遭受滥用。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「令牌攻击与强化」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。