用户退出登录时JWT的处理方式?

系统后端采用springboot,jwt认证,jwt设置了过期时间,并已实现jwt自动续签功能

请教一下:当用户退出登录时,是直接让前端删除用户jwt还是说后端将退出登录用户jwt添加到黑名单中?以及他们各自的安全性及其他考量?

阅读 3.1k
avatarAI BotBETA

当用户退出登录时,处理JWT的方式可以因应用程序的需求和设计而有所不同。以下是两种常见的方法以及它们的优缺点:

  1. 前端删除JWT:
* 安全性:这种方法可以防止恶意用户通过拦截已注销的JWT来伪造身份。由于JWT存储在前端,因此一旦用户注销,JWT就会被删除,从而无法再被使用。
* 用户体验:这种方法可以立即终止用户的会话,并清除他们在应用程序中的所有访问权限。
* 缺点:由于JWT存储在前端,因此如果用户清除了浏览器的本地存储或使用无痕浏览模式,则JWT可能会被保留。此外,如果用户在多个设备上使用应用程序,则每个设备都需要单独注销。
  1. 后端将退出登录用户的JWT添加到黑名单中:
* 安全性:这种方法可以防止已注销的JWT被重新利用。后端会将已注销的JWT添加到黑名单中,并在验证JWT时检查其是否在黑名单中。如果JWT在黑名单中,则拒绝访问请求。
* 用户体验:这种方法可能需要一些时间来更新后端的黑名单,因此用户可能在注销后仍然能够访问一段时间。此外,如果应用程序有多个后端实例,则需要确保所有实例都同步更新黑名单。
* 缺点:这种方法需要额外的后端逻辑来管理黑名单,并需要确保黑名单的同步更新。此外,如果后端出现故障或延迟更新黑名单,则可能会出现安全漏洞。

综上所述,选择哪种方法取决于应用程序的需求和设计。如果应用程序对安全性要求较高,并且不需要支持多设备登录,则前端删除JWT可能是一个更好的选择。如果应用程序需要支持多设备登录,并且对实时性要求较高,则将退出登录用户的JWT添加到后端黑名单中可能是一个更好的选择。

2 个回答

如果你的jwt过期时间定义的如果足够短,就可以让前端直接剔除,业务安全性肯定没有拉入黑名单的安全性强, 当然如果你的业务需要达到很高的安全等级了, 你只是在 jwt 下功夫是不行的, 你将 jwt 拉入黑名单其实并不能防止 jwt 被盗用的问题, 理论上 现在主要应用 无论是 移动端 或者 pc端, 很少有会有用户主动会去 进行退出账户的操作, 导致业务实际其实都是 jwt 自然过期失效。其实这块代码也没提升安全性。

不过你想提高接口的安全性,可以从接口签名的方向去做。接口签名一般会把 时间戳,请求参数,流水号 这三个数据进行加密来实现接口的安全性
首先接口签名有以下好处

  • 数据防篡改: 接口签名算法可以把接口的参数也纳入加密中,一般会通过摘要算法把请求参数进行处理, 当服务端收到消息可以把请求数据通过同样的算法计算后, 然后进行对比,如果服务端算出的值与客户端传的值是不同的,证明数据进行过篡改
  • 有效期校验: 签名里包含的时间戳,可以应对重放攻击, 当攻击者通过某种手段获取到接口请求, 直接啥都不改, 重复请求已获取返回的话, 如果你的允许相差5s的话, 那这个接口的有效期只有 5s ,攻击者只能在5s内获取你的接口信息,并在5s内进行使用,
  • 防止接口重复调用: 签名里的流水号,可以用于接口的唯一性确认, 你可以当接口请求后,放入redis 的黑名单里, 当又出现这个流水号时,你就可以判定有人重复使用这个请求,属于非法请求

具体你可以看看这篇文章
https://www.cnblogs.com/hjzgg/p/11062043.html

你可以把当前用户的token过期

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进