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?
当前回答
这个答案是在两位高级开发人员(约翰·布莱顿和大卫·詹内斯)的帮助下得出的。
使用刷新令牌的主要原因是减少攻击面。
假设没有刷新键,让我们来看看这个示例:
一座大楼有80扇门。所有车门都用同一把钥匙打开。钥匙每30分钟更换一次。在30分钟结束时,我必须把旧钥匙交给钥匙制造商,并获得一把新钥匙。
如果我是黑客,拿到了你的钥匙,那么在30分钟结束后,我会把它快递给钥匙制造商,并获得一把新钥匙。无论换钥匙,我都能连续打开所有车门。
问:在这30分钟里,我有多少次破解钥匙的机会?每次你使用密钥时,我都有80次黑客攻击的机会(把这看作是发出网络请求并传递访问令牌以识别自己)。这是80倍的攻击面。
现在让我们来看看同一个例子,但这次我们假设有一个刷新键。
一座大楼有80扇门。所有车门都用同一把钥匙打开。钥匙每30分钟更换一次。要获取新密钥,我无法传递旧的访问令牌。我只能通过刷新键。
如果我是黑客并得到了你的密钥,我可以使用它30分钟,但在30分钟结束时,将它发送给密钥制作者没有任何价值。如果我这样做了,那么密钥制作者只会说“此令牌已过期。您需要刷新令牌。”为了能够扩展我的黑客攻击,我必须将信使黑客攻击给密钥制作者。信使有一个不同的密钥(将其视为刷新令牌)。
问题:在30分钟内,我有多少次违反刷新键的黑客攻击机会?80? 不,我只有一次黑客攻击机会。在这段时间里,快递员与钥匙制造商进行沟通。这是1X攻击面。我确实有80次破解钥匙的机会,但30分钟后就不行了。
服务器将根据凭证和JWT的签名(通常)验证访问令牌。
访问令牌泄漏是不好的,但一旦过期,它对攻击者不再有用。刷新令牌泄漏的情况要糟糕得多,但估计可能性较小。(我认为,刷新令牌泄漏的可能性是否比访问令牌泄漏的概率低得多,这是一个问题,但这就是想法。)
重点是访问令牌被添加到您发出的每个请求中,而刷新令牌仅在刷新流期间使用所以MITM看到代币的可能性很小
频率有助于攻击者。像SSL中的潜在安全漏洞、客户端中的潜在的安全漏洞以及服务器中潜在的安全缺陷等令人心碎的漏洞都使泄漏成为可能。
此外,如果授权服务器与处理其他客户端请求的应用服务器分离,那么该应用服务器将永远不会看到刷新令牌。它只会看到不会持续很久的访问令牌。
分隔有利于安全。
最后但并非最不重要的刷新令牌可以被旋转。意思是“每次客户端请求将刷新令牌交换为新的访问令牌时,都会返回新的刷新令牌”。随着刷新令牌的不断交换和失效,威胁降低。举个例子:令牌通常在TTL之后过期,通常是一小时。
刷新令牌并不总是,但通常会在使用时被撤销,并发出新的令牌。这意味着,如果您在检索新的刷新令牌时发生网络故障,那么下次发送该刷新令牌时,它将被视为已吊销,您必须登录。
有关旋转的更多信息,请参阅此处和此处
总结
降低频率分区令牌的轮换(更快的失效)和更精细的管理(过期时间或请求数量)。
所有这些都有助于减轻威胁
关于这个问题的另一个观点,请看这个令人敬畏的答案
刷新令牌与什么无关?
通过刷新令牌更新/撤销访问级别的能力是选择使用刷新令牌的一个副产品,否则独立访问令牌可能会被撤销,或在其过期时修改其访问级别,用户将获得新令牌
其他回答
由于刷新和访问令牌是加载了大量语义的术语,因此术语转换可能会有所帮助?
可撤销令牌-必须通过授权服务器检查的令牌可以链接(请参阅RTR-刷新令牌循环)可以用于创建不可撤销的令牌,但也可以直接使用(当卷很小且检查不会成为负担时)可以使用很长时间,但这取决于用户需要多久才能获得新的凭据(用户名/密码)可以在RTR或任何其他可疑行为上无效不可撤销令牌-自包含的令牌,不需要通过授权服务器进行检查适用于大数据、分布式服务器/api调用的横向扩展应该是短暂的(因为是不可撤销的)
2020年,浏览器中也可以存在刷新令牌(最初为后端系统提供),这一点已被接受-请参见https://pragmaticwebsecurity.com/articles/oauthoidc/refresh-token-protection-implications.因此,焦点从“可刷新性”(在没有用户的情况下,后端如何延长对api的访问)转向了“可撤销性”。
因此,在我看来,将刷新令牌读取为可撤销令牌并将访问令牌读取为不可撤销令牌(可能是快速过期不可撤销的令牌)看起来更安全。
作为2021良好实践的附带说明,系统始终可以从可撤销的令牌开始,并在授权服务器压力增加时转向不可撤销的。
刷新令牌和访问令牌只是术语。
这个小小的类比可以帮助巩固使用访问令牌和刷新令牌背后的理论基础:
假设Alice通过邮寄给Bob一张支票,该支票可以在出票后1小时内兑现(假设),否则银行不会兑现。但Alice还在给银行的邮件中附上了一张纸条,要求银行接受并兑现支票,以防支票延迟(在规定范围内)
当Bob收到这张支票时,如果他看到这张支票被篡改(令牌篡改),他将自己丢弃这张支票。如果没有,他可以把它拿到银行兑现。在这里,当银行注意到发行时间超过了1小时的时限,但看到Alice的签名通知,要求银行在规定的延迟范围内兑现。
看到这张纸条后,银行会尝试验证签名的消息,并检查Alice是否仍然具有正确的权限。如果是,银行将支票兑现。鲍勃现在可以向爱丽丝承认这一点了。
虽然不是非常准确,但这个类比可以帮助您注意到处理事务所涉及的不同部分:
Alice(发件人-客户)Bob(接收者-资源服务器)银行(授权服务器)验证过程(数据库访问)支票(访问令牌)备注(刷新令牌)
主要是,为了优化可伸缩性,我们希望减少对Auth Server以及最终对数据库的API调用次数。我们需要在方便和安全之间取得适当的平衡。
注意:与链中的资源服务器相比,让Auth服务器更早地响应请求当然更常见。
为了消除一些混淆,您必须了解客户机密码和用户密码的角色,这两个角色非常不同。
客户端是应用程序/网站/程序/。。。,该服务器希望通过使用第三方身份验证服务对用户进行身份验证。客户端机密是一个(随机)字符串,该字符串对此客户端和身份验证服务器都是已知的。使用这个秘密,客户端可以通过身份验证服务器识别自己,从而获得请求访问令牌的授权。
要获取初始访问令牌和刷新令牌,需要:
用户ID用户密码客户端ID客户机密
要获取刷新的访问令牌,客户端使用以下信息:
客户端ID客户机密刷新令牌
这清楚地表明了区别:在刷新时,客户端通过使用其客户端密钥来获得刷新访问令牌的授权,因此可以使用刷新令牌而不是用户ID+密码来重新验证用户。这有效地防止了用户必须重新输入他/她的密码。
这也表明,丢失刷新令牌是没有问题的,因为客户机ID和机密是未知的。它还表明,保持客户机ID和客户机机密是至关重要的。
为了理解这个问题的答案,我们需要了解两点。
第一点是,有时用户的访问令牌可能会在用户不知情的情况下被盗。由于用户不知道攻击,他们将无法手动通知我们。然后,就我们给攻击者完成攻击的时间(机会)而言,15分钟和一整天之间会有巨大的差异。因此,这就是我们需要每“短时间”(例如,每15分钟)“刷新”访问令牌的原因,我们不想将此操作推迟很长时间(例如,一整天)。因此,OP在问题中所说的显然不是一个选项(将访问令牌的到期时间延长到刷新令牌的有效时间)。
因此,我们至少还有以下两个选择:
要求每个用户每隔一段时间重新输入他们的凭据,以便为他们提供新的访问令牌。但显然,这不是一个流行的选项,因为它会困扰用户。使用刷新令牌。阅读下面的第二点,以了解其工作原理(背后的逻辑)。
第二点需要理解的是,因为我们已经将访问令牌与刷新令牌分开,现在可以以“不同的方式”发送刷新令牌,因此我们可以以攻击者的JavaScript(通常是客户端代码)无法访问的方式发送它,例如,使用httpOnly标记:
HttpOnly Cookie是添加到浏览器Cookie中的标记,用于阻止客户端脚本访问数据。来源
在生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险。HttpOnly cookie于2002年由Microsoft Internet Explorer开发人员针对Internet Explorer 6 SP1首次实现。来源(感谢IE!)
因此,尽管攻击者仍然可以窃取访问令牌(强烈建议将其保存在RAM中,而不是本地存储等易受攻击的地方),但他们将无法窃取刷新令牌。因此,如果攻击者窃取了一个人的访问令牌,他们只有很短的时间滥用它(15分钟?比一整天好得多!),然后一旦它过期,他们就没有机会自己获得新的令牌。
这个答案是在两位高级开发人员(约翰·布莱顿和大卫·詹内斯)的帮助下得出的。
使用刷新令牌的主要原因是减少攻击面。
假设没有刷新键,让我们来看看这个示例:
一座大楼有80扇门。所有车门都用同一把钥匙打开。钥匙每30分钟更换一次。在30分钟结束时,我必须把旧钥匙交给钥匙制造商,并获得一把新钥匙。
如果我是黑客,拿到了你的钥匙,那么在30分钟结束后,我会把它快递给钥匙制造商,并获得一把新钥匙。无论换钥匙,我都能连续打开所有车门。
问:在这30分钟里,我有多少次破解钥匙的机会?每次你使用密钥时,我都有80次黑客攻击的机会(把这看作是发出网络请求并传递访问令牌以识别自己)。这是80倍的攻击面。
现在让我们来看看同一个例子,但这次我们假设有一个刷新键。
一座大楼有80扇门。所有车门都用同一把钥匙打开。钥匙每30分钟更换一次。要获取新密钥,我无法传递旧的访问令牌。我只能通过刷新键。
如果我是黑客并得到了你的密钥,我可以使用它30分钟,但在30分钟结束时,将它发送给密钥制作者没有任何价值。如果我这样做了,那么密钥制作者只会说“此令牌已过期。您需要刷新令牌。”为了能够扩展我的黑客攻击,我必须将信使黑客攻击给密钥制作者。信使有一个不同的密钥(将其视为刷新令牌)。
问题:在30分钟内,我有多少次违反刷新键的黑客攻击机会?80? 不,我只有一次黑客攻击机会。在这段时间里,快递员与钥匙制造商进行沟通。这是1X攻击面。我确实有80次破解钥匙的机会,但30分钟后就不行了。
服务器将根据凭证和JWT的签名(通常)验证访问令牌。
访问令牌泄漏是不好的,但一旦过期,它对攻击者不再有用。刷新令牌泄漏的情况要糟糕得多,但估计可能性较小。(我认为,刷新令牌泄漏的可能性是否比访问令牌泄漏的概率低得多,这是一个问题,但这就是想法。)
重点是访问令牌被添加到您发出的每个请求中,而刷新令牌仅在刷新流期间使用所以MITM看到代币的可能性很小
频率有助于攻击者。像SSL中的潜在安全漏洞、客户端中的潜在的安全漏洞以及服务器中潜在的安全缺陷等令人心碎的漏洞都使泄漏成为可能。
此外,如果授权服务器与处理其他客户端请求的应用服务器分离,那么该应用服务器将永远不会看到刷新令牌。它只会看到不会持续很久的访问令牌。
分隔有利于安全。
最后但并非最不重要的刷新令牌可以被旋转。意思是“每次客户端请求将刷新令牌交换为新的访问令牌时,都会返回新的刷新令牌”。随着刷新令牌的不断交换和失效,威胁降低。举个例子:令牌通常在TTL之后过期,通常是一小时。
刷新令牌并不总是,但通常会在使用时被撤销,并发出新的令牌。这意味着,如果您在检索新的刷新令牌时发生网络故障,那么下次发送该刷新令牌时,它将被视为已吊销,您必须登录。
有关旋转的更多信息,请参阅此处和此处
总结
降低频率分区令牌的轮换(更快的失效)和更精细的管理(过期时间或请求数量)。
所有这些都有助于减轻威胁
关于这个问题的另一个观点,请看这个令人敬畏的答案
刷新令牌与什么无关?
通过刷新令牌更新/撤销访问级别的能力是选择使用刷新令牌的一个副产品,否则独立访问令牌可能会被撤销,或在其过期时修改其访问级别,用户将获得新令牌