oauth2.0 在JWT中使用刷新令牌的意义是什么?实现它们的正确方法是什么?

qv7cva1a  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(182)

我一直在浏览StackOverflow和其他资源,以获得关于如何在JWT流中实现刷新令牌的确切指南。几乎所有人给予简要解释了访问令牌和刷新令牌之间的差异以及为什么需要它们,但是,他们通常会得出一个解决方案,通常只是简单地使用访问令牌添加额外的步骤。
我的理解是,JWT的全部要点是无状态的,这意味着我们不需要使用替代解决方案,例如需要检索和更新数据库中的项目的会话。JWT允许我们发送一个加密的令牌,在服务器端创建,可以被任何人解码,但是,只有我们可以验证我们实际上创建了这样的令牌。这种方法的主要缺陷是,如果攻击者获得对用户令牌的访问权限,他们将拥有无法撤销服务器端的无限访问权限,这是一个需要解决的关键缺陷。这就是刷新令牌发挥作用的地方,也是我相信发生大量混乱和错误信息的地方。
访问令牌是用于直接访问受保护资源的短期令牌。这导致了很大的安全性,因为攻击者只有有限的时间来检索受保护的资源,但是,它会导致可怕的用户体验。刷新令牌是为了平衡用户体验和安全性而引入的,只要我们有一个有效的刷新令牌,我们就可以刷新我们的访问令牌。
以下是我需要帮助解决的问题:
1.如何使用JWT撤销刷新令牌?
在决定使用刷新令牌时,我看到的主要观点是撤销访问和使刷新令牌无效的能力,阻止拥有该刷新令牌的每个人检索访问令牌。我不相信这可以无状态地完成,所以我们需要在数据库中存储这些刷新令牌。我们是否为每个用户的所有刷新令牌专门创建一个表?每个用户是否有一个刷新令牌?
1.是什么阻止攻击者检索刷新令牌并将其用作访问令牌?
如果我作为攻击者检索您的刷新令牌,我所需要做的就是发送请求以刷新/获取访问令牌,并在每次新的访问令牌过期时继续执行此操作,并可以无限制地访问您的受保护资源。为了扩展,是什么阻止我去别人的计算机和复制刷新令牌到我的计算机上,并做正是我刚才提到的。* 我可以理解没有考虑到这一点,因为它几乎相同的人写他们的密码旁边的计算机 *.
1.刷新令牌是否应一次性使用?
我可以看到这是非常安全的,并已看到它在其他职位提到,但是,如何是可能的,而不需要一个数据库。一旦我们发布了一个刷新令牌,如果不发布一个新令牌或将其存储在数据库中并在那里编辑它,我们就不能编辑相同的令牌。
1.我可以在数据库中存储一个唯一的ID,然后将其添加到刷新令牌中吗?
我还没有看到任何地方讨论这个问题,所以它让我相信有一个缺陷,我没有看到。当用户登录时,他们被授予刷新和访问令牌,该刷新令牌包含存储在用户记录中的ID。当我们用刷新令牌刷新访问令牌时,我们检查存储在数据库中的ID和刷新令牌中的ID是否匹配。如果是,则授予新的访问令牌;如果不是,则拒绝请求。这应该允许我们通过改变该unqiue ID来使之前发布的每个刷新令牌无效,同时允许具有新ID的新刷新令牌有效。
我想我得到的很多东西是,不可能无状态地合并刷新令牌。另外,如果您知道关于使用JWT实现刷新令牌的确切指南,请不要犹豫删除该链接。
编辑:对于任何人来说,this视频有助于解释流程。我将继续开放的职位,但是,因为仍然有一些问题没有回答。

aor9mmx1

aor9mmx11#

人们可以说JWT***是一个有状态的对象。它包含在一定时间内为真的声明。
此外,如果JWT是加密的,那么任何人都不应该解码它。这就破坏了加密的意义以使数据除了具有特定秘密来解密它的那些人之外对每个人都不可读。你的意思是里面有签名。这个签名确保了内容没有被篡改。任何拥有公钥的人都可以这样做,因为它是公开的,所以假设它是真的。
访问令牌不一定是短期的,但正如您所指出的,它提供了更好的安全性。因此,一般来说,最好保持寿命较短。
但是,如果用户必须在短生命周期结束时重复登录,这将是非常烦人的。这就是刷新令牌的用武之地。
客户端可以获得新的访问令牌,而无需用户重新验证和重新授权访问。
1.如何使用JWT撤销刷新令牌?
授权服务器可以将特定令牌标记为损坏或无效。当客户端请求新的访问令牌时,授权服务器将检查该特定令牌是否已被标记为无效,如果已被标记为无效,则该请求将被拒绝。
1.是什么阻止攻击者检索刷新令牌并将其用作访问令牌?
TLS和客户端身份验证。首先,客户端和授权服务器之间的通信应该通过TLS进行,以便加密。第二,当授权服务器得到发出新的访问令牌的请求并且被呈现刷新令牌时,授权服务器应该对提交请求的客户端进行认证。
如果客户端类型是机密的,或者客户端被授予了客户端凭证(或分配了其他身份验证要求),则客户端必须按照第3.2.1节中的描述与授权服务器进行身份验证。
RFC 6749-第6节
1.刷新令牌是否应一次性使用?
严格来说,最初的规范并没有要求它是一次性使用的。然而,是的,刷新令牌应该在它被用于最佳安全性之后无效。授权服务器可以在使用先前发布的刷新令牌时发布新的刷新令牌。这缩小了攻击向量,在概念上类似于缩短访问令牌寿命。但是,它不能阻止恶意参与者在真实的的客户端之前使用刷新令牌。
授权服务器可能会发出一个新的刷新令牌,在这种情况下,客户端必须丢弃旧的刷新令牌并用新的刷新令牌替换它。授权服务器可以在向客户端发出新的刷新令牌后撤销旧的刷新令牌。如果发出了新的刷新令牌,则刷新令牌的范围必须与请求中客户端包含的刷新令牌的范围相同
RFC 6749-第6节
1.我可以在数据库中存储一个唯一的ID,然后将其添加到刷新令牌中吗?
原始规范没有指定必须如何执行,但它确实提供了如何检测刷新令牌滥用的示例:
每当客户端标识可以被认证时,授权服务器必须验证刷新令牌和客户端标识之间的绑定。当客户端身份验证不可能时,授权服务器应该部署其他方法来检测刷新令牌滥用。
例如,授权服务器可以采用刷新令牌轮换,其中随着每个访问令牌刷新响应而发布新的刷新令牌。先前的刷新令牌无效,但由授权服务器保留。如果刷新令牌被破坏并且随后被攻击者和合法客户端两者使用,则其中一个将呈现无效的刷新令牌,这将通知授权服务器违规。

相关问题