人文艺术 > APP服务端接口,用jwt还是用redis和token,分别有什么优势?

APP服务端接口,用jwt还是用redis和token,分别有什么优势?

2020-07-26 07:19阅读(205)

APP服务端接口,用jwt还是用redis和token,分别有什么优势?:jwt属于无状态设计,用户登陆的信息关键存放在jwt加密数据里,这种设计下服务器不需要存储jwt密文,

1

jwt属于无状态设计,用户登陆的信息关键存放在jwt加密数据里,这种设计下服务器不需要存储jwt密文,只需要解密就能拿到授权信息等用户信息。这种设计是一种利用计算力减少token设计下数据库及缓存的压力和设计复杂度,因此它的本质就是不存储登陆授权,而通过密文本身保存授权信息。

token加redis设计,是一种登陆后分配随机token,然后记录token与用户信息对应关系的设计。

很明显,这两张设计的区别就在于token实际上是需要服务器存储,每次验权需要查询数据库。jwt不需要服务器存储,信息本身就存储于jwt本身,这种模式无需使用数据库。

但是这种流行的jwt有一个设计上的缺陷,他通过密文传输用户信息,那么服务器在这种基础结构下是无法做到关闭用户登陆授权的操作,如果用户的jwt密文被偷窃,那么黑客就能以用户身份登陆,并且即使知道密文丢失,也无法关闭被偷窃的jwt密文。为了应对这一问题,可以使用jwt内部验证有效期和jwt黑名单模式,但是有效期始终无法做到及时停止jwt授权,这是一个治标不治本的方法。而jwt黑名单模式,则需要数据库或内存存储黑名单,那么,这实际上违背了jwt的免数据库设计原则。

因此,如果严格按照两种模式设计,jwt更适合低安全级别的服务器设计,如普通的博客、阅读器等等,这种服务允许不严格的登陆授权,即使密文丢失也不会造成用户的严重损失,却能获得较高的服务性能。

token模式,必须配合数据库进行存储和查询,因此性能较低,但token模式却能做到及时的授权关闭,已经登陆授权可见可查,每一次token都会有对应的记录。因此token模式适合较高安全度和用户登陆等信息分析的系统,如政府系统,支付系统等不可能允许高权限的token被偷窃却不能及时关闭授权。

jwt,适合轻量的系统和权限不严格系统。

token,适合重量系统和权限有严格要求的系统。


谢谢大家的阅读和头条的推荐,我再来详细的和大家讨论下这两者在实现上的区别,这样大家可能更方便的理解这两个不同的概念。

我们讨论的这两种方式只限于规范实现,如果有其他优化或者衍生设计模式则不在讨论之内。

token:

普通的token方式采用的是:登录-->生成随机字符串(token)-->服务器保存token与用户信息的对应关系

对应用户利用token校验的流程是 token-->查询token对应用户信息-->各系统根据用户信息进行业务处理。


很明显可以看出,token模式下的字符串实际上不需要和用户信息有任何关联,生成的token字符串的要求就是唯一,不能被其他用户占有,否则就会出现用户登录后实际上是以其他人身份进行业务处理。如果字符串是随机生成,那么黑客就无法猜测token的生成规律,也无法从token直接猜测到用户相关信息。


jwt:

jwt采用的生成:登录-->生成带有用户数据的加密字符串(该字符串服务器并不存储,直接下发给客户端)

校验:客户端将存储的jwt密文带上-->服务器解密密文,获取到用户信息


可以看出,jwt的凭证不仅要求唯一,还要求密文本身实际上是带有了用户信息,当然这块可以是非敏感信息,这只是实现上的细节区别,和结构本身没有特别大的关联。服务器本身并没有存储这次jwt密文,每次服务器的处理都是直接解密jwt密文。这样做的好处就是服务架构内直接抛弃了登录相关的传统token系统,并且服务器不再管理登录状态,token有效状态等问题。

而jwt带来的问题,凭证实际上的一串密文,更多的用户信息或session信息需要更大的密文来存储,进而每次请求都带上jwt就会使网络传输的内容变大,加大了网络开销;凭证是一串密文,那么如果黑客破解了服务器的加密方式,那么密文实际上就是用户信息在网络上传输,黑客可以直接伪造jwt登录或通过jwt密文获取到用户信息;jwt本身不管理jwt的有效性,一旦密文被偷窃,无法做到关闭掉黑客的授权。

2

谢邀。


什么是JWT

JWT(Json Web Token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。由头部(Header)、负载(Payload)、签名(Signature)三部分构成,其中每一部分使用Base64编码处理。

Header 中存储了所使用的加密算法和 Token 类型。

Payload是负载,JWT 规范规定了一些字段,并推荐使用,当然每一个开发者也可以自己指定字段和内容。需要注意的是,该部分内容只经过了 Base64 编码,相当于明文存储,所以不要放置敏感信息

而Signature,则是使用Base64编码后的Header 和Payload以及一个秘钥,使用header中指定签名算法进行签名。

可用下面的图对上述概念进行总结:

JWT的优点&问题

JWT属于无状态,不依赖Cookie,可以在禁用Cookie的浏览器中运行,可有效防止CSRF攻击;服务端不用存储session,易于扩展;相比XML更加简洁,更加适合在HTTP环境中传输。

那么JWT都存在哪些问题呢?主要集中在以下几个方面

  • 无法作废已颁布的Token,比如说用户注销这个功能,传统的基于session的方案,只需在服务端删除该session即可,因为状态在服务端存储。而JWT就比较难办到,因为JWT是无状态的,存储在客户端,即使被删除了,一定有效期内服务端并不知道,它仍然是有效的。

  • 无法应对过期的数据

  • 安全机制不够高

JWT适用场景

  • Restful API无状态验证

  • 一次性验证:比如用户注册某网站后需要发送一封邮件让其激活账户,通常该邮件中包含一个链接,该链接往往含有以下几个特点:能够标识唯一用户、不能被篡改、具有时效性。

Redis & Token

自己生成一个32位的key,value为用户信息,客户端访问时服务端首先判断Redis里是否有该Token,如果有,则加载该用户信息完成登录。服务需要存储下发的每个token及对应的value,维持其过期时间。

本文为作者“一个程序员的奋斗史”问答原创文章,未经允许转载、抄袭必究!

3

jwt是生成和校验解密token的工具,redis是缓存,他们之间并不冲突,加起来一起用效果更好,仅仅用token是不够的,因为一但设置token意味着其登录过期时间也就确定了。就无法让其在有效期内失效,这样不合理的。。所以可以通过redis记录token,控制其的有效性,和记录一些信息。所以 token加redis才是正确的选择。

4

都可以,通常情况下正式点我会用shiro+redis实现权限session认证管理,免去了自己实现session认证的过程,并且它还提供了一些进阶的功能。简陋点的话,redis+token就可以了,要自己去设计实现,通常配合拦截器实现session认证。

5

Jwt是带有签名的客户身份令牌。安全性还是比较高的。但是需要正确使用。它本身主要是证明客户身份,并不包含机密信息。如果需要避免重复使用,可以提供时间戳,可以一次性使用。这样很多安全问题就都解决了。现在很多服务都使用jwt认证。

6

问题很不专业,jwt本质上就是token,另外关redis什么事情?完全不是一类好吗?同时使用jwt和redis的都很多

7

俩者没有冲突啊,JWT的话APP内部程序就可以直接验证JWT是否合法,redis就是一个存储而已,俩者结合才是真的

相关问答推荐