DAT (Distributed Access Token)
DAT 的引入背景
如今许多系统都采用了 JWT,但在实际的生产环境中却存在以下结构性的局限。
为了解决这些问题,我们设计了全新的令牌规范 DAT。
🧩 安全规范的碎片化与强制性不足
JWT 虽然提供了 JWE 这样的加密标准,但并不强制使用。
因此在许多开发环境中,加密被省略,或者以非标准的方式传输数据,从而引发安全漏洞。
🔑 使用静态密钥(Static Key)带来的安全风险
由于签名密钥的轮换(Key Rolling)并非强制要求,长期使用单一密钥的情况屡见不鲜。这可能导致密钥一旦被窃取,整个系统的安全性随之崩塌;事实上,大型电商网站就曾因此发生过入侵事故。
📉 开销导致的性能下降
JWT 在每次请求时都要经历 JSON 解析过程,消耗相当可观的 CPU 资源。在要求高性能的环境中,这种解析开销可能成为整个系统的瓶颈。
DAT 的核心理念
DAT 的设计原则是:安全不应是可选项而应是强制项,性能则不容妥协。
⚡ 轻量且快速
如上所示,DAT 只有以点(.)分隔的五个固定字段。由于字段的位置由规范确定,因此无需 JSON 解析,只要找到分隔符就能切分出各个值。
🔐 强制的安全性
DAT 在数据传输时,将明文(Plain)区域与加密(Secure) 区域进行了物理分离。
敏感信息必须被强制加密,并且整个过程都由证书中声明的标准算法(ECDSA、AES-GCM 等)加以保护。
加密算法由证书决定,而非由令牌决定。令牌中不含任何算法信息,因此不存在源自 JWT alg 头部的算法混淆攻击面。
🔄 强制的密钥轮换
DAT 证书不仅管理令牌的签发与过期,还直接管理密钥的生命周期。
证书在规范层面就写死了“从何时到何时可以签发”,一旦超出该期限,就无法再用该证书生成新的令牌。因此,管理员因疏忽而把同一把密钥用上好几年的情况,从结构上就不会发生。
⏱️ 签发期限与有效期的分离
“证书可以签发令牌的期限”与“已签发令牌的存活期限”是两个不同的值。
得益于此,即使证书停止签发之后,已经发出的令牌仍能走完自己的寿命,而集群则在这段时间里自然地过渡到下一张证书。
认证机制比较
| 分类 | DAT | JWT | Session |
|---|---|---|---|
| 认证方式 | 分布式验证 | 分布式验证 | 集中式 |
| 数据结构 | Raw Bytes (基于固定偏移量) | JSON (基于 Key-Value 文本) | Serialized Object (对象序列化) |
| 解析机制 | 字节数据即时映射 | 需要 JSON 解析和类型转换 | 需要对象反序列化和 I/O |
| 处理性能 | 最高(解析开销最小化) | 中等(依赖 JSON 处理性能) | 低(网络/磁盘 I/O) |
| 加密 | 默认内置 | 需要单独实现 JWE(复杂) | 不适用 |
| 密钥管理 | 系统强制轮换(强制安全) | 需要自行实现(存在疏于管理的风险) | 不适用 |
| 密钥有效期 | 在密钥规范中强制明确 | 可选(未管理时永久有效) | 由中央服务器管理 |
| 算法选择 | 由证书决定(令牌中不含) | 令牌头部的 alg | 不适用 |
| 过期时间 | 规范上的必填字段 | 可选声明(exp) | 由服务器管理 |