JWT原理分析

为什么会有JWT的出现?

首先不得不提到一个知识叫做跨域身份验证,JWT的出现就是为了更好的解决这个问题,但是在没有JWT的时候,我们一般怎么做呢?一般使用Cookie和Session,流程大体如下所示:

  1. 用户向服务端发送用户名和密码进行验证
  2. 服务端验证之后,相关数据(如用户角色、登录时间等信息)会保存在当前的Session中
  3. 服务端向用户返回一个唯一的session_id,同时在响应请求中设置cookie,属性名为jessionid
  4. 客户端收到之后会保存jessionid,再次请求的时候,会在header中设置,服务端可以从请求头中获取
  5. 服务端验证获取到的sessionid是否存在,即可验证是否是同一用户

使用Cookie和Session这种模式最大的问题之一就是它不支持横向扩展,也就是不支持分布式架构,如果当前只有一台服务器,那就没什么问题,但是在当下的时代,一台服务器往往是不够的,现在绝大多数都是服务器集群。如果是服务器集群,那么在负载均衡的时候就不能保证每次都发送到同一台服务器上,这样的话也就不能验证用户的身份了,但是这对用户是不友好的,用户是感知不到自己的请求发送到了别的服务器上的。

所以这个时候就提出来了让session落库,当一个请求发过来之后,验证服务从数据库去验证用户身份,这样就能让各个服务器正确的验证用户身份信息,但是这样做,依赖性太强,如果这个session数据库挂了,那么整个认证系统都会崩溃。

JWT的面世

因为Cookie和Session的局限性,所有有人提出只让客户端存储数据,服务端不保存任何会话数据,每个请求都被发送回服务器,JWT就出现了。

下面放一张JWT官网的一张图,描述的是JWT的认证过程,可以先看看这张图,有个印象:

下面简单讲讲JWT的概念:

JWT是Json Web Token的缩写,它将用户信息加密到Token中,服务器不保存任何的用户信息。服务器通过使用保存的密钥验证Token的正确性,只要正确就通过验证。

上面可能很难理解,把它日常化一下就是在没有网络的年代,部门A要申请部门B的某个机器使用权,部门A肯定要先老大打报告,写申请,最后老大签字同意,部门A再拿着这个带有老大签字的这个申请报告去找部门B,部门B才能同意部门A使用,这就是JWT的流程。

JWT的数据结构

JWT总共包含了三个部分:Header头部、Payload负载、Signature签名。这三部分共同生成Token,三部分之间用“.”做分割

JWT 头部

JWT的头部是一个描述JWT元数据的JSON对象,如下所示:

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

其中的alg:表示的是签名使用的算法,默认为HMAC SHA256(写为HS256),typ:表示的是令牌的类型,JWT的令牌统一写为JWT。

这样的一个Json数据,还需要使用Base64 URL算法将其转为字符串保存。

JWT 负载

负载部分就是JWT的主体内容,同样的也是一个Json对象,它包含了需要传递的数据,但是不能传递敏感数据,因为这部分数据别人也是可以拿到并且解密的。

JWT指定有七个默认字段供选择:

  1. iss:发行人
  2. exp:到期时间
  3. sub:主题
  4. aud:用户
  5. nbf:在此之前不可用
  6. iat:发布时间
  7. jti:JWT ID 用于标识该 JWT

除了默认字段外,我们还可以自定义字段,如下所示:

同样,这部分数据依然是使用Base 64 URL算法转换为字符串加密。

JWT 签名

签名部分是对上面两部分的数据签名,通过指定的算法(在JWT头部指定的算法)生成哈希来确保数据不会被篡改。

一般流程如下:

  1. 在服务器中保存了一个密码(secret),这个密码仅仅保存在服务器中,不对用户开放。
  2. 使用JWT头部指定的签名算法以及服务器中保存的密码(secret)来生成对应的签名
  3. 在计算出签名之后,JWT头、负载、签名,三部分组成一个字符串,每个部分以“.”进行分割,构成JWT对象

JWT的认证流程

  1. 客户端发送信息给服务端,让其进行验证
  2. 服务端验证成功后,返回给客户端一个JWT
  3. 客户端将JWT保存在Cookie或放入HTTP请求的Header Authorization字段中(推荐放在这)
  4. 此后客户端请求的时候都带着JWT去请求服务端,服务端对JWT再进行验证

JWT的缺陷

  1. JWT最大的缺陷就是服务器不会保存会话状态,所以使用期间不能取消令牌或者更改令牌的权限,一旦JWT签发,在有效期内将会一直有效。
  2. 由于JWT不加密,所以JWT不能用来传递敏感数据
  3. 它有着更大的空间占用
  4. 很难应对过期的数据,由于无法废除掉已经颁布的令牌,在令牌过期之前,只能忍受过期的数据

总结

  • 在Web应用中,不能把JWT当作Session使用,绝大多数情况下,传统的cookie-session机制工作得更好
  • JWT适合一次性的命令认证,颁发一个有效期极短的JWT,即使暴露了危险也很小,由于每次操作都会生成新的JWT,因此也没必要保存JWT,真正实现无状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手撕算法-买卖股票的最佳时机 II(买卖多次)

描述 分析 使用动态规划。dp[i][0] 代表 第i天没有股票的最大利润dp[i][1] 代表 第i天持有股票的最大利润 状态转移方程为:dp[i][0] max(dp[i-1][0], dp[i-1][1] prices[i]); // 前一天没有股票,和前一天有股票今天卖掉的最大值dp[i][1] max(dp[i-1…

Linux查看磁盘空间

查看磁盘空间 df -h 查看目录所占空间 du -sh [目录] 查看当前目录下, 所有目录所占空间 (一级目录) find . -maxdepth 1 -type d -exec du -sh {} \;-maxdepth 1 查看的目录深度是1级, 2则是2级

FOCUS-AND-DETECT: A SMALL OBJECTDETECTION FRAMEWORK FOR AERIAL IMAGES

摘要 为了解决小对象检测问题,提出了一个叫做 Focus-and Detect 的检测框架,它是一个两阶段的框架。 第 一阶段包括由高斯混合模型监督的对象检测器网络,生成构成聚焦区域的对象簇 。 第二阶段 也是一个物体探测器网络,预测聚焦…

【云开发笔记No.6】腾讯CODING平台

腾讯云很酷的一个应用,现在对于研发一体化,全流程管理,各种工具层出不穷。 云时代用云原生,再加上AI,编码方式真是发生了质的变化。 从前,一个人可以写一个很酷的软件,后来,这变得…

<商务世界>《第16课 餐桌礼仪之座次》

1 简要 我国自古以来就很重视座位礼仪,非讲究,分君臣、分宾主、分方位等等而今座位礼仪已经简化为: 以“中”为尊: 中心为尊,突出主位。 以“右”为尊: 从历史上到国际上都是以右为尊。 以“内”为尊&…

故障诊断模型 | 基于图卷积网络的轴承故障诊断

文章目录 文章概述模型描述模型描述参考资料文章概述 故障诊断模型 | 基于图卷积网络的轴承故障诊断 模型描述 针对基于图卷积网络(GCN)的故障诊断方法大多默认节点间的权重相同、导致诊断精度较低与鲁棒性较差的问题,提出了一种基于欧式距离和余弦距离的 GCN 故障诊断方法…

力扣热门算法题 62. 不同路径,66. 加一,67. 二进制求和

62. 不同路径,66. 加一,67. 二进制求和,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.21 可通过leetcode所有测试用例。 目录 62. 不同路径 解题思路 完整代码 Python Java 66. 加一 解题思路 …

29-goto语句

29-1 goto语句介绍 C语言中提供了可以随意滥用的goto语句和标记跳转的标号。 从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-回文日期

solution1&#xff08;通过50%&#xff09; #include<stdio.h> void f(int a){int t a;while(a){printf("%d", a % 10);a / 10;}if(t < 10) printf("0"); } int isLeap(int n){if(n % 400 0 || (n % 4 0 && n % 100 ! 0)) return 1;r…

抖音IP属地怎么更改

抖音是一个非常受欢迎的短视频平台&#xff0c;吸引了无数用户在上面分享自己的生活和才艺。然而&#xff0c;随着快手的火爆&#xff0c;一些用户开始担心自己的IP地址会被他人获取&#xff0c;引起个人隐私风险。那么&#xff0c;抖音用户又该如何更改到别的地方呢&#xff1…

父类子类构造方法调用示例

父类写无参构造&#xff0c;子类不写构造&#xff0c;实例化子类&#xff0c;会同时调用父类构造方法 public class Father {private String name;private int age;public Father() {System.out.println("父类无参构造");}} public class Son extends Father {priva…

私密个人相册 Android 藏起来你的照片和视频

珍藏每一刻 软件介绍版本号 1.0.0更新日期 2024-03-20 在数字时代&#xff0c;每个人都是自己故事的摄影师。私密个人相册应用&#xff0c;专为珍视隐私与回忆的你设计。我们提供一个安 全的空间&#xff0c;让你的每一张照片和每一个视频都得到妥善保护&#xff0c;同时也能…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

C++之移动语义与智能指针

目录 移动语义 1、几个基本概念的理解 2、复制控制语义的函数 3、移动控制语义的函数 3.1、移动构造函数: 3.2、移动赋值函数 4.区别 5、std::move函数 6.代码演示: 资源管理与智能指针 一、C语言中的问题 二、C的解决办法(RAII技术)&#xff1a; 三、四种智能指针…

2024年产品品牌化深度分析:消费者心理与品牌化、产品质量的权衡

随着市场竞争的加剧和消费者需求的多样化&#xff0c;产品品牌化已经成为企业不可或缺的战略选择。在2024年&#xff0c;当消费者面对众多商品时&#xff0c;品牌化与产品质量之间的权衡成为了消费者决策的重要因素。那么&#xff0c;在消费者心理中&#xff0c;品牌化重要还是…

cadence中run pspice运行仿真 光标搜索Search Command

cadence中run pspice运行仿真 光标搜索Search Command 在cadence进行波形分析时&#xff0c;如果可以随时找到对应的点分析十分方便。 也就是cadence中的光标搜索&#xff08;Search Command&#xff09;功能 但是需要输入正确形式才能使用 官方说明&#xff1a;PSpice User…

chatGPT中文在线版本(亲测可用

ChatGPT是一个先进的自然语言处理模型&#xff0c;由OpenAI开发。它通过深度学习技术训练而成&#xff0c;可以进行对话、回答问题等多种自然语言处理任务。对于学生、开发者、研究人员和任何对人工智能感兴趣的人来说&#xff0c;这是一个非常有用的工具。 最近找到一个国内可…

Linux 服务升级:Nginx 热升级 与 平滑回退

目录 一、实验 1.环境 2.Kali Linux 使用nmap扫描CentOS 3.Kali Linux 远程CentOS 4.Kali Linux 使用openvas 扫描 CentOS 5.Nginx 热升级 6.Nginx 平滑回退 二、问题 1.kill命令的信号有哪些 2.平滑升级与回退的信号 一、实验 1.环境 &#xff08;1&#xff09;主机…

鸿蒙网络开发学习:【ylong_http】

简介 ylong_http 构建了完整的 HTTP 能力&#xff0c;支持用户使用 HTTP 能力完成通信场景的需求。 ylong_http 使用 Rust 编写&#xff0c;为 OpenHarmony 的 Rust 能力构筑提供支持。 ylong_http 在 OpenHarmony 中的位置 ylong_http 向 OpenHarmony 系统服务层中的网络协…

Adaptive Object Detection with Dual Multi-Label Prediction

gradient reversal layer (GRL) 辅助信息 作者未提供代码