知识卡片

授权码模式为什么要先换授权码再换令牌

普通读书笔记卡

内容

[[OAuth2四种授权模式对应的信任层级差异]]里授权码模式多绕了一步——先给 第三方应用一个一次性的授权码,再让它拿授权码换令牌——这个设计不是多余 的繁琐,而是精确针对一个具体风险点:客户端转向(通常是HTTP 302重定向) 对用户是可见的,这意味着授权码在跳转过程中有可能暴露给用户本人或用户 机器上的其他程序。如果直接把令牌放在这次跳转里返回,暴露的就是能直接 访问资源的令牌本身;而现在暴露的只是一个授权码,授权码本身换不到任何 资源——真正能兑现授权码的密钥是ClientSecret,这个值只保存在第三方应用 自己的服务器上,从未经过浏览器跳转,因此不会被这次暴露连带泄漏。这个 设计体现了一个通用的安全原则:把”可能暴露的信息”和”能直接造成损害的 凭证”拆成两个不同的东西,即使前者泄漏了,后者依然安全。这也解释了为 什么隐式授权模式(跳过这一步、令牌直接经Fragment返回)天然比授权码模式 风险更高——它把这两者合而为一了。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第5章"架构安全性" 5.2.2节"OAuth 2"(源文件:_epub-src对应OEBPS/Text/chapter62.xhtml) - 结论依据:原文明确解释"为什么要先发放授权码,再用授权码换令牌"的 设计意图:客户端转向对用户可见,授权码可能暴露,但由于用户没有 ClientSecret,仅凭授权码无法换取令牌,因此避免了令牌在跳转过程中被 泄漏的风险,直接支撑本卡片结论。 - 原始内容:这是因为客户端转向(通常就是一次HTTP 302重定向)对于用户是 可见的,换言之,授权码可能会暴露给用户以及用户机器上的其他程序,但由于 用户并没有ClientSecret,而只有授权码是无法换取到令牌的,所以避免了令牌 在传输转向过程中被泄漏的风险。