JWT理论介绍

文章目录

  • 一、什么是JWT
  • 二、JWT的组成
    • 1.Header(头部)
    • 2.Payload(负载)
    • 3. Signature(签名)
  • 三、为什么要使用JWT


一、什么是JWT

JWT(JSON Web Token)是一个开放标准(RFC 7519)定义的方式,用于在各方之间安全地传输信息。这些信息可以是验证、授权、信息交换等。JWT 允许在请求之间安全地传输信息,因为信息是经过数字签名的,并且可以被验证和信任。JWT 通常用于实现无状态的、基于令牌的认证。

二、JWT的组成

1.Header(头部)

Header(头部):描述了 JWT 的元数据,比如使用的签名算法(HMAC SHA256, RSA 等)。

{  "alg": "HS256",  // 指定签名算法为HMAC SHA256  "typ": "JWT"     // 指定类型为JWT  
}

这个 JSON 对象会被 Base64Url 编码,形成 JWT 的第一部分。

2.Payload(负载)

Payload(负载):包含了声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:registered, public, 和 private。

  • Registered claims: 这些是一组预定义的声明,不是强制的,但是推荐。如:iss (issuer), exp (expiration time), sub (subject), aud (audience), 等。
  • Public claims: 可以包含任何信息,但应避免冲突与注册的声明。
  • Private claims: 用于在同意使用它们的各方之间共享信息。
{  "sub": "1234567890", // JWT的所有人(用户ID)  "name": "John Doe", // 用户的名字  "admin": true,      // 用户是否为管理员  "iat": 1516239022   // JWT的签发时间  
}

这个 JSON 对象也会被 Base64Url 编码,形成 JWT 的第二部分。

3. Signature(签名)

Signature(签名):是对前两部分(Header 和 Payload)的签名,以防止数据被篡改。签名需要一个密钥(secret)或公钥和私钥对。

三、为什么要使用JWT

因为HTTP协议是无状态的,所以我们登录之后,再次向服务器发送请求,服务器是不知道这个请求是谁发送的。我们可以在登录成功后,将用户ID返回给前端,下次请求时携带这个信息再发送请求,这样服务器就知道每次发送请求的用户了。
这样看上去挺好的,但是有一个问题是服务器是无法信任这个信息的。为什么无法信任?因为这个信息存在客户端,是有极有可能被篡改或者伪造的,服务器无法知晓这个信息是之前自己给颁发的还是伪造或者经过篡改的。总之问题的根源就是:这个信息无法被服务器验证,服务器不能验证这个信息的真假,从而导致服务器无法信任这个信息。
如何解决这个信任的问题呢?我们过去用cookie+session的方式,这种方式是可以解决这个问题的。比如服务器存一个session,后端将session_id设置到HTTP响应的cookie中,并发送给前端。这里可以设置cookie的多个属性,如域名、路径、有效期、安全标志(HTTPS)、HttpOnly等,以提高安全性。下次浏览器发送请求的时候,携带这个session_id,服务器在自己内存里面去找看有没有对应的session。

cookie+session模式的优缺点:

优点:

  • 扩展性和可用性:通过良好的编程,可以控制保存在cookie中的session对象的大小,实现较高的扩展性和可用性。
  • 安全性:使用加密和安全传输技术(如SSL),可以减少cookie被破解的可能性。同时,由于Session是保存在服务器端的,因此不存在敏感信息泄露的风险。
  • 缺点:

  • 依赖性和单点风险:如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量。此外,如果使用了持久化session数据的方法(如写入数据库或文件持久层),那么依赖于这些持久层的数据库或文件系统可能会成为单点风险。
  • 分布式架构支持:在分布式架构或面向服务的跨域体系结构下,session的共享和同步可能成为一个问题。需要使用如Redis或Memcached等外部存储系统来实现session的共享。
  • 服务器压力问题:将session存在服务器上,如果登录用户过多,会增加服务器的存储压力。

  • 如果使用JWT的话,可以避免cookie+session模式下存在的这些问题。因为jwt是存在于客户端的,减轻了服务器存储的压力,同时在分布式架构或面向服务的跨域体系结构下也可以很好的使用。
    jwt是服务器把要发送给前端的信息用一个密钥来加密,生成一个签名,然后把信息(jwt)返回给前端。

    这样做可以防止伪造和篡改吗?


    当然可以。假如把JWT中的信息部分(负载部分)进行了修改,然后发送到服务器,服务器验证是通过不了的。因为签名部分是根据负载部分用密钥进行加密的,修改负载部分之后,服务器用存储在服务器端的密钥再次对负载部分进行加密,加密后的结果再和jwt中的签名部分进行比对,这样是对不上的,所以验证是通不过的。


    那如果把负载部分和签名部分都同时进行修改呢?因为签名部分是根据负载部分的信息,使用密钥进行加密的,而密钥是存在于服务器的,不存在于前端的,你拿不到这个密钥。没有办法拿到这个密钥的话,就没有办法修根据修改后的负载信息生成正确的签名。


    jwt的优缺点
    优点:

  • 无状态性:JWT是无状态的,服务器不需要保存任何关于客户端的会话信息,这使得JWT非常适合分布式系统和微服务架构。
  • 可扩展性:JWT的有效载荷可以包含任意数据,可以根据需求添加自定义的用户信息,如权限等。
  • 跨平台性:JWT是基于JSON格式的标准,可以被多种编程语言支持和解析。
  • 缺点:

  • 无法撤销:一旦JWT签发后,无法撤销或更改其内容。如果需要在JWT的有效期内提前使其失效,需要额外的处理。
  • 动态更新性:由于JWT的无状态性,当用户的信息或权限发生变化时,服务器需要重新签发一个JWT。这可能会导致系统需要额外的处理来控制JWT的过期时间和更新机制。 令牌大小:由于JWT包含了许多信息和签名,因此它在网络传输中的大小可能比传统的会话ID要大。

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

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

相关文章

GEE训练教程——如何确定几何形状的中心点坐标和相交的坐标

简介 在GEE中,可以使用.geometry()方法来获取几何形状的中心点坐标和相交的坐标。 首先,使用.geometry()方法获取几何形状的几何信息,然后使用.centroid()方法获取几何形状的中心点坐标。示例代码如下: // 获取几何形状的中心点…

家族企业如何找到合适的人才

家族企业似乎对外来的资源和活力会产生排斥作用。一般外来人员很难享受股权,其心态也永远只是打工者,始终难以融入组织中。 在80年代,家族企业靠胆识创业,90年代,靠经验发展,但在知识经济的今天&#xff0c…

ResourceManager 的 rpc server 模型

一. yarn ResourceManager 的三种通信协议 ResourceTrackerProtocol NodeManager 和 ResourceManager 的 RPC 通信协议。其中 ResourceManager 充当RPC Server的角色,而 NodeManager 充当 RPC Client 的角色。NodeManager 通过该协议向 ResourceManager 注册、汇报…

kotlin 音频播放,需要 支持 多音轨同时播放 音频文件, 且支持设置播放速度帮我写一段代码。 要求在音频播放期间,可以设置播放速度

在Android中,SoundPool 主要用于播放短小的音频片段,如游戏音效,并且它并不直接支持设置播放速度(播放速率)。SoundPool 的 play 方法允许你调整播放的优先级和循环次数,但并不能直接调整播放速度。 然而&…

使用Puppeteer生成echarts图片

Puppeteer简介 Puppeteer 是一个用于控制 Headless Chrome 或 Chromium 浏览器的 Node.js 库。它提供了一个高层次的 API,能够让你以编程方式操作浏览器,从而实现自动化任务,比如生成页面截图和 PDF、抓取网页内容、自动化表单提交、UI 测试…

快速测试 Mybatis 复杂SQL,无需启动 Spring

快速测试mybatis的sql 当我们写完sql后,我们需要测试下sql是否符合预期,在填入各种参数后能否正常工作,尤其是对于复杂的sql。 一般我们测试可能是如下的代码: 由于需要启动spring,当项目较大的时候启动速度很慢,有些…

Python 中的装饰器及其作用

装饰器是Python中一种特殊的语法,它允许在不修改原函数代码的情况下,对函数进行功能的扩展或修改。装饰器的作用可以理解为在函数执行前后添加额外的功能,比如日志记录、性能统计、缓存等。 装饰器的实现原理是通过将函数作为参数传递给装饰…

[Kubernetes] 容器运行时 Container Runtime

文章目录 1.容器运行时(Container Runtime)2.容器运行时接口3.容器运行时层级4.容器运行时比较5.强隔离容器6.K8S为何难以实现真正的多租户 1.容器运行时(Container Runtime) Container Runtime 是运行于 k8s 集群每个节点中,负责容器的整个生命周期。Docker 就目前…

Golang发送邮件如何验证身份?有哪些限制?

Golang发送邮件需要哪些库?怎么设置邮件发送的参数? 对于开发者而言,使用Golang发送邮件是一种常见需求。然而,在发送邮件的过程中,验证身份是一个至关重要的环节,它确保了邮件的可靠性和安全性。A将探讨G…

idea破解码激活码2024

下面2个是最新激活码,支持最新2024版本,大家按教程操作,就可以成功激活,正规激活码均有一定的时效性。 进入到IDE登陆页面,选择左下角“Proxy settings/代理设置”,如果没有这个选项,则说明版本…

【C++小知识】基于范围的for循环(C++11)

基于范围的for循环&#xff08;C11&#xff09; 范围for的引入范围for的使用条件 范围for的引入 int main(void) {int arr[] { 1,2,3,4,5,6,7,8,9 };int sz sizeof(arr) / sizeof(arr[0]);for (int i 0; i < sz; i){cout << arr[i] << " ";}retur…

bitset用法

参考:https://blog.csdn.net/weixin_45697774/article/details/105563993 题目:https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/description/ class Solution { public:int maxTotalReward(vector<int>& rewardValues) {bitset<10000…

C语言刷题(函数)

一个数如果恰好等于它的所有因子(不包括它本身)之和&#xff0c;这个数就称为“完数”。编写程序按如下要求统计自然数1—100间完数的个数&#xff1a; //判断完数 #include <stdio.h> //完数判断函数 int isPerfect(int n) { int sum 0; for (int i 1; i <…

三极管十大品牌

三极管十大品牌-三极管品牌-晶体三极管哪个品牌好-Maigoo品牌榜

Python - 读取 mobi 电子书内容

文章目录 使用 mobi-reader 库安装使用 使用 mobi 库安装读取查看文件mobiunpack 命令行工具 相关库&#xff1a; mobi : https://github.com/iscc/mobimobi-reader &#xff1a; https://github.com/MrLucio/mobi-reader 使用 mobi-reader 库 安装 pip install mobi-reader…

我的创作纪念日-在SCDN的5年

机缘 五年前&#xff0c;一个偶然的机会让我接触到了SCDN这个充满活力和创造力的社区。我抱着对技术的热爱和对知识的渴望&#xff0c;决定在这里开启我的创作之旅。最初&#xff0c;我成为创作者的初心&#xff0c;是希望将自己在实战项目中的经验、日常学习过程中的点滴&…

【面试干货】 B 树与 B+ 树的区别

【面试干货】 B 树与 B 树的区别 1、B 树2、 B 树3、 区别与优缺点比较4、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在数据库系统中&#xff0c;B 树和 B 树是常见的索引结构&#xff0c;它们在存储和组织数据方面有着不同的设计…

SAS:coalescec函数和cmiss函数的应用及拓展

背景&#xff1a;CRF中收集了每个受试者3个RACE方面的信息&#xff0c;SDTM SPEC规定了RACE的生成规则为&#xff1a;若收集了多个RACE&#xff0c;RACE“MULTIPLE”&#xff0c;详细的RACE信息记录在SUPPDM中&#xff1b;若仅收集到一个RACE&#xff0c;则RACE等于RACE1-RACE3…

LabVIEW 用于 MES 系统和卡钳上位机检测

LabVIEW 确实可以用于制造执行系统&#xff08;MES&#xff09;的开发以及卡钳上位机检测。以下是详细说明&#xff1a; 使用 LabVIEW 开发 MES 系统 数据采集与处理&#xff1a;LabVIEW 擅长实时数据采集和处理&#xff0c;可以连接多种传感器和设备&#xff0c;获取生产线上…

探索JavaScript 18:新特性全解析

JavaScript&#xff0c;作为全球最广泛使用的编程语言之一&#xff0c;每年的更新都备受开发者社区的关注。2023年&#xff0c;JavaScript的新版标准——ECMAScript 2023&#xff08;也称为JavaScript 18&#xff09;引入了多项激动人心的新特性&#xff0c;这些特性不仅优化了…