【问题标题】:Can JJWT invalidate tokens on the server-side?JJWT 可以在服务器端使令牌无效吗?
【发布时间】:2018-12-18 17:17:24
【问题描述】:

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

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

我不确定这是否是一种非正统的注销逻辑方法,或者即使在用户注销之后,让 JWT 仍然有效是否可以接受(我想我可以缩短 JWT 的寿命到期,例如 60 分钟或其他时间)。

再说一遍:想知道是否有可能使用 JJWT 来执行这种“无效”(如果可以,怎么做?!)以及这样做是否有意义(如果没有,典型的注销是什么?流看起来像?!)。谢谢!

【问题讨论】:

    标签: java jwt jjwt


    【解决方案1】:

    这是 JWT 的核心缺点之一——它们是独立的令牌,这意味着没有固有的方法可以使它们失效。最多,您可以创建一个令牌 ID (UUID.randomUUID()) 并尝试维护一个吊销列表,但随后您又需要 JWT 应该让您摆脱的大部分基础设施。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        如果您仍然决定实施令牌失效端点,您可以通过跟踪包含失效令牌 ID 的“黑名单”来实现:

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

        对于实现,您不一定需要数据库,您可以使用内存中的自过期映射,如 f.i。 guava's CacheBuilderthis thread 中讨论的替代方案之一。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-20
          • 2015-12-28
          • 1970-01-01
          • 2019-02-20
          • 1970-01-01
          • 1970-01-01
          • 2012-05-13
          • 2012-10-07
          相关资源
          最近更新 更多