我正在为我的 Spring Boot 应用程序使用 JWT 身份验证。前端将是一个单页面应用程序。
我应该在服务器端处理注销功能吗?据我了解,除非我们有一个有状态服务器(在 token 的最大生命周期内存储注销的 token ),否则无法使 JWT token 无效。
SPA 每次在其 header 中发出请求时都会传递 JWT token ,并且当用户访问 /logout
时,它可以将其从 localStorage 中删除,而无需调用服务器。
潜在的问题是什么?这个想法在其他地方也被使用过吗?最佳实践是什么?
最佳答案
首先,您必须决定是否需要有状态服务器。
有状态服务器
这很容易。只需向服务器发送注销请求并丢弃 session 即可。就是这样。这是最安全的方法。
无状态服务器
我喜欢无状态服务器,因为您不必管理状态。但当然你需要权衡。在这种情况下的安全性。 无法注销,因为您没有可以在服务器端使 session 失效的 session 。
因此,窃取您的 JWT token 的攻击者可以使用该 session 直到 session 结束,并且无法采取任何措施来阻止这种情况。
但是您可以采取一些措施来避免攻击者获得 JWT token 。以下是您可以做并且已经做对的一些事情
- 不要使用 cookie 来发送 token 。你的做法是完美的。使用标题。这是通过 SSL 加密的,单页应用程序必须有意发送它。
- 将时间戳放入 JWT token 中,以便它在一段时间后自行失效。但请注意时区和时钟等不同步的影响。
- 将一些浏览器指纹信息放入 token 中,例如操作系统或浏览器版本。这样攻击者也必须伪造这一点。
但是这些机制都是为了让攻击者更难攻击。真正的注销是不可能的。
注意
如果你正确使用 JWT,你的服务器将有一个“状态”。您必须定义一个在所有服务器上都相同的 secret 。如果您使用多个服务器,那么您必须注意这一点。
关于java - 基于 token 的身份验证和单页应用程序中的注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43799182/