刷新令牌有什么意义?

我必须承认我有这个问题很长一段时间,从来没有真正明白。

说auth令牌就像一个安全的关键,当它到期时,它不再可用。 现在我们得到一个神奇的刷新标记,它可以用来获得另一个可用的键,另一个......直到魔术键过期。 那么为什么不直接将验证令牌的过期设置为与刷新令牌相同呢? 为什么要麻烦呢?

它的有效原因是什么,也许是历史的原因? 真的很想知道。 谢谢


引用的答案(通过@Anders)很有帮助,它指出:

在妥协的情况下,它有效的时间窗口是有限的,但令牌通过SSL使用,因此不太可能受到损害。

我认为最重要的部分是访问令牌通常会被记录下来(特​​别是当用作查询参数时,这对JSONP有帮助),所以对他们来说最好是短暂的。

还有一些其他原因,服务提供商大规模实施OAuth 2.0:

  • 如果没有担心吊销,API服务器可以安全地验证访问令牌,而无需DB查找或RPC调用。 这可以带来强大的性能优势并降低API服务器的复杂性。 最好的,如果你可以使用30m-60m的令牌撤销(或任何访问令牌的长度)。 当然,API服务器也可以在最后一个小时内保留内存中的令牌清单。

  • 由于令牌可以具有多个可访问多个不同API服务的范围,因此具有短期访问令牌可阻止API服务的开发人员终身访问API服务B上的用户数据。分区对安全性有利。


  • 我前几天在Taiseer Joudeh看文章,觉得非常有用,他说:

    在我看来,使用刷新令牌有三大好处:

  • 更新访问令牌内容:如您所知,访问令牌是自包含令牌,它们包含有关经过身份验证的用户生成的所有声明(信息),现在如果我们为用户发布长期存在的令牌(例如1个月)命名为“Alex”,并将其注册为“用户”角色,然后将此信息包含在授权服务器生成的令牌中。 如果您稍后决定(在获得令牌后的两天)将其添加到“管理员”角色,则无法更新所生成令牌中包含的此信息,您需要让他再次对他自我进行身份验证所以授权服务器将这些信息添加到这个新生成的访问令牌中,并且在大多数情况下这是不可行的。 您可能无法覆盖获得长期存取令牌的用户。 因此,为了解决这个问题,我们需要发布短期访问令牌(例如30分钟),并使用刷新令牌获取新的访问令牌,一旦获得新的访问令牌,授权服务器将能够为用户添加新的声明“亚历克斯”,一旦生成新的访问令牌,它将其分配给“管理员”角色

  • 从认证用户撤销访问:一旦用户获得长期访问令牌,只要访问令牌未过期,他就可以访问服务器资源,除非授权服务器实现定制逻辑,否则没有标准的方式来撤销访问令牌这迫使您将生成的访问令牌存储在数据库中,并对每个请求执行数据库检查。 但使用刷新标记,系统管理员可以通过简单地从数据库中删除刷新标记标识来撤销访问,因此一旦系统使用已删除的刷新标记请求新的访问标记,授权服务器将拒绝此请求,因为刷新标记不再可用(我们会进入更多细节)。

  • 无需存储或询问用户名和密码:使用刷新令牌,您可以在第一次进行身份验证时只询问一次用户名和密码,然后授权服务器可以发出非常长的刷新令牌(1年例如),除非系统管理员试图撤销刷新令牌,否则用户将在所有这段时间内保持记录。 您可以将此视为对服务器资源进行离线访问的一种方式,如果您正在构建一个将由前端应用程序使用的API,那么经常不断询问用户名/密码是不可行的,这会非常有用。


  • 我想补充一点来看另一个角度。

    无状态身份验证,无需在每个请求上击中数据库

    假设您想创建一个无状态(无会话)安全机制,可以对数百万用户进行身份验证,而无需进行数据库调用来执行身份验证。 随着您的应用程序获得的所有流量,在每个请求上保存数据库调用都是值得的! 它需要是无状态的,因此它可以轻松集群并扩展到数百甚至数千个服务器。

    通过老式会话,用户登录,此时我们从数据库中读取他们的用户信息。 为了避免一次又一次地读取它,我们将它存储在一个会话中(通常在内存或某些集群缓存中)。 我们通过一个cookie将会话ID发送给客户端,该cookie连接到所有后续请求。 在随后的请求中,我们使用会话ID查找会话,该会话又包含用户信息。

    将用户信息直接放入访问令牌中

    但我们不想要会话。 因此,不要将用户信息存储在会话中,我们只需将其放入访问令牌中即可。 我们签署这个令牌,因此没有人可以篡改它并且暴露。 我们可以在没有会话的情况下验证请求,也无需从每个请求的数据库中查找用户信息。

    没有会话...没有办法禁止用户?

    但没有一个会议有一个很大的缺点。 如果这个用户被禁止例如? 在旧的场景中,我们只是删除他的会话。 然后他必须再次登录,这是他无法做到的。 禁令完成。 但在新的情况下,没有会话。 那么我们怎么能禁止他呢? 我们不得不问他(非常礼貌地)删除他的访问令牌。 根据禁止列表检查每个传入请求? 是的,会起作用,但现在我们必须再次拨打我们不想要的数据库电话。

    妥协与短命令

    如果我们认为用户可能仍然可以使用他的帐户,比如被禁止10分钟后,我们可以创建一个在检查数据库每个请求和仅在登录时进行折衷的情况。 这就是刷新令牌的来源。它们允许我们使用具有短命令令牌的无状态机制。 我们不能撤消这些令牌,因为没有为他们完成数据库检查。 我们只检查他们的到期日期与当前时间。 但是一旦它们到期,用户将需要提供刷新令牌来获得新的访问令牌。 此时我们检查数据库并查看该用户已被禁止。 所以我们拒绝访问令牌的请求,禁令生效。

    链接地址: http://www.djcxy.com/p/47943.html

    上一篇: what's the point of refresh token?

    下一篇: implement OAuth Authorization code flow