JWT与Session的⽐较
JWT是什么
定义
JSON Web Token(JWT)是⼀个开放标准(RFC 7519),它定义了⼀种紧凑和⾃包含的⽅式,⽤于在各⽅之间作为JSON对象安全地传输信息。作为标准,它没有提供技术实现,但是⼤部分的语⾔平台都有按照它规定的内容提供了⾃⼰的技术实现,所以实际在⽤的时候,只要根据⾃⼰当前项⽬的技术平台,到官⽹上选⽤合适的实现库即可。
特点
session下载使⽤JWT来传输数据,实际上传输的是⼀个字符串,这个字符串就是所谓的json web token字符串。所以⼴义上,JWT是⼀个标准的名称;狭义上,JWT指的就是⽤来传递的那个token字符串。这个串有两个特点:
1. 紧凑:指的是这个串很⼩,能通过url 参数,http 请求提交的数据以及http header的⽅式来传递;
2. ⾃包含:这个串可以包含很多信息,⽐如⽤户的id、⾓⾊等,别⼈拿到这个串,就能拿到这些关键的业务信息,从⽽避免再通过数据
库查询等⽅式才能得到它们。
结构
它由三部分组成:header(头部)、payload(载荷)、signature(签名),以.进⾏分割。(这个字符串本来是只有⼀⾏的,此处分成3⾏,只是为了区分其结构)
1. header⽤来声明类型(typ)和算法(alg)。
2. payload⼀般存放⼀些不敏感的信息,⽐如⽤户名、权限、⾓⾊等。
3. signature则是将header和payload对应的json结构进⾏base64url编码之后得到的两个串⽤英⽂句点号拼接起来,然后根据header⾥⾯alg指定
的签名算法⽣成出来的。
和Session的区别
为什么我们要把JWT和Session做对⽐呢?因为我们主要在每⼀次请求的认证时会⽤JWT,在此之前我们都是⽤Session的。那这两者的区别在哪⼉呢?
本⾝的含义
看了前⾯的介绍,我们发现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本⾝就没有太多含义,只需修改服务端中存储的数据即可。
适⽤场景
JWT
JWT的最佳⽤途是⼀次性授权Token,这种场景下的Token的特性如下:
有效期短
只希望被使⽤⼀次
真实场景的例⼦——⽂件托管服务,由两部分组成:
Web 应⽤:这是⼀个可以被⽤户登录并维持状态的应⽤,⽤户在应⽤中挑选想要下载的⽂件。
⽂件下载服务:⽆状态下载服务,只允许通过密钥下载。
如何把JWT⽤在这个场景中呢?
1. ⽤户登录到 Web 应⽤中,挑选好想要下载的⽂件,点击下载。
2. 认证服务颁发包含下载信息的、具有较短过期时间的JWT。JWT中包含的信息可以是这样的:{ "file": "/books/我这⼀辈⼦.pdf", "exp":
1500719759621 }
3. 使⽤ JWT 从⽂件下载服务下载⽂件。
Session
Session⽐较适⽤于Web应⽤的会话管理,其特点⼀般是:
权限多,如果⽤JWT则其长度会很长,很有可能突破Cookie的存储限制。
基本信息容易变动。如果是⼀般的后台管理系统,肯定会涉及到⼈员的变化,那么其权限也会相应变化,如果使⽤JWT,那就需要服务器端进⾏主动失效,这样就将原本⽆状态的JWT变成有状态,改变了其本意。
总结
我们使⽤JWT,并不是说看到它新就⽤,⽽应该考虑其适⽤场景,如果需要进⾏管理,可以考虑使⽤Session,毕竟其⽅案更加成熟。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论