JWT(JSON Web Token)是目前最流行的认证方案之一。博客园、各种技术公众号隔三差五就会推一篇JWT相关的文章,真的多如牛毛。但我对JWT有点困惑,今天写出来跟大家探讨探讨,不要喷哈。

JWT原理

本文默认读者已经对JWT有所了解,下面不再详细介绍JWT,只简单提一下。
JWT全称JSON Web Token。当服务器认证成功后会生成一个Token,这个token包含了header、payload、signature三部分信息。其中payload的内容有过期时间、签发时间、还有自定义的字段。自定义字段往往用来存放用户信息,比如UserId,UserName等等信息。当客户端收到这个token后存储在Cookie,localstorage或者别的什么地方并且以后每次请求都带上token。服务端对请求所携带的token进行解析,判断是否过期是否合法。

以上简单的描述了下JWT的工作原理,因为jwt的payload携带了过期时间、用户信息等,所以JWT有别于传统Session方案的一个最大不同就是JWT是无状态的,JWT不用在内存或DB里维持session的状态,直接拿到token解析就可以了。

JWT的优点

无状态?

这个优点真的爽,因为没有了session,不用考虑session服务器的压力所以可以毫无顾忌的水平扩展,个人认为这是JWT最大的一个优点,也是JWT的核心内容。但是这也带来了一个致命的问题:无法让单独某个用户(token)过期或者失效,恰恰这又是一个非常非常常用的功能。
为了解决这个问题,网上提出一些方案:比如服务端设置一个blacklist或者配合redis来存储token跟过期时间,每次请求到服务端解析JWT之后再次去blacklist或者redis里查询一次看看是否已经注销或者已经过期。
但是。。。这样不就又把session请回来了吗?这样的方案跟我用sessionId去取session又有啥区别呢?所谓session不一定非要是asp.net mvc又或者springmvc自带的session管理叫做session,任何带有中心存储功能能维持状态的东西都是session,比如上面方案里的redis就是一个确确实实的session。

跨域?

因为传统基于cookie的session机制sessionid存在cookie里,但是cookie不能跨域。但是JWT把token放在http的一个Authorization header上传输所以就可以轻松跨域。
但是sessionId就一定要存在cookie下吗,sessionId同样也可以存储在localstorage里,然后请求的时候携带在http的某个header上,事实上cookie本身也是通过http的一个header传输的。这样不就同样可以跨域了吗?sessionId跟token有区别吗?个人认为没有区别,都只是一个字符串而已。jwt怎么在客户端存储放在哪个header上那么sessionId就同样可以。

数据更安全?

JWT的签名也仅仅是仿篡改,把数据直接存储在客户端,尽管可以加密(JWT加密不是必须的),但是显然谈不上安全。如果是一串无意义的sessionId,它不存储数据,又不能篡改,是不是更安全呢?

预防CSRF?

这个通跨域那个解释一样,sessionId不一定非要存储在cookie中。

总结

为了预防被喷,再次强调下。今天写下这不是为了喷JWT。JWT本身设计没有什么问题。真正无状态的JWT确实可以带来实实在在的好处,服务端水平扩容变的异常容易,再也不用担心session复制的效率问题,也不用担心session挂掉后整个集群全部无法正常工作的问题,确实是一个实实在在的好东西。但是,好东西就一定大家都需要吗?个人认为如果您所要开发的系统并发量不是那么高,对水平扩展没那么高的需求,并且对用户注销是刚需,那么请好好考虑下是否真的需要JWT。或许简单的sessionId配合一个存储工具比如redis,更能符合你的要求。如果你的程序并发高,用户量大,实时在线人多,那么使用真无状态JWT是一个非常好的选择。它能够让你从容的水平扩容,它能够让你省下不少session服务器的费用,session服务不再是您系统的瓶颈。但是这样的系统又有多少?

关注公众号一起玩转技术吧

我们真的需要JWT吗?相关推荐

  1. AntDesign Pro + .NET Core 实现基于JWT的登录认证

    很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做 ...

  2. jwt同一会话_在会话中使用JWT

    jwt同一会话 这个话题已经在黑客新闻,reddit和博客上讨论了很多次. 共识是–请勿使用JWT(用于用户会话). 而且我在很大程度上同意对JWT的典型论点 , 典型的"但我可以使其工作- ...

  3. 还分不清 Cookie、Session、Token、JWT?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:掘金   作者:秋天不落叶 juejin.im/po ...

  4. 不要用JWT替代session管理(上):全面了解Token,JWT,OAuth,SAML,SSO

    通常为了弄清楚一个概念,我们需要掌握十个概念.在判断 JWT (Json Web Token) 是否能代替 session 管理之前,我们要了解什么是 token,以及 access token 和 ...

  5. 深入理解JWT的使用场景和优劣

    经过前面两篇文章<JSON Web Token - 在Web应用间安全地传递信息><八幅漫画理解使用JSON Web Token设计单点登录系统>的科普,相信大家应该已经知道了 ...

  6. jwt token 过期刷新_不要把 JWT 用作 session

    现在很多人使用 JWT 用作 session 管理,这是个糟糕的做法,下面阐述原因,有不同意见的同学欢迎讨论. 首先说明一下,JWT 有两种: 无状态的 JWT,token 中包含 session 数 ...

  7. 你的项目真的需要Session吗? redis保存session性能怎么样?

    在web开发中,Session这个东西一直都很重要,至少伴随我10年之久, 前一段时间发生一个性能问题,因为Redis session 问题,后来想想 其实我的项目session 是不需要的. 先看看 ...

  8. JSON WEB TOKEN(JWT)的分析

    JSON WEB TOKEN(JWT)的分析 一般情况下,客户的会话数据会存在文件中,或者引入redis来存储,实现session的管理,但是这样操作会存在一些问题,使用文件来存储的时候,在多台机器上 ...

  9. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

最新文章

  1. vector int string 化
  2. markdown 图片居中_Markdown常用语法汇总
  3. 可自动关闭的alert方法
  4. Java设计模式 - 适配器模式
  5. 分享几段祖传的Python代码,拿来直接使用!
  6. 前端含金量较高的网站推荐
  7. 三十分钟掌握STL(Using STL)
  8. MBA必读:不能触碰的5大职场高压线
  9. spring Aop的概念
  10. OpenJTAG调试S3C2440裸板程序
  11. Java Excel合并工具 v1.0
  12. 字符串的连接(复习)
  13. arp病毒的解决方法
  14. 【POJ1050+POJ2018+HDOJ6638+牛客1006D】最大子段和问题
  15. 基于SSM的学生社团管理系统
  16. js的柯里化(curry)
  17. 域名.com是什么意思?和cn域名有什么区别?
  18. 传说中最贵的跑车: 布加迪威龙
  19. 前端页面直接根据URL链接生成二维码【亲测可用】
  20. Leetcode刷题:贪心算法

热门文章

  1. html标记语言 --框架
  2. [poj2446]Chessboard
  3. js最全的十种跨域解决方案
  4. 89C51单片机定时器控制的流水灯
  5. Gruntjs: grunt-contrib-jst
  6. 如何让两个安装程序setup共享同一个component—— installing shared files(version:installshield develop8.0)...
  7. LiveJournal发展历程
  8. php图片地址参数错误,图片上传时一直显示请求地址错误怎么办
  9. Mac OS使用技巧之二:修改变量Path解决android: command not found
  10. psa name_Windows 10安全性PSA:启用自动商店更新