Java 在基于令牌的身份验证和单页应用程序中注销

Java 在基于令牌的身份验证和单页应用程序中注销,java,authentication,jwt,Java,Authentication,Jwt,我正在为我的Spring Boot应用程序使用JWT身份验证。前端将是一个单页应用程序 我应该在服务器端处理注销功能吗?据我所知,除非我们有一个有状态的服务器(在令牌的最长生存期内存储注销的令牌),否则无法使JWT令牌无效 SPA每次在其头中发出请求时都会传递JWT令牌,当用户访问/logout时,它可以将其从本地存储中删除,而无需调用服务器 潜在的问题是什么?这个想法在其他地方用过吗?最佳做法是什么?首先,您必须决定是否需要一台全状态服务器 全状态服务器 这很容易。只需向服务器发送一个注销请求

我正在为我的Spring Boot应用程序使用JWT身份验证。前端将是一个单页应用程序

我应该在服务器端处理注销功能吗?据我所知,除非我们有一个有状态的服务器(在令牌的最长生存期内存储注销的令牌),否则无法使JWT令牌无效

SPA每次在其头中发出请求时都会传递JWT令牌,当用户访问
/logout
时,它可以将其从本地存储中删除,而无需调用服务器


潜在的问题是什么?这个想法在其他地方用过吗?最佳做法是什么?

首先,您必须决定是否需要一台全状态服务器

全状态服务器 这很容易。只需向服务器发送一个注销请求并丢弃会话即可。就这样。这是最安全的方法

无状态服务器 我喜欢无状态服务器,因为您不必管理状态。但你当然有一个权衡。在这种情况下,安全性。没有退出的方法,因为您没有可以在服务器端使其失效的会话

因此,使用JWT令牌的攻击者可以使用会话,直到会话结束,而无需采取任何措施来阻止

但是您可以做一些事情来避免atacker获得JWT令牌。这里有一些你可以做的事情,你已经做对了

  • 不要使用cookies发送令牌。你做这件事的方式是完美的。使用标题。这是通过SSL加密的,单页应用程序必须故意发送
  • 将时间戳放入JWT令牌中,使其在一段时间后失效。但要注意时区和时钟不同步等影响
  • 将一些浏览器指纹信息放入令牌中,如操作系统或浏览器版本。以这种方式,阿塔克也不得不假装
  • 但这些机制都让atacker变得更加困难。不可能真正注销

    注 如果正确使用JWT,服务器将处于“状态”。您必须定义一个在所有服务器上都相同的秘密。如果您使用多台服务器,则必须注意这一点。

    请参阅以下答案:。