一句话定义
DPoP(Demonstrating Proof-of-Possession,持有证明)是 OAuth 2.0 的一个扩展,让客户端在每次调用接口时用自己保管的私钥对请求签名,证明"我确实拿着这把钥匙",而不只是"我拿到了这串令牌"。
为什么需要它
传统 OAuth 发下来的是 access token(访问令牌),属于 bearer token(持有者令牌)——名字很直白:谁拿着它,谁就是主人。它像一张不记名的现金券,掉在地上被人捡走,捡到的人照样能花。日志泄露、浏览器 XSS、手机装了恶意应用,都可能让令牌落到别人手里,攻击者拿去调接口,服务端看不出任何区别。
DPoP 怎么解决
思路是给令牌上一把"指纹锁":
1. 客户端第一次运行时生成一对密钥,私钥留在本地(手机安全芯片、App 的密钥库),永远不外发。
2. 每次请求,客户端用私钥对这次请求的关键信息签名——HTTP 方法、目标地址、时间戳、随机数等,生成一段叫 DPoP proof 的签名串,放进请求头。
3. 授权服务器发令牌时,把这个令牌和客户端的公钥绑定,令牌里留下一枚"公钥指纹"。
4. 资源服务器每次收到请求,验两件事:签名对不对?令牌里绑的公钥指纹,和这次 proof 里的公钥是不是同一把?
这样,攻击者偷到令牌也没用——他没有对应私钥,签不出合法 proof。而且 proof 绑定了地址、方法和时间戳,既不能换个接口用,也不能无限期重复使用。
打个比方:bearer token 像一张写着"凭此券入场"的纸质票,谁拿着都能进;DPoP 像门票绑定本人,每次入场都要现场按指纹,指纹对不上,票就是废纸。
和相邻概念的区别
| Bearer AI 词典:Token">Token | DPoP | |
|---|---|---|
| 谁能用 | 任何持有令牌的人 | 只有同时持有私钥的人 |
| 令牌泄露后果 | 可被直接重放 | 基本无法使用 |
| 客户端要求 | 无 | 生成并保管密钥对 |
| 额外开销 | 无 | 每次请求多一次签名与验签 |
PKCE 保护的是"授权码换令牌"那一步,防授权码被截胡;DPoP 保护的是之后每一次资源请求,两者管的是不同环节,常一起用。mTLS(双向 TLS)也能做令牌绑定,安全性很好,但要维护证书体系,在移动端和浏览器里部署麻烦;DPoP 只在应用层加一对密钥,门槛低得多。另外它虽然也叫 proof,方向却相反:不是服务端签名给客户端验,而是客户端签名给服务端验。
对从业者和普通人的意义
做身份认证和网关的工程师要注意:接入 DPoP 意味着授权服务器和资源服务器都得支持校验,还要处理时间窗口、重放缓存、时钟偏差这些细节,排障成本得提前算进去,各家支持情况以官方文档为准。
对普通人来说,好处是隐形的:手机丢了、某个 App 的令牌被人顺走,对方也没法拿着它去读你的数据。安全模型从"谁捡到钥匙谁开门",变成了"钥匙必须和锁配对"。
