博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【通俗易懂】JWT-使用的可能正确姿势
阅读量:6967 次
发布时间:2019-06-27

本文共 1234 字,大约阅读时间需要 4 分钟。

JWT,英文全称JSON Web Token,一种开放行业标准。

应用场景为单点登录,API授权等。

假想的黑粉:“所以这篇文章是要详细介绍JWT是什么吗?”

非也非也,如果各位看官还不了解什么是JWT以及JWT的工作流程,还请自己先去GOOGLE下哈

我是不会跑题的,准备愉快地进入主题


JWT的优点:用户会话信息保存在客户端,服务端再也不用操心用户的会话信息,即服务端无状态

JWT的缺点:只能被动等到token过期,不能主动失效token

假想的黑粉:“这个缺点有啥影响吗?”

当然啦,想想退出登录,是不是就是一种主动失效的应用场景

假想的黑粉:“好像是,但这个容易解决啊,把token保存在后端服务,如redis,退出时在redis中把它干掉不就完事了吗”<( ̄︶ ̄)>

可以啊,脑袋转得这么快,好像可以解决问题

等等,好像哪里不对,这样又把会话信息存放在服务端,JWT的优势木有了,那要它何用?用传统的session方案就行了啊

简单讲讲服务端有状态的传统session方案:用户登录后,服务端把用户会话信息存放在session中(保存在服务端的某个地方,例如缓存),然后把session ID存放于cookie中,后续用户的请求中都会携带cookie,服务端通过cookie中的session ID即可判断用户的登录状态

假想的黑粉:“能解决问题就行,那么纠结干嘛呢?”

这。。。不行不行,不能为了用而用啊

假想的黑粉:“那你有解决方案吗?弃JWT而用session?”

我觉得吧,还是有使用的可能正确姿势的,先来个华丽丽的分隔线


先来简单看一下JWT校验token的原理:

  • 签名:数据 + 密钥 => Hash

  • 验证:数据 + 密钥 => hash => compare 携带的签名

由上图可见存放于服务端的密钥只要不被窃取,数据就无法被篡改,一旦修改了数据,则compare步骤一定不通过,则该token无效

假想的黑粉:“哦,我知道了,那就篡改数据,token自动就失效了”

你不是认真的吧?在客户端修改?Oh no!在服务端修改?Oh no!

假想的黑粉:“难道是修改密钥?密钥可是全局共用的哦,一经修改,其它颁发的token也跟着失效,这可是灾难性的”

差不多猜对了,全局不行,那就不要全局,来个一一对应, 一个用户专属一个唯一的密钥。

当要主动失效A用户的token,只要修改A用户所对应的密钥即可,仔细想想,这个方案其实挺优雅的,只是稍微修改了下密钥的获取方式,JWT的优势可以继续发挥,我们来用下图作个形象的理解吧

token验证流程比全局密钥的模式多了一步:从Cache中取出某个用户的密钥。是否会对性能造成影响,就需要在实际的应用场景中进行评估了

好了,到此结束,谢谢观看

假想的黑粉:“等等啊,我想问续期怎么破啊,比如API授权续期问题”

续期问题可用:失效token,重新获取新token的来解决

好的,真的要结束了,拜拜拜拜。。。

转载地址:http://zlzsl.baihongyu.com/

你可能感兴趣的文章
struts 2读书笔记-----struts2的开发流程
查看>>
项目 08 WebSocket
查看>>
C# 模拟Http/Https请求框架类
查看>>
【记录】VMware解决网络找不到服务器的问题
查看>>
springmvc的过滤器和拦截器
查看>>
jQuery.each(object, [callback])数组对象操作--jQuery 对象访问 $().each(callback)
查看>>
树的存储结构 - 数据结构和算法41
查看>>
c3中基本动画
查看>>
按钮动画
查看>>
js练习题
查看>>
python ------- 文件处理之增删改查-------作业
查看>>
python 全栈 day03 计算机网络基础 -- 摘要
查看>>
类的一点点知识
查看>>
iOS - Swift Enumerations or how to annoy Tom
查看>>
Hibernate save()与persist()区别
查看>>
MongoDB给数据库创建用户
查看>>
linux下vim对于意外退出的文档的再次开启
查看>>
POJ 3683 2SAT
查看>>
如何替换B字段内包含A字段的那部分内容
查看>>
Objective-C Runtime 运行时
查看>>