Java JJWT可以使服务器端的令牌失效吗?

Java JJWT可以使服务器端的令牌失效吗?,java,jwt,jjwt,Java,Jwt,Jjwt,我是JWT新手,我想知道当用户注销应用程序时,是否有可能在服务器端使JWT无效(我还想知道这样做是否有意义!)。这个想法是: 用户单击其应用程序中的注销链接 应用程序拨打POST电话 JWT(HTTP请求头中的授权/承载令牌)以某种方式无效 现在,没有人能再使用JWT了 我不确定这是否是一种非正统的签出逻辑方法,也不确定让JWT保持有效是否可以接受,即使在用户签出后也是如此(我想我可以将JWT的有效期缩短到,比如说,60分钟左右) 再次提醒:想知道是否可以使用JJWT进行这种“无效化”(如果可以

我是JWT新手,我想知道当用户注销应用程序时,是否有可能在服务器端使JWT无效(我还想知道这样做是否有意义!)。这个想法是:

  • 用户单击其应用程序中的注销链接
  • 应用程序拨打POST电话
  • JWT(HTTP请求头中的授权/承载令牌)以某种方式无效
  • 现在,没有人能再使用JWT了
  • 我不确定这是否是一种非正统的签出逻辑方法,也不确定让JWT保持有效是否可以接受,即使在用户签出后也是如此(我想我可以将JWT的有效期缩短到,比如说,60分钟左右)


    再次提醒:想知道是否可以使用JJWT进行这种“无效化”(如果可以,怎么做?!),以及这样做是否有意义(如果没有,典型的签出流看起来是什么样子?!)。谢谢

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

    如果您不使JWT无效,JWT是不可变的。令牌的有效性取决于过期时间和签名密钥,在严重的安全事件中,您可以更改签名密钥,然后已经发布的令牌将无效。此外,您还可以在数据库中使用令牌黑名单,但这将需要再次访问数据库,如果您使用该黑名单,身份验证流将不再是无状态的


    一旦用户注销,则必须从存储令牌的客户端删除令牌,令牌的存储通常是
    cookie
    或浏览器的
    localStorage

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

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

    • 当用户调用端点时,您将令牌的ID添加到黑名单中
    • 对于每个经过身份验证的请求,您首先检查令牌的ID是否包含在黑名单中,并相应地拒绝访问
    • 确保旧的/过时的黑名单条目被自动清除,并且不会占用您的内存
    • 但是,还要确保黑名单条目的生存时间至少与令牌的有效期一样长
    对于实现,您不一定需要DB,您可以使用内存中的自过期映射,如f.i.或中讨论的备选方案之一