首页 新闻 会员 周边 捐助

JWT的应用场景应该是怎样的?

0
悬赏园豆:50 [已解决问题] 解决于 2017-06-09 23:25

园子里不少jwt的问题了,看了之后,有一个困惑,即在什么场景下适合JWT?

根据介绍,一种情况是webapi,另一种情况是多web服务器下实现无状态分布式身份验证。

根据jwt的设计,验证身份时候,需要用非对称加密算法验证token里面的签名,只要签名正确,那就算验证通过。考虑到需要将用户“踢出登录”的情况,还需要保存一个黑名单,验证通过后再查一下是否在黑名单中。

验证签名时候计算量还是比较大的,假设我不使用JWT,而是用户认证后发送一个足够长的随机数作为token,并在redis里面维护一个token列表,用户验证时候只需要查询是否在列表中即可,这样的话就可以省去验证签名的计算量。

这种方式,是不是也满足了之前说的两种需求,并且降低了计算量?

Simple is best的主页 Simple is best | 初学一级 | 园豆:20
提问于:2017-06-07 21:14
< >
分享
最佳答案
0

What~?你说的都是业务需求了。

 

jwt最大的区别,就是用token来进行认证,取代了常规的Session(大部分是基于cookie的session),这样有利于多端分离,rest api交互等等。

收获园豆:50
幻天芒 | 高人七级 |园豆:37207 | 2017-06-07 21:47

正如你所说的,是取代session做身份识别。可是同样是用token来识别身份,jwt需要计算signature,而我们设计一个token列表,将token存入此列表,就可以省去计算这个工作量了,不是更有效吗?

Simple is best | 园豆:20 (初学一级) | 2017-06-07 22:27

@Simple is best: 那个只是具体的算法,比如我就喜欢生成一个guid就当做token来用。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-07 23:36

@幻天芒: 那你也没有选择JWT :)

Simple is best | 园豆:20 (初学一级) | 2017-06-08 10:06

@Simple is best: 从jwt的构成上来说,没有。其实你想实现的做法,和我所说的做法是一致的,就是使用一个随机的token来关联用户信息,从而把用户信息从token中解耦。

 

JWT的优势,在于服务端不存储任何会话,用户认证信息通过客户端传递的token进行解析,比较适合分布式。

 

当我们多台分布式机器,连接到同一个redis(或者redis集群),就算使用随机token,效果也是一致的,只是多了从redis 到 server的传输时间。

 

总结对比一下: 

JWT: 客户端带上token, 服务端解析出用户认证信息(解析慢), 使用认证信息。

随机token +Redis:客户端带上token,服务端从Redis从获取认证信息(传输慢),使用认证信息。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-08 11:41

@幻天芒: 很感谢你细致的回复。另外顺便请教另一个问题,在webapi环境下,jwt是存header的,在web页面访问的情况下,jwt存cookie吗?

Simple is best | 园豆:20 (初学一级) | 2017-06-09 10:06

@Simple is best: 常规做法是存header的,不过直接存cookie也是没有问题的,关键就在于,后台能拿到这个值。变态一点,存postData都还是行得通的。

 

对于无状态的http,只需要能让这个认证信息被后台接收到,那就是ok的。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-09 10:31

@幻天芒: 如果是ajax获取数据,可以用js设置header,但是直接页面跳转时候如何设置header呢?比如,登录成功后,通过页面的链接跳转到某个页面,这时候如何设置header?

Simple is best | 园豆:20 (初学一级) | 2017-06-09 22:52

@Simple is best: 没办法,这种只能放cookie,不过可以同时存cookie和header吧,后端从两个地方其一取到值即可。

幻天芒 | 园豆:37207 (高人七级) | 2017-06-09 22:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册