JJWT是否可以在服务器端使令牌无效?

时间:2018-07-10 18:59:48

标签: java jwt jjwt

我是JWT的新手,我想知道当用户退出应用程序时是否可以在服务器端使JWT无效/无效(我也想知道这样做是否有意义!) 。想法是:

  1. 用户点击其应用中的退出链接
  2. 应用程序调用POST https://api.myapp.example.com/auth/invalidate
  3. JWT(HTTP请求标头中的授权/承载令牌)以某种方式无效
  4. 现在,没有人可以再次使用该JWT

我不确定这是否是一种非常规的注销逻辑方法,或者即使用户注销后也不确定是否仅让JWT保留有效就可以接受(我想我可以缩短JWT的寿命)到期,例如60分钟左右。

再说一遍:想知道是否有可能使用JJWT进行这种“无效”操作(如果可以,怎么办!!),以及这样做是否有意义(如果没有,典型的登出方式是什么)流的样子?!)。谢谢!

3 个答案:

答案 0 :(得分:1)

您不会使JWT失效,JWT是不可变的。令牌的有效性取决于到期时间和签名密钥,在严重的安全事件中,您可以更改签名密钥,然后已经发行的令牌将失效。您也可以在数据库中使用令牌黑名单,但这将花费另一次访问数据库的时间,如果使用此方法,则身份验证流程将不再是无状态的。

一旦用户退出,则必须从存储令牌的客户端删除令牌,通常令牌的存储是浏览器的cookielocalStorage

答案 1 :(得分:1)

其他答案是正确的,因为您通常不需要注销/无效端点。从应用程序中注销的用户意味着您只需从本地存储中删除其令牌即可。

但是,如果仍然确定要实现令牌失效端点,则可以通过跟踪包含无效令牌ID的“黑名单”来实现:

  • 当用户呼叫端点时,您将令牌的ID添加到黑名单中。
  • 对于每个经过身份验证的请求,您首先要检查令牌的ID是否包含在黑名单中,并相应地拒绝访问。
  • 确保自动清除了旧的/过时的黑名单条目,并且不会耗尽内存。
  • 但是,还要确保黑名单条目的time-to-live至少与令牌的有效期限一样长。

对于该实现,您不一定需要DB,您可以使用内存自到期映射(例如f.i)。 guava's CacheBuilderthis thread中讨论的替代方法之一。

答案 2 :(得分:0)

这是JWT的核心缺点之一-它们是自包含的令牌,这意味着没有固有的方法可以使它们无效。至多,您可以创建令牌ID(UUID.randomUUID())并尝试维护吊销列表,但是您又回到了JWT应该能够解放您的大部分基础设施的需求。

相关问题