注销 springboot jwt

Logout springboot jwt

我想用控制器做一个注销服务。我尝试下一个代码:

    @GetMapping("/logout")
    public String getLogoutPage(HttpServletRequest request, HttpServletResponse response){

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null)
            new SecurityContextLogoutHandler().logout(request, response, authentication);

        return "redirect:/login";
    }

其实我是在跟postman做测试

下一个 url 请求身份验证(“/example”),但是在注销时我仍然可以使用相同的令牌转到此 url,这是不对的。

您无法真正注销 JWT 令牌,或者无法像使用不透明令牌那样注销。使 JWT 有效的是其签名与用于控制它的 public 证书及其过期时间的正确性。 只要满足这两个条件,令牌就有效。基于 JWT 的系统的传统注销通常包括简单地在客户端删除令牌。

万一出现安全漏洞,您可以轮换用于生成 JWT 的密钥,但这会注销系统中的每个人,并且不可能作为每个用户的策略。

如果你想在服务器端处理,你可以创建一个JWT的拒绝列表,添加你想要注销的令牌,并检查每个请求是否令牌在列表中。请注意如何实现它以避免系统中的重大开销(使用被拒绝的令牌存储过期时间并定期清理它)。

如果您的系统分布有一个身份验证机构和多个不同的消费者,如果操作不当,它们只会在本地“修复”注销。这意味着在某一时刻会遇到麻烦。你也应该考虑到这一点

使用 JWT 的一组很好的规则是:

  1. 不要将它们存储在任何您无法轻易删除它们并有效地进行客户端注销的地方。
  2. 过期时间短,经常刷新。
  3. 根据您的安全需要,经常轮换用于生成 JWT 的密钥
  4. 有一个应急计划来处理一些纯 JWT 无法处理的用例:密码更改,立即阻止用户...

如果这些安全权衡是您无法使用的,您应该考虑转向不透明的令牌,可以在不破坏模型的情况下轻松撤销。