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

Ari*_*deh 2 java authentication jwt

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

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

SPA 每次在其标头中发出请求时都会传递 JWT 令牌,并且当用户访问/logout而不调用服务器时,它可以将其从 localStorage 中删除。

潜在的问题是什么?这个想法在其他地方也被使用过吗?最佳实践是什么?

waX*_*Xve 5

首先,您必须决定是否需要有状态服务器。

有状态服务器

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

无状态服务器

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

因此,窃取您的 JWT 令牌的攻击者可以使用该会话直到会话结束,并且无法采取任何措施来阻止这种情况。

但是您可以采取一些措施来避免攻击者获得 JWT 令牌。以下是您可以做并且已经做对的一些事情

  1. 不要使用 cookie 来发送令牌。你的做法是完美的。使用标题。这是通过 SSL 加密的,单页应用程序必须有意发送它。
  2. 将时间戳放入 JWT-Token 中,以便它在一段时间后自行失效。但请注意时区和时钟等不同步的影响。
  3. 将一些浏览器指纹信息放入令牌中,例如操作系统或浏览器版本。这样攻击者也必须伪造这一点。

但这些机制都是为了让攻击者更难攻击。真正的注销是不可能的。

笔记

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