JWT与Session的比较

现在,愈来愈多的项目开始采用JWT做为认证受权机制,那么它和以前的Session究竟有什么区别呢?今天就让咱们来了解一下。
JWT是什么web

定义算法

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑和自包含的方式,用于在各方之间做为JSON对象安全地传输信息。做为标准,它没有提供技术实现,可是大部分的语言平台都有按照它规定的内容提供了本身的技术实现,因此实际在用的时候,只要根据本身当前项目的技术平台,到官网上选用合适的实现库便可。

特色数据库

使用JWT来传输数据,实际上传输的是一个字符串,这个字符串就是所谓的json web token字符串。因此广义上,JWT是一个标准的名称;狭义上,JWT指的就是用来传递的那个token字符串。这个串有两个特色:

紧凑:指的是这个串很小,能经过url 参数,http 请求提交的数据以及http header的方式来传递;
自包含:这个串能够包含不少信息,好比用户的id、角色等,别人拿到这个串,就能拿到这些关键的业务信息,从而避免再经过数据库查询等方式才能获得它们。json

结构安全

它由三部分组成:header(头部)、payload(载荷)、signature(签名),以.进行分割。(这个字符串原本是只有一行的,此处分红3行,只是为了区分其结构)

header用来声明类型(typ)和算法(alg)。
payload通常存放一些不敏感的信息,好比用户名、权限、角色等。
signature则是将header和payload对应的json结构进行base64url编码以后获得的两个串用英文句点号拼接起来,而后根据header里面alg指定的签名算法生成出来的。服务器

和Session的区别session

为何咱们要把JWT和Session作对比呢?由于咱们主要在每一次请求的认证时会用JWT,在此以前咱们都是用Session的。那这二者的区别在哪儿呢?

自己的含义post

看了前面的介绍,咱们发现JWT这个字符串其实自己就包含了关于用户的信息,好比用户名、权限、角色等。

Session传递的sessionId虽然是一个更简单的字符串,但它自己并无任何含义。编码

因此通常说来JWT的字符串要比sessionId长,若是你在JWT中存储的信息越长,那么JWT自己也会越长。
 而Cookie的存储容量是有限制的(一般为4KB),因此你们在使用的时候须要注意。

解析方法
JWT的header和payload实际上是有json转变过来的,而signature其实就是一个加密后的字符串,所以解析起来较为简单,不须要其余辅助的内容。加密

sessionId是服务器存储的用户对象的标识,理论上须要一个额外的map才能找出当前用户的信息。

管理方法
JWT理论上用于无状态的请求,所以其用户管理也只是依赖自己而已。咱们通常是在它的payload中加入过时时间,在不增长额外管理的状况下,它只有自动过时的方式。
Session由于它本就是存储在服务器端的,所以管理方案就有不少,并且大多都很成熟。

跨平台
JWT自己就是基于json的,所以它是比较容易跨平台的,能够从官网下载不一样平台的包,解析便可。

session的跨平台可能就不那么好作了,须要考虑的地方在于用户信息存储的格式,ProtoBuf、json、xml等,管理的话可能就须要专门的统一登陆平台,这个就不展开了。

时效性

无状态JWT一旦被生成,就不会再和服务端有任何瓜葛。一旦服务端中的相关数据更新,无状态JWT中存储的数据因为得不到更新,就变成了过时的数据。
 session就不同了,sessionId自己就没有太多含义,只需修改服务端中存储的数据便可。

适用场景
JWTJWT的最佳用途是一次性受权Token,这种场景下的Token的特性以下:
有效期短
只但愿被使用一次
真实场景的例子——文件托管服务,由两部分组成:
Web 应用:这是一个能够被用户登陆并维持状态的应用,用户在应用中挑选想要下载的文件。
文件下载服务:无状态下载服务,只容许经过密钥下载。
如何把JWT用在这个场景中呢?
用户登陆到 Web 应用中,挑选好想要下载的文件,点击下载。
认证服务颁发包含下载信息的、具备较短过时时间的JWT。JWT中包含的信息能够是这样的:
[Java] 纯文本查看 复制代码
?

{

"file": "/books/我这一生.pdf",
"exp": 1500719759621

}

使用 JWT 从文件下载服务下载文件。

SessionSession比较适用于Web应用的会话管理,其特色通常是:
权限多,若是用JWT则其长度会很长,颇有可能突破Cookie的存储限制。
基本信息容易变更。若是是通常的后台管理系统,确定会涉及到人员的变化,那么其权限也会相应变化,若是使用JWT,那就须要服务器端进行主动失效,这样就将本来无状态的JWT变成有状态,改变了其本意。

总结

咱们使用JWT,并非说看到它新就用,而应该考虑其适用场景,若是须要进行管理,能够考虑使用Session,毕竟其方案更加成熟。

文章摘自:https://juejin.im/post/5d8054...

相关文章
相关标签/搜索