JWT理论知识
JWT学习文章:
简介
JWT全拼是JSON Web Tocken,是目前最流行的跨域身份认证解决方案,特别适合分布式系统,减少用户麻烦,保证账号安全,减少服务器负载。
有人经常将OAuth与JWT搞混,两种是用于同一场景的不同情况。同一场景是指登录场景,不同情况是指,OAuth是第三方授权登录(详情戳这里),JWT是直接登录。
产生的背景
最经典的登录实现方式是通过session:
1.用户输入用户名、密码提出登录请求;
2.服务器收到请求并验证用户名和密码,正确情况下存储在服务器的session中,并返回用户session_id;
3.用户发起新的请求并携带cookie中的session_id;
4.服务器验证session_id并验证服务器内的session,无误响应用户请求;
所有后续请求都如此进行,如果服务器对session有时间限制后自动销毁,到时间后用户将重新进行用户名、密码的登录。
存在的问题
如果用户数量过大,服务器中存储大量的session信息,严重影响服务器的性能;
服务器无法方便的进行分布式部署,因为session不能方便的实现服务器间的同步,无法实现横向扩展(不是不能实现,而是实现会变得复杂,例如创建session持久化层,此种方法修改难度大,且持久化层挂掉,所有服务都会挂掉)。
应运而生,JWT解决了以上的问题。接下来进行学习JWT的相关知识。
JWT结构
组成部分
Header
Payload
Signature
连接形式
xxxxx.yyyyy.zzzzz
让我们一步步来说:
Header
格式:JSON
包括内容是:
Token的类型,就是JWT
加密的方式,例如HMAC SHA256 or RSA,一般使用HMAC SHA256
例子:
{
"alg": "HS256",
"typ": "JWT"
}
接着用Base64Url编码成为JWT的第一部分。
Payload
存放有效信息的部分,有效信息主要包含三部分:
- 标准中注册的声明
- 公共的声明
- 私有的声明
标准中注册的声明:
iss: JWT签发者
sub: JWT所面向的用户
aud: 接收JWT的一方
exp: JWT的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该JWT都是不可用的.
iat: JWT的签发时间
jti: JWT的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
此部分内容建议使用但不强制。
公共声明:
可以添加任何信息,一般是用户信息和业务信息。不建议添加敏感信息,因为payload部分会用Base64Url编码,可能会被反向解密。
私有声明:
可以存放前后端共同定义的声明,方便前后端进行不敏感的信息交换。同样不建议添加敏感信息,原因也是可能会被解码。
例子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
此部分内容同样进行Base64Url编码,组成JWT的第二部分内容。
Signature
此部分内容是Header和Payload各自经过Base64Url编码后用“.”连接,根据Header中声明的加密方法进行加密后组成的。
类似下面的方式:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
使用方式
加在http请求或HTTPS的请求头中,样式如下:
Authorization: Bearer <token>
注意一定要在token之前加上Bearer,之间空格。
结语
掌握JWT的结构和原理是根本。
大家可以生成一个密钥,在https://JWT.io/#debugger-io上试试,方便进行理解。
此篇文章可以当做JWT的文档来看,因为结构部分的内容和JWT文档的内容并无二意。
参考文档:https://JWT.io/introduction
JWT理论知识的更多相关文章
- js中函数的一些理论知识
函数的一些理论知识 1. 函数: 执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...
- 用VC进行COM编程所必须掌握的理论知识
一.为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的.结构化编程 ...
- 图形学理论知识 BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function)
图形学理论知识 BRDF 双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF理论 BRDF表示的是双向反射分布函数(Bidire ...
- TestNG学习-001-基础理论知识
此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...
- [转] DDD领域驱动设计(三) 之 理论知识收集汇总
最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...
- Winsock网络编程笔记(4)----基本的理论知识
前面的笔记记录了Winsock的入门编程,领略了Winsock编程的乐趣..但这并不能算是掌握了Winsock,加深理论知识的理解才会让后续学习更加得心应手..因此,这篇笔记将记录一些有关Winsoc ...
- Android初级教程对大量数据的做分页处理理论知识
有时候要加载的数据上千条时,页面加载数据就会很慢(数据加载也属于耗时操作).因此就要考虑分页甚至分批显示.先介绍一些分页的理论知识.对于具体用在哪里,会在后续博客中更新. 分页信息 1,一共多少条数据 ...
- Android初级教程理论知识(第四章内容提供器)
之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...
- 关于mpi的理论知识以及编写程序来实现数据积分中的梯形积分法。
几乎所有人的第一个程序是从“hello,world”程序开始学习的 #include "mpi.h" #include <stdio.h> int main(int a ...
随机推荐
- MySQL中MyISAM为什么比InnoDB查询快
大家都知道在MySQL中,MyISAM比InnoDB查询快,但很多人都不知道其中的原理. 今天我们就来聊聊其中的原理,另外也验证下是否MyISAM比InnoDB真的查询快. 在探索其中原理之前,我们先 ...
- .Net Core·寄托于IIS的REST服务405的问题
阅文时长 | 0.48分钟 字数统计 | 828.8字符 主要内容 | 1.引言&背景 2.声明与参考资料 『.Net Core·寄托于IIS的REST服务405的问题』 编写人 | SCsc ...
- [bug] Hive:map.xml could only be replicated to 0 nodes instead of minReplication (=1). There are 0 datanode(s) running and no node(s) are excluded in this operation.
原因: datanode未运行,重启hdfs
- [PTA]7-3 逆序的三位数 (10分)
要求: 程序每次读入一个正3位数,然后输出按位逆序的数字.注意:当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 正确思路: 拆分字符串后拼接成整数 1 #includ ...
- 攻防世界(十三)unserialize3
攻防世界系列 :unserialize3 1.打开题目,反序列化 2.代码审计 类xctf被调用时_weakeup()函数会被自动执行,但当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常, ...
- OpenStack平台功能性测试工具Tempest安装
社区对OpenStack平台功能性的测试工具采用Tempest,性能测试采用Rally. 1.什么是Tempest tempest├── api # API的测试集├── cli # OpenStac ...
- vue2路由之指定滑动位置scrollBehavior-(载转)
看源码的时候看到这个属性: 新手自然不知道这个是什么东西了,查了下vue API: https://router.vuejs.org/en/advanced/scroll-behavior.html ...
- qt利用QT designer构建第一个界面helloworld工程
qt利用QT designer构建第一个界面helloworld工程原创ZJE_ANDY 发布于2017-04-07 20:25:28 阅读数 6613 收藏展开第一步:点击New Project 第 ...
- VMWare虚拟机显示模块“Disk”启动失败
找到启动虚拟机的目录: 在此路径中找到.vmx文件,在文件中查找(Ctrl+F快速查找)vmci0.present,此时会看到"vmci0.present = "TRUE" ...
- SpringMVC=>解决JSON乱码问题
<!-- 解决JSON乱码问题 --> <mvc:annotation-driven> <mvc:message-converters register-defaults ...