【问题标题】:Logout springboot jwt注销springboot jwt
【发布时间】:2021-06-05 02:18:09
【问题描述】:

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

    @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";
    }

我其实是在用邮递员做测试

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

【问题讨论】:

  • 你不能用Token注销,如果你想这样做你必须使这个token无效,例如保存它并比较请求中的token没有保存。

标签: java spring-boot oauth-2.0 jwt logout


【解决方案1】:

您无法真正注销 JWT 令牌,或者不像使用不透明令牌那样注销。使 JWT 有效的是其签名与用于控制它的公共证书的正确性及其到期时间。 只要满足这两个条件,令牌就会有效。从基于 JWT 的系统中注销的传统方式通常只需在客户端删除令牌即可。

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

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

如果您的系统分布有一个身份验证权限,以及多个不同的消费者,如果没有正确完成,它们只会在本地“修复”注销。这意味着在某一点或另一个问题。你也应该考虑到这一点

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

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

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

【讨论】:

  • 你推荐使用 db 还是经常清理它的文件?
  • 这取决于你的服务器架构,如果你打算扩展,你能做的最好的就是像 Redis 这样的键/值和分布式系统。否则,数据库中具有快速搜索索引的表应该这样做。
猜你喜欢
  • 2016-04-01
  • 2018-06-16
  • 2014-03-19
  • 2016-12-21
  • 2020-10-20
  • 2018-09-23
  • 2018-07-29
  • 2019-02-25
  • 2018-06-17
相关资源
最近更新 更多