园子里不少jwt的问题了,看了之后,有一个困惑,即在什么场景下适合JWT?
根据介绍,一种情况是webapi,另一种情况是多web服务器下实现无状态分布式身份验证。
根据jwt的设计,验证身份时候,需要用非对称加密算法验证token里面的签名,只要签名正确,那就算验证通过。考虑到需要将用户“踢出登录”的情况,还需要保存一个黑名单,验证通过后再查一下是否在黑名单中。
验证签名时候计算量还是比较大的,假设我不使用JWT,而是用户认证后发送一个足够长的随机数作为token,并在redis里面维护一个token列表,用户验证时候只需要查询是否在列表中即可,这样的话就可以省去验证签名的计算量。
这种方式,是不是也满足了之前说的两种需求,并且降低了计算量?
What~?你说的都是业务需求了。
jwt最大的区别,就是用token来进行认证,取代了常规的Session(大部分是基于cookie的session),这样有利于多端分离,rest api交互等等。
正如你所说的,是取代session做身份识别。可是同样是用token来识别身份,jwt需要计算signature
,而我们设计一个token列表,将token存入此列表,就可以省去计算这个工作量了,不是更有效吗?
@Simple is best: 那个只是具体的算法,比如我就喜欢生成一个guid就当做token来用。
@幻天芒: 那你也没有选择JWT :)
@Simple is best: 从jwt的构成上来说,没有。其实你想实现的做法,和我所说的做法是一致的,就是使用一个随机的token来关联用户信息,从而把用户信息从token中解耦。
JWT的优势,在于服务端不存储任何会话,用户认证信息通过客户端传递的token进行解析,比较适合分布式。
当我们多台分布式机器,连接到同一个redis(或者redis集群),就算使用随机token,效果也是一致的,只是多了从redis 到 server的传输时间。
总结对比一下:
JWT: 客户端带上token, 服务端解析出用户认证信息(解析慢), 使用认证信息。
随机token +Redis:客户端带上token,服务端从Redis从获取认证信息(传输慢),使用认证信息。
@幻天芒: 很感谢你细致的回复。另外顺便请教另一个问题,在webapi环境下,jwt是存header的,在web页面访问的情况下,jwt存cookie吗?
@Simple is best: 常规做法是存header的,不过直接存cookie也是没有问题的,关键就在于,后台能拿到这个值。变态一点,存postData都还是行得通的。
对于无状态的http,只需要能让这个认证信息被后台接收到,那就是ok的。
@幻天芒: 如果是ajax获取数据,可以用js设置header,但是直接页面跳转时候如何设置header呢?比如,登录成功后,通过页面的链接跳转到某个页面,这时候如何设置header?
@Simple is best: 没办法,这种只能放cookie,不过可以同时存cookie和header吧,后端从两个地方其一取到值即可。