单页应用程序 JWT,令牌刷新与长寿命令牌
Posted
技术标签:
【中文标题】单页应用程序 JWT,令牌刷新与长寿命令牌【英文标题】:Single Page Application JWT, token refreshing vs long lived tokens 【发布时间】:2017-04-25 00:54:49 【问题描述】:我正在开始一个单页应用程序,并且我正在使用 JSON Web 令牌来验证客户端(带有服务器 API 的 JS 客户端)。
在我的应用中,用户提供凭据(应用身份验证、facebook、google),然后服务器检查用户是否存在并返回一个令牌。
客户端 JS 为每个请求添加令牌以使用服务器 API。
发行令牌时,它有一个到期时间和一个最大刷新时间。如果为令牌设置一个较短的到期时间和一个“好的”最大刷新时间,我就不得不知道何时刷新令牌。到目前为止,我发现的最佳方法是在令牌过期时(5 分钟前)检查客户端,然后发出刷新请求。然后我会得到一个新的令牌。这可以在达到最大刷新时间之前完成。然后,用户必须重新进行身份验证。
我见过的另一种方法是,在服务器上,如果令牌即将过期或刚刚过期,它会自动刷新并返回给客户端(必须检测令牌更改并存储它)
但是...这和拥有一个长期存在的单一令牌有什么区别?
是否拥有一个可以用刷新令牌更新的短期访问令牌比拥有一个长期访问令牌好很多倍?
【问题讨论】:
【参考方案1】:使用短期令牌的主要原因是防御session hijacking,当攻击者通过一种或另一种方法窃取会话凭据(在本例中为令牌)并在受害者的会话中进行恶意行为时。令牌的寿命越短,攻击者执行他们计划的任何恶意活动的时间就越少。
【讨论】:
我意识到了,但是如果令牌自动刷新,窃取 1 个令牌意味着让它自动刷新直到最大刷新时间,所以或多或少与拥有一个长令牌相同,不是吗? 你说的自动刷新到底是什么意思?标准模型是发送一个带有原始访问令牌的刷新令牌,可以兑换一个新令牌。它不应该随每个请求一起发送。如果用户尝试使用过期的访问令牌进行连接,服务器将请求刷新令牌(或者客户端,知道令牌已过期,将发出刷新请求)。如果客户端没有它,他们将被提示登录。一旦他们登录,所有现有的刷新和访问令牌都将失效,由服务器发送的新对替换。 关键是使用刷新令牌应该使所有现存的访问令牌失效,和刷新令牌。因此,如果刷新令牌被盗,并且攻击者使用它来获取新的刷新令牌和访问令牌,则会提示用户在下一次请求时登录,因为他们的令牌现在无效。如上所述,该登录将创建一个新的令牌对并使攻击者获得的令牌对无效。 我会尽力解释。我正在为 Laravel 使用 tymondesigns/jwt-auth 包。在这里,当您验证用户凭据时,服务器会发出一个令牌。此令牌在到期前有效,但在 max_refresh_time 之前它也是可刷新的。不会发出刷新令牌。可以强制刷新,传递一个有效的token,真正的效果是我得到一个新的token,使之前的token失效。 使用该方法,刷新时间较长的原因可能是允许用户在多个非连续会话之间共享状态,即他们可以在周二登录并在周三在同一个地方恢复,而无需必须重新登录。如果攻击者在过期后尝试使用令牌,这也将迫使攻击者获取新令牌,用户下次尝试连接并必须登录时会使该令牌无效。从纯粹的安全角度来看,它绝对不理想,但用户体验的吸引力非常明显。这也消除了必须管理两个令牌的“开销”以上是关于单页应用程序 JWT,令牌刷新与长寿命令牌的主要内容,如果未能解决你的问题,请参考以下文章