Biscuit 授权
Biscuit 是一种新的授权令牌格式,旨在通过支持“衰减”来改进 JWT 和 macaroons——也就是可以离线派生出更受限制、有效期更短的令牌,同时仍能通过公钥验证。评论者讨论了它如何支持能力风格访问控制、委托以及按请求最小化,但也指出撤销仍然需要有状态机制,而且 Biscuit 的生态与规范相比成熟标准还不够成熟。很多人认为,当你需要丰富、去中心化的授权逻辑时,它是一个很有前景的选择;而对于简单、中心化的认证场景,更简单的 JWT 或会话令牌仍然更合适。
概述
- Biscuit 被介绍为一种能力风格的授权令牌,具备离线衰减、公钥验证,以及嵌入式的基于逻辑的授权语言。
- 一些评论者认为这个概念“很巧妙”,并且喜欢文档的清晰度,但也指出其中缺少对非高亮权衡的讨论,以及缺少“何时不该使用它”的指导。
与 JWT、OAuth2、Macaroons 的比较
- JWT:
- 优点:可简单传递少量声明,支持广泛,无需数据库调用即可轻松验证角色/权限。
- 缺点:历史上的坑(算法处理、“none” 算法)、与简单的加密会话 cookie 相比复杂度高、攻击面大。
- Biscuit 试图通过更严格的规范和测试套件来避免 JWT 的问题,但令牌可能更大、验证更慢(每个区块一条签名)。
- OAuth2:
- 标准委托是中心化且在线的;无法做到真正的离线衰减/最小化。
- Biscuit 可以作为一种访问令牌格式与 OAuth/OIDC 集成。
- Macaroons:
- 概念上类似(衰减、限制条件),但 macaroons 是抽象的、基于对称密钥的,并且被认为更难实现和使用。
- Biscuit 增加了具体编码(protobuf)、逻辑语言以及公钥验证。
衰减与委托
- 离线衰减被普遍视为 Biscuit 最主要的区别点:
- 从一个强大的令牌出发,持有者可以派生出更受限制的令牌(更小的范围、更短的有效期等),而无需联系 IdP。
- 被认为对微服务中的按请求最小化和委托特别有用。
撤销与无状态性
- Biscuit 使用按区块撤销 ID;撤销某个区块会撤销该令牌以及其所有派生令牌。
- 实际撤销仍然需要状态(撤销列表、缓存),这与 JWT 的根本问题相同。
- 多位评论者强调,“完全无状态的撤销”是不可能的;最多只能把所需状态集中并尽量减少。
授权语言与策略 DSL
- Biscuit 类似 Datalog 的语言把事实和检查都放在令牌内部以及验证器一侧。
- 对
check if与allow if/deny if之间的区别存在一些困惑,说明它有一定学习曲线。 - 少数人认为这是一种很有前景的“策略 DSL”方法,可用于描述谁/什么/何时/何地/为何,但也指出存在过度复杂化的风险。
生态、成熟度与实现
- 已有多个语言的实现,通常通过 Rust 或 WASM 绑定;一些库的进展较慢。
- 存在符合性测试套件,但规范中的某些部分仍标记为 TODO,边界情况也还在演进。
- 担忧包括不同库之间行为不一致、用户自定义的运行时限制,以及缺少模糊测试/属性测试。
- 共识:潜力很强,但生态系统仍在成熟过程中。