Rest 单页应用程序JWT、令牌刷新与长寿命令牌

Rest 单页应用程序JWT、令牌刷新与长寿命令牌,rest,security,authentication,jwt,single-page-application,Rest,Security,Authentication,Jwt,Single Page Application,我正在启动一个单页应用程序,并使用Javascript Web令牌对客户端(带有服务器API的JS客户端)进行身份验证 在我的应用程序中,用户提供凭据(appauth、facebook、google),然后服务器检查用户是否存在并返回令牌 客户端JS向每个请求添加令牌以使用服务器API 当令牌被发出时,它有一个到期时间和一个最大刷新时间。如果为令牌设置了一个较短的过期时间和一个“良好”的最大刷新时间,我就必须知道何时刷新令牌。到目前为止,我发现最好的方法是在令牌过期时(5分钟之前)检查客户端,然

我正在启动一个单页应用程序,并使用Javascript Web令牌对客户端(带有服务器API的JS客户端)进行身份验证

在我的应用程序中,用户提供凭据(appauth、facebook、google),然后服务器检查用户是否存在并返回令牌

客户端JS向每个请求添加令牌以使用服务器API

当令牌被发出时,它有一个到期时间和一个最大刷新时间。如果为令牌设置了一个较短的过期时间和一个“良好”的最大刷新时间,我就必须知道何时刷新令牌。到目前为止,我发现最好的方法是在令牌过期时(5分钟之前)检查客户端,然后发出刷新请求。然后我会得到一个新的代币。在达到最大刷新时间之前,可以执行此操作。然后,用户必须重新验证

我见过的另一种方法是,在服务器上,若令牌接近或刚刚过期,它将自动刷新并返回给客户端(客户端必须检测令牌更改并存储它)

但是。。。这和拥有一个象征物来过“美好”的生活有什么区别


拥有一个短寿命令牌(无需授权即可续订)是否比拥有一个长令牌好很多倍?

使用短寿命令牌的主要原因是,当对手通过一种或另一种方法窃取会话凭据(在本例中为令牌)并在受害者的会话中恶意行事时,可以进行防御。令牌的寿命越短,攻击者执行其计划的任何恶意活动的时间就越短。

我意识到,如果令牌自动刷新,偷取1个令牌意味着它将自动刷新到最长刷新时间,因此这与长时间刷新大致相同,不是吗?你说的自动刷新到底是什么意思?标准模式是使用原始访问令牌发送刷新令牌,该令牌可以兑换为单个新令牌。它不应该与每个请求一起发送。如果用户试图连接过期的访问令牌,服务器将请求刷新令牌(或者客户端知道令牌已过期,将发出刷新请求)。如果客户端没有,则会提示他们登录。一旦他们登录,所有现存的刷新和访问令牌将失效,并由服务器发送的新令牌对替换。关键是使用刷新令牌应使所有现存的访问令牌和刷新令牌失效。因此,如果刷新令牌被盗,并且攻击者使用该令牌获取新的刷新令牌和访问令牌,则会提示用户在下一次请求时登录,因为他们的令牌现在无效。如上所述,该登录将创建一个新的令牌对,并使攻击者获得的令牌对无效。我正在为Laravel使用tymondesigns/jwt auth包。在这里,当您验证用户凭据时,服务器会发出一个令牌。此令牌在到期前有效,但在最长刷新时间前可刷新。未颁发刷新令牌。可以强制刷新,传递一个有效的令牌,真正的效果是我获得一个新令牌并使以前的令牌无效。使用该方法,刷新时间较长的原因可能是允许用户在多个非连续会话中共享状态,也就是说,他们可以在周二登录,周三在同一地点恢复,而无需再次登录。这还将迫使攻击者在过期后尝试使用令牌时获取新令牌,用户在下次尝试连接并必须登录时会使该令牌无效。从纯粹的安全角度来看,它肯定不是理想的,但是UX的吸引力是非常明显的。这也消除了必须管理两个令牌的“开销”