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. 不要盲目使用新技术,说的就是你,JWT!

    其实我更想聊标题的前半部分,后半部分只是拉出来做典型的. 简历上写上一句,"热衷于学习新技术",孬管是不是真的,至少加分项是可以有的. 再看看标题,我是来搞笑的? 学习与使用,两回 ...

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

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

  3. 你的项目真的需要Session吗?

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

  4. ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统

    为什么使用 Jwt 最近,移动开发的劲头越来越足,学校搞的各种比赛都需要用手机 APP 来撑场面,所以,作为写后端的,很有必要改进一下以往的基于 Session 的身份认证方式了,理由如下: 移动端经 ...

  5. 从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配

    缘起 本文已经有了对应的管理后台,地址:https://github.com/anjoy8/Blog.Admin 哈喽大家好呀!又过去一周啦,这些天小伙伴们有没有学习呀,已经有一周没有更新文章了,不过 ...

  6. [转]Node.js 应用:Koa2 使用 JWT 进行鉴权

    本文转自:https://www.cnblogs.com/linxin/p/9491342.html 前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行 ...

  7. ASP.NET Core的JWT的实现(中间件).md

    既然选择了远方,便只顾风雨兼程 __ HANS许 JWT(JSON Web Token) ASP.NET Core 的Middleware实现 引言:挺久没更新了,之前做了Vue的系列,后面想做做服务 ...

  8. 如何在SpringBoot中集成JWT(JSON Web Token)鉴权

    这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...

  9. Node.js 应用:Koa2 使用 JWT 进行鉴权

    前言 在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作.那么服务器端要如何进行鉴权呢? Json ...

随机推荐

  1. PHP hex2bin() 函数

    实例 把十六进制值转换为 ASCII 字符: <?phpecho hex2bin("48656c6c6f20576f726c6421");?> 以上实例输出结果: He ...

  2. Skill 脚本演示 ycLayerExcel.il

    https://www.cnblogs.com/yeungchie/ ycLayerExcel.il 用于 Tape-out 流程,获取当前用到的所有 lpp 等信息,并按照自定格式输出为 Excel ...

  3. 正确的使用HttpClient

    快捷的网络请求,多用HttpClient 但是常规的写法会一大片的TIME_OUT 比如这样的例子 static async Task<string> TestHttpClient(str ...

  4. 8月份Python招聘情况怎么样?Python爬取招聘数据,并进行分析

    前言 拉勾招聘是专业的互联网求职招聘平台.致力于提供真实可靠的互联网招聘求职找工作信息.今天我们一起使用 python 采集拉钩的 python 招聘信息,分析一下找到高薪工作需要掌握哪些技术 开发环 ...

  5. 网络安全传输系统-sprint3账号管理子系统设计

    part1:sqlite嵌入式数据库移植 1.数据库系统构成:访问数据库应用-->管理数据库系统-->数据库存储(自上而下) 2.数据库中数据以表的形式而存在.表与表之间可能存在关联关系( ...

  6. 100例Python代码带你从入门到进阶!

    以下所有代码全都至少运行一遍,确保可复现.易于理解.逐步完成入门到进阶的学习. 此教程经过我 反复打磨多遍 ,经常为此熬夜,真心不易,文章比较长,看完有用,帮我点个在看或分享支持. 教程包括 62 个 ...

  7. 图解比原链Tensority算法:如何让POW做到人工智能友好

    共识算法说起 区块链系统首先是分布式系统,而一致性是分布式系统的基础问题,要保证系统满足不同程度的一致性,则就要用到共识算法. 现在主流的算法有POW.POS.DPOS等等,比特币采用的POW共识算法 ...

  8. Springboot日志LOGO改变和设计

    每次启动Springboot的时候,SpringBoot都会打印一个LOGO,那么这个LOGO是可以关闭和改变的. 1.关闭Springboot的LOGO 2.改变Springboot的日志LOGO ...

  9. Python实现迪杰斯特拉算法

    首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...

  10. NLP Github

    作者:cstghitpku链接:https://zhuanlan.zhihu.com/p/51279338来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.分词 Wo ...