OAuth 2.0协议草案的第4.2节指出,授权服务器可以返回access_token(用于通过资源验证自己)和refresh_token,refresh_taken纯粹用于创建新的access_token:
https://www.rfc-editor.org/rfc/rfc6749#section-4.2
为什么两者都有?为什么不让access_token和refresh_token一样长,而不设置refresh_taken?
OAuth 2.0协议草案的第4.2节指出,授权服务器可以返回access_token(用于通过资源验证自己)和refresh_token,refresh_taken纯粹用于创建新的access_token:
https://www.rfc-editor.org/rfc/rfc6749#section-4.2
为什么两者都有?为什么不让access_token和refresh_token一样长,而不设置refresh_taken?
当前回答
让我们考虑一个系统,其中每个用户链接到一个或多个角色,每个角色链接到一种或多种访问权限。可以缓存这些信息以获得更好的API性能。但是,用户和角色配置可能会发生变化(例如,可能会授予新的访问权限,或者可能会撤销当前的访问权限),这些都应该反映在缓存中。
我们可以为此目的使用访问和刷新令牌。当使用访问令牌调用API时,资源服务器检查缓存的访问权限。如果有任何新的访问许可,则不会立即反映。一旦访问令牌过期(例如在30分钟内)并且客户端使用刷新令牌生成新的访问令牌,就可以使用来自DB的更新的用户访问权限信息来更新缓存。
换句话说,我们可以将昂贵的操作从使用访问令牌的每次API调用转移到使用刷新令牌生成访问令牌的事件。
其他回答
这些答案都没有找到刷新令牌存在的核心原因。显然,您总是可以通过将客户端凭据发送到身份验证服务器来获得新的访问令牌/刷新令牌对——这就是您首先获得它们的方式。
因此,刷新令牌的唯一目的是限制通过网络发送到身份验证服务的客户端凭据的使用。访问令牌的TTL越短,就越需要使用客户端凭据来获取新的访问令牌,因此攻击者就越有机会破坏客户端凭据(尽管如果使用非对称加密发送客户端凭据,这可能非常困难)。因此,如果您有一个一次性刷新令牌,您可以使访问令牌的TTL任意小,而不影响客户端凭据。
为了进一步简化B T的答案:当您通常不希望用户再次输入凭据,但仍然希望能够撤销权限(通过撤销刷新令牌)时,请使用刷新令牌
您不能撤销访问令牌,只能撤销刷新令牌。
而刷新令牌由授权服务器保留。访问令牌是自包含的,因此资源服务器可以在不存储它的情况下对其进行验证,从而节省了验证时的检索工作。讨论中缺少的另一点来自rfc6749#page-55
“例如,授权服务器可以使用刷新令牌每次访问都会发出新的刷新令牌的循环令牌刷新响应。上一个刷新令牌无效,但由授权服务器保留。如果刷新令牌为攻击者和合法客户端,其中一个将显示无效的刷新令牌,该令牌将通知授权服务器违规。"
我认为使用刷新令牌的关键在于,即使攻击者设法获得了刷新令牌、客户端ID和秘密组合。如果每次刷新请求都会产生新的访问令牌和刷新令牌,则可以通过后续调用从攻击者处获取新的访问标志。
为了消除一些混淆,您必须了解客户机密码和用户密码的角色,这两个角色非常不同。
客户端是应用程序/网站/程序/。。。,该服务器希望通过使用第三方身份验证服务对用户进行身份验证。客户端机密是一个(随机)字符串,该字符串对此客户端和身份验证服务器都是已知的。使用这个秘密,客户端可以通过身份验证服务器识别自己,从而获得请求访问令牌的授权。
要获取初始访问令牌和刷新令牌,需要:
用户ID用户密码客户端ID客户机密
要获取刷新的访问令牌,客户端使用以下信息:
客户端ID客户机密刷新令牌
这清楚地表明了区别:在刷新时,客户端通过使用其客户端密钥来获得刷新访问令牌的授权,因此可以使用刷新令牌而不是用户ID+密码来重新验证用户。这有效地防止了用户必须重新输入他/她的密码。
这也表明,丢失刷新令牌是没有问题的,因为客户机ID和机密是未知的。它还表明,保持客户机ID和客户机机密是至关重要的。
由于刷新和访问令牌是加载了大量语义的术语,因此术语转换可能会有所帮助?
可撤销令牌-必须通过授权服务器检查的令牌可以链接(请参阅RTR-刷新令牌循环)可以用于创建不可撤销的令牌,但也可以直接使用(当卷很小且检查不会成为负担时)可以使用很长时间,但这取决于用户需要多久才能获得新的凭据(用户名/密码)可以在RTR或任何其他可疑行为上无效不可撤销令牌-自包含的令牌,不需要通过授权服务器进行检查适用于大数据、分布式服务器/api调用的横向扩展应该是短暂的(因为是不可撤销的)
2020年,浏览器中也可以存在刷新令牌(最初为后端系统提供),这一点已被接受-请参见https://pragmaticwebsecurity.com/articles/oauthoidc/refresh-token-protection-implications.因此,焦点从“可刷新性”(在没有用户的情况下,后端如何延长对api的访问)转向了“可撤销性”。
因此,在我看来,将刷新令牌读取为可撤销令牌并将访问令牌读取为不可撤销令牌(可能是快速过期不可撤销的令牌)看起来更安全。
作为2021良好实践的附带说明,系统始终可以从可撤销的令牌开始,并在授权服务器压力增加时转向不可撤销的。