如今,越来越多的项目开始采用JWT作为认证授权机制,那么它和之前的Session究竟有什么区别呢?今天就让我们来了解一下。

JWT是什么

定义

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

特点

使用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

session传递参数_JWT与Session的比较相关推荐

  1. session传递参数_分布式 Session 之 Spring Session 架构与设计

    作者 | 李增光 杏仁后端工程师.「只有变秃,才能变强!」 ​前言 开始进行 Web 开发时,我们可能会遇到这样的情况,当服务器重启之后,之前的登录状态会失效需要重新登录.又或者你的应用程序部署了不止 ...

  2. tensorflow中使用tf.ConfigProto()配置Session运行参数GPU设备指定

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/dcrmg/article/detail ...

  3. 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理

    先上一张本文所描述的适用场景图 分布式场景,共3台server: 前端Server Order App Server Warehouse App Server 功能: 前端Server可以不停的发送C ...

  4. php无法引用,PHP错误:“无法通过引用传递参数2”

    我只需要这个不太了解的PHP错误的帮助: 致命错误:在第13行的/web/stud/openup/inactivatesession.php中无法通过引用传递参数2 error_reporting(E ...

  5. asp.net传递参数

    ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事 ...

  6. JSP中页面向Action传递参数的几种方式

    转自:http://zhidao.baidu.com/link?url=kEOyifTghb--LvcQVpkh-kkpgZIcYU-dlqQyNM5e3b_9fywiDQGVxAOHVedJkqGA ...

  7. springmvc 重定向传递参数

    2019独角兽企业重金招聘Python工程师标准>>> springMVC 重定向是 有 方法可以 传递参数的, 以前 都是 丢进去session里面.这样也是可以的. 可是 spr ...

  8. Azkaban通过API动态传递参数

    需求 目前有一个普通的java process作业, java 内容如下: public class GenerateShell {public static void main(String[] a ...

  9. session共享mysql_多服务器session共享之mysql共享

    一.PHP SESSION 的工作原理 在解决问题之前,先来了解一下 PHP SESSION 的工作原理.在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() ...

最新文章

  1. Luke 5—— 可视化 Lucene 索引查看工具,可以查看ES的索引
  2. 让我们带着感恩的心生活
  3. r语言和python-PythonR语言-python和r相遇
  4. 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库 1
  5. IntelliJ如何设置自动导包
  6. Linux基础学习五:软件的相关安装(JDK,Tomcat,Yum)
  7. ios(safar/微信)返回不执行js
  8. Java的反射(二)
  9. javascript获取asp.net服务器端控件的值
  10. 牛客小白月赛2 G 文 【模拟】
  11. 点钞机语音怎么打开_我有这些语音识别指令,你都知道吗?
  12. HAUT OJ 1475: cxk下棋
  13. 20201024——记录一下自己的前端工程师之路
  14. i5 10500h和i5 10300h有什么区别i510500h和i510300h差距大不大
  15. 【金融量化】中泰证券何波先生关于XTP交易接口的演讲
  16. Python让Excel飞起来—模块
  17. #Linux#进程间通信# 管道(pipe)-标准流管道pipe
  18. IDEA 卡住半天,buid(编译)不动——解决办法(适用于maven和gradle)及定位思路...
  19. 人体红外传感器简明教程
  20. RPG游戏-小地图系统(二)

热门文章

  1. 多余的读写端口什么时候会对程序造成影响_程序员需要了解的硬核知识之控制硬件...
  2. C++一维数组指针详解
  3. python中实现sigmiod功能
  4. MFC中文件打开与保存
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】
  6. git 撤销修改:未push 、已push
  7. Scrapy - Request 和 Response(请求和响应)
  8. Python 生成器 和 yield 关键字
  9. mysql判断不等于空的脚本_Shell脚本中判断输入变量或者参数是否为空的方法
  10. 计算机网络教室任课教师登记表,多媒体教室工作计划