3.6 JWT研究
3.6.1 JWT介绍
在介绍JWT之前先看一下传统校验令牌的方法,如下图:

问题:
传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,并根
据令牌获取用户的相关信息,性能低下。

解决:
使用JWT的思路是,用户认证通过会得到一个JWT令牌,JWT令牌中已经包括了用户相关的信息,客户端只需要携带
JWT访问资源服务,资源服务根据事先约定的算法自行完成令牌校验,无需每次都请求认证服务完成授权。
JWT令牌授权过程如下图:

资源服务有可能力校验令牌。认证服务给客户端办法的是JWT令牌

什么是JWT?
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于
在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公
钥/私钥对来签名,防止被篡改。
官网:https://jwt.io/
标准:https://tools.ietf.org/html/rfc7519
JWT令牌的优点:
1、jwt基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
4、资源服务使用JWT可不依赖认证服务即可完成授权。
缺点:
1、JWT令牌较长,占存储空间比较大。

3.6.1.1 令牌结构

通过学习JWT令牌结构为自定义jwt令牌打好基础。
JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
Header
头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
一个例子如下:
下边是Header部分的内容
{
"alg": "HS256",
"typ": "JWT"
}
将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

Payload
第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比
如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。
一个例子:
{
"sub": "1234567890",
"name": "456",
"admin": true
}
Signature
第三部分是签名,此部分用于防止jwt内容被篡改。
这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明
签名算法进行签名。
一个例子:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

base64UrlEncode(header):jwt令牌的第一部分。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:签名所使用的密钥。

最新文章

  1. 【hadoop】——HDFS解压缩实现
  2. window下从硬盘安装linux系统iso镜像文件的方法
  3. Java 获取距离最近一段时间的时间点
  4. .NET下的加密解密大全(1): 哈希加密
  5. Django中的Form(二)
  6. WPF之核心面板(容器)控件简单介绍
  7. Win10玩魔兽争霸不能全屏显示的设置教程
  8. django1.7 配置demo教程(环境搭建)
  9. sizeof计算空间大小的总结
  10. android开发——Android开发中的47个小知识
  11. 跨域技术(JSONP与CROS)
  12. swagger 自动生成接口测试用例
  13. 解决ArrayList线程不安全
  14. 多线程-synchronized、lock
  15. 错误<BEA-101165> <Could not load user defined filter in web.xml
  16. Python:zip()函数
  17. 发个招聘贴,魔都求手游C++后端,UNITY前端,开发实习生
  18. 【刷题】洛谷 P3613 睡觉困难综合征
  19. Java之反转排序
  20. Linux网络故障排查

热门文章

  1. 如何理解MVVM
  2. MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子
  3. 在 windows 上安装 git 2.22
  4. pip 安装包 不行 自己下载whl 包自己安装
  5. [Dart] Manipulate Lists/Arrays in Dart
  6. sql server 的临时表和表变量
  7. Laravel 报 Nginx 502 : Bad Gateway 错误
  8. RabbitMQ的5种模式
  9. Linux操作系统常用命令合集——第六篇-压缩和归档操作(16个命令)
  10. [MUTC2013]idiots