JWT

Json Web Token

1、JWT长什么样?

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

2、JWT的构成

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

1.header

jwt的头部承载两部分信息:

  • 声明类型,这里是jwt
  • 声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON:

{'typ': 'JWT','alg': 'HS256'
}

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2.playload

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

  • 标准中注册的声明
  • 公共的声明
  • 私有的声明

标准中注册的声明 (建议但不强制使用) :

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

定义一个payload:

{"sub": "1234567890","name": "John Doe","admin": true
}

然后将其进行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

3.signature

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

  • header (base64后的)
  • payload (base64后的)
  • secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。

3、使用流程

流程说明: 1,浏览器发起请求登陆,携带用户名和密码; 2,服务端验证身份,根据算法,将用户标识符打包生成 token, 3,服务器返回JWT信息给浏览器,JWT不包含敏感信息; 4,浏览器发起请求获取用户资料,把刚刚拿到的 token一起发送给服务器; 5,服务器发现数据中有 token,验明正身; 6,服务器返回该用户的用户资料;

4、JWT的6个优缺点

1、JWT默认不加密,但可以加密。生成原始令牌后,可以使用改令牌再次对其进行加密。

2、当JWT未加密方法是,一些私密数据无法通过JWT传输。

3、JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。

4、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。

5、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。

6、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。


参考:

什么是 JWT – JSON WEB TOKEN - 简书 (jianshu.com)

JWT结果功能用处简单介绍相关推荐

  1. Zemax学习笔记(1)- 界面与功能的简单介绍

    Zemax学习笔记(1)- 界面与功能的简单介绍 OpticStudio入门-第1部分 界面与功能的简单介绍 OpticStudio入门-第1部分 获取Zemax 2019可以在在淘宝上购买,商家会给 ...

  2. 浏览器中 F12 功能的简单介绍

    chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...

  3. chrome修改js数据怎么生效_chrome浏览器中 F12 功能的简单介绍

    首先介绍Chrome开发者工具中,调试时使用最多的三个功能页面是:元素(ELements).控制台(Console).源代码(Sources),此外还有网络(Network)等. 元素(Element ...

  4. STM32F1关于SDIO功能的简单介绍

    主要参考:STM32F10xxx参考手册V10.SD卡2.0协议 注:本篇文章所引用图如未标注则是采用<STM32中文参考手册V10>.<STM32英文参考手册V15>,如表标 ...

  5. Android开发之--(WIFI,蓝牙,电池,背光,SD卡,摄像头,按键,MIC,重力感应等)功能的简单使用

    1.WIFI(打开,关闭,使能,扫描等) 2.蓝牙(打开关闭) 3.电池(获取电池的各种参数和状态信息) 4.背光(背光调节) 5.U盘/SDcard(判断是否插入,读取等) 6.屏幕校准(准确的说是 ...

  6. 微信公众平台接口简单介绍

    微信公众平台的管理地址是:https://mp.weixin.qq.com 注册完个人公众号以后,登录到微信公众平台的管理后台,需要用微信扫一下二维码才能登录进去哦... 这个后台提供了基本的对公众号 ...

  7. chrome浏览器中F12的简单介绍

    Chrome开发者工具中主要使用的四个功能页面: 元素(Elements).控制台(Console).源代码(Sources).网络(Network) 1.元素(Elements) 用于查看或修改HT ...

  8. 【修真院小课堂】JWT简单介绍

    JWT简单介绍 小课堂                    罗佳超 <section>             <p>1.背景介绍</p>             ...

  9. 从零开始开发Android相机app(三)简单介绍图像滤镜功能

    目前章节 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机app(三)简单介绍图像滤镜功能 文 ...

  10. USB简单介绍USB共享网络功能(一)

    一.USB的简单介绍&USB共享网络功能 USB是比较常用接口类型, 也是PC的标配, 通常外设通过USB口连接至PC 在USB的世界里, 分USB Host和USB Device两种角色 P ...

最新文章

  1. CentOS 6和CentOS 7管理系统服务的区别
  2. 关于LUA+Unity开发_toLua篇【二】
  3. css overflow和border-radius一起用 解决圆角和滚动条一起用的问题
  4. Linux文件系统只读Read-only file system
  5. 进程间通信——共享内存(CreateFileMapping+MapViewOfFile)
  6. 手写实现Spring(IOC、DI),SpringMVC基础功能
  7. js中的bool值转换及 、||、 !!详解
  8. 【JS 逆向百例】某易支付密码 MD5+AES 加密分析
  9. asp.net使用httpModule来实现一个反向代理
  10. python系列九:python3迭代器和生成器
  11. 《计算机网络 自顶向下方法》(第7版)答案(第九章)
  12. 系统封装到底有个什么用
  13. UML-包图中包与包之间的关系
  14. StringBuilder
  15. String的intern方法
  16. 认证资料大全(十三)------ Juniper Networks认证列表
  17. 药物优化中的Oracle什么意思?评价指标(Metrics)是什么?
  18. 给定一个由N个非负整数构成的序列,我们来定义一下序列的中位数,如果N是奇数,在对序列排序后,中位数就是最中间的那个数,即排序后,中位数的位置为(N+1)/2,这里序列的位置从1开始。如果N是偶数,则中
  19. Linux各个发行版本代号整理
  20. android 调用相机并获取图片地址,Android 7.0使用FileProvider获取相机拍照的图片路径...

热门文章

  1. 编程猫李天驰:让编程教育回归互联网
  2. SpringCloudAlibaba之Nacos
  3. 台式计算机主板电池型号,台式机主板电池没电会怎么样 主板电池怎么换
  4. 课工场论坛列表发帖制作
  5. 模乘与Montgomery 模乘
  6. 你想要的宏基因组-微生物组知识全在这(19国庆特别篇)
  7. python数据分析实例-python数据分析-11数据分析实战案例
  8. 看了本文让你laravel安装laravel-queue-rabbitmq一路顺风
  9. gcc10环境下bwa安装报错的解决方案
  10. java 日程日历_java编程:我要做一个提醒日程的软件,不是要用到日历和时钟么,这要不要自己编,还是可以直接同步电脑上...