关于jwt的token是否需要存储到redis的探讨与个人想法

最近我在开发项目的注册登录模块,用到的技术是Jwt,做完后若有所思,现将想法分享给大家一同探讨,先来大概的了解一下jwt技术。

什么是jwt?

​ Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

jwt的结构

jwt包含了使用.分隔的三部分:

  • Header 头部
  • Payload 负载
  • Signature 签名

其结构看起来是这样的

xxxxx.yyyyy.zzzzz

在查阅大量资料后得知,jwt中的token是储存在客户端中,通过请求头添加

Authorization: Bearer <token>

的方式向后台发送请求,从而进行用户认证,是一种无状态的认证机制,而服务端将会检查请求头Authorization中的jwt信息,如果合法,则允许用户的行为。

这样一来,jwt技术减少了大量查询数据库进行用户认证的需要。

可是token信息是不保密的,一旦被产生泄露,就会产生安全风险,这时候是否需要将token存入redis中,进一步确保安全呢? 对此,我挺纠结的,因为我感觉这违反了jwt技术减少数据库查询,减缓服务器压力的初衷。

再举一个实例,我现在需要做一个用户的退出功能,按照jwt的原理,只需在前端localStorage中把token删除,从而使得页面向后台发送请求的请求头中没有token即可,可是这样一来,token还没有到过期时间,服务器端对token的认证还存在,此时也会产生安全风险。本人为了程序安全着想,把token存入了redis,在认证前判断redis中该用户的token是否存在,在做用户退出功能时,一同把redis数据库中的token删除,但我感觉这一系列操作违背了jwt技术的初衷,对此各位大佬们怎么看呢?

期待大家一同讨论。

你可能感兴趣的:(java开发,jwt,redis,java)