java - 基于 token 的身份验证和单页应用程序中的注销

标签 java authentication jwt

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

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

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

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

最佳答案

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

有状态服务器

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

无状态服务器

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

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

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

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

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

注意

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

关于java - 基于 token 的身份验证和单页应用程序中的注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43799182/

相关文章:

php - Cake php 登录显示用户名和密码无效,即使它们是正确的

authentication - 在游戏中!具有安全性的2.0登录后如何重定向到原始URL?

authentication - 在 keycloak token 中为内部数据库中的用户 ID 使用 "sub"声明是否安全

rest - 基于浏览器的 OAuth/OpenID,具有持久登录功能

java - 无法创建 JTextField

java - 无法远程调试应用程序 - 端口无法从外部访问

c# - TeamCity - 无法通过 API 进行身份验证

rest - 在 Laravel 中将 JWT Token 保存在何处

Java日历: Subtract two Dates to get difference in days between the two

java - TIntSet 中的最高和最低元素?