惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
Last Week in AI
Last Week in AI
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
月光博客
月光博客
腾讯CDC
Engineering at Meta
Engineering at Meta
博客园 - Franky
Vercel News
Vercel News
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
GbyAI
GbyAI
B
Blog
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog

博客园 - 张占岭

keycloak~通过用户ID直接置换token keycloak~缓存对象的介绍与作用 wso2-apim-mcp2改版分析 mcp1和mcp2对比 为什么前端项目使用ts比js要多了 多个IDP的用户联合方案的分析 apisix~forward-auth外部认证 apisix~response-rewrite响应头重写 springboot~关于构造方法注入和字段注入的选择 apisix~OpenResty各阶段的介绍 keycloak~aud受众字段的作用及如何生成 wso2~关于workbuddy中mcp在wso2中的授权端点 k8s~避免调度资源碎片化 WEB安全~csrf介绍 WEB安全~csp的介绍 什么是中间人攻击 WEB安全~xss的介绍 k8s~pod资源限制和JVM的XMX配置 关于对wso2和keycloak的token交换的调研 keycloak~实现OAuth 2.0 Token Exchange backstage~实体的介绍及它们的关系 backstage~openapi的接入与protobuf的对比 backstage~将java服务添加到backstage backstage~对接github和gitlab backstage~开始一个backstage应用 apisix~graphQL的支持 wso2几个核心项目介绍 docker~BuildKit的介绍 k8s~secret资源的使用 算法~时间戳计算两个日期是否为同天同时同分
WEB安全~DPoP的介绍
张占岭 · 2026-05-02 · via 博客园 - 张占岭

Demonstrating Proof of Possession (DPoP) 是一个现代 OAuth 2.0 安全扩展(定义于 RFC 9449),旨在防止访问令牌被窃取后用于重放攻击,它通过密码学手段将令牌“绑定”到发起请求的特定客户端上。

1. 核心原理:从“持有者”到“发送方约束”

传统的 OAuth 2.0 令牌是不记名令牌。这意味着只要 possessing the token,任何客户端(如浏览器、API 调用工具)都可以使用它。如果令牌在传输过程中被窃取或日志泄露,攻击者可以立即冒充合法用户。

DPoP 将不记名令牌转变为发送方约束令牌,其原理如下:

  1. 生成密钥对:客户端在发起授权请求前,首先生成一个临时的非对称密钥对(公钥和私钥)。
  2. 签署证明:客户端使用私钥生成一个 JSON Web Token (JWT),这个 JWT 称为 DPoP Proof。该 JWT 包含了当前的 HTTP 方法、目标 URL 和时间戳等信息。
  3. 绑定公钥:客户端将 DPoP Proof 发送给授权服务器。服务器验证签名后,将公钥嵌入到颁发的 Access Token 中。
  4. 验证请求:当客户端使用 Access Token 请求资源时,必须再次生成一个新的 DPoP Proof。资源服务器不仅校验 Token 是否过期,还必须校验该 Proof 中的签名是否与 Token 中绑定的公钥匹配,且 Proof 中的 URL 与请求 URL 一致。

2. 技术实现细节

实施 DPoP 需要在 HTTP 请求头中携带特定的 JWT:

  • 请求头:客户端必须添加名为 DPoP 的 Header。
  • JWT 结构
    • Header:必须包含 typ: "dpop+jwt",以及用于验证的 jwk(公钥)字段。
    • Payload:必须包含以下声明以防止重放和劫持:
      • htm:HTTP 方法(如 POSTGET)。
      • htu:请求的 URL(必须为完整 URL,不含片段)。
      • jti:唯一标识符(每次请求都必须随机生成,防止重放攻击)。
      • iat / exp:签发时间和过期时间(有效期通常很短,如 60 秒)。
      • athAccess Token Hash(当请求资源服务器时必须包含),值是 Access Token 的 SHA-256 哈希值,用于确保该 DPoP Proof 只针对当前的 Access Token 有效。

3. 使用场景与优势

DPoP 主要用于无法使用或难以部署 mTLS(双向 TLS)的场景,特别是公共客户端:

  1. 单页应用:由于代码运行在浏览器中,无法像后端服务那样持有客户端证书,DPoP 通过 Web Crypto API 在浏览器内生成密钥对,可以极大缓解 XSS 攻击导致的令牌泄露风险。
  2. 移动应用/原生应用:DPoP 可以利用操作系统提供的安全硬件(如 Keystore/Keychain)来存储私钥,确保私钥不可导出,从而防止恶意应用读取令牌后伪造请求。
  3. 金融级 API:在 FAPI 2.0 等高安全要求的标准中,DPoP 是实现发送方约束令牌的推荐方式。

4. 安全提示

  • 配合 TLS 使用:DPoP 并不能替代 HTTPS。它解决了“令牌被窃取后滥用”的问题,但不能解决中间人攻击窃取原始数据的问题,因此必须始终配合 TLS 使用。
  • 防重放:虽然 DPoP 能防止令牌被复制后使用,但如果攻击者通过 XSS 直接在用户浏览器中执行代码,依然可以利用“合法”的客户端环境发送恶意请求。因此 DPoP 不能取代输入验证和内容安全策略(CSP)。

总而言之,DPoP 是一种深度的防御机制,它让 OAuth 2.0 的令牌脱离了“谁捡到谁使用”的不安全状态。

如果你正在开发 SPA 或移动应用,需要我详细介绍如何在具体代码中生成 DPoP Proof JWT 吗?