JWT中的Token

news2024/12/28 11:03:51

1.JWT是什么?

jwt(json web token的缩写)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以json对象安全地传输信息,此信息可以验证和信任,因为它是数字签名的,jwt可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对,进行签名。

通俗解释:JWT简称JSON Web Token,也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,在数据传输过程中还可以完成数据加密、签名等相关处理。

2.JWT能做什么?

2.1 授权

使用JWT的最常见方案,一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由、服务和资源,单点登录是当今广泛使用JWT的一项功能,因为他的开销很小并且可以在不同的域中轻松使用。

2.2 信息交换

JSON Web Token是在各方之间安全地传输信息的好方法,因为可以对JWT进行签名(例如:使用公钥/私钥对),所以您可以确保发件人是他们所说的人,此外,由于签名是使用标头和有效负载计算的,因此你还可以验证内容是否遭到篡改。
作用:传输数据和安全验证,其主要会用在安全验证

3. 基于JWT认证

3.1 认证流程

在这里插入图片描述

  1. 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这一过程一般是一个HTTP POST请求,建议的方式是通过SSL传输(https协议),从而避免敏感信息被嗅探;
  2. 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Based64编码拼接后签名,形成一个JWT(token),形成的JWT就是一个形同lll.zzz.xxx的字符串(token、head.payload、singurater三部分组成,中间用点.连接);
  3. 后端将JWT字符串作为登录成功的返回结果返回给前端,前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时前端删除保存的JWT即可;
  4. 前端在每次请求时将JST放入HTTP Header中的Authorization位(解决XSS和XSRF问题-防伪跨拦截攻击);
  5. 后端检查是否存在,如存在验证JWT的有效性,例如:检查签名是否正确,检查Token是否过期,检查Token的接收方是否是自己(可选);
  6. 验证通过后,后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应的结果;

3.2 JWT优势

  1. 简洁(compact):可以通过URL,POST参数或在HTTP header发送,因为数据量小,传输速度也很快;
  2. 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库;
  3. 因为token是以json加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持;
  4. 不需要在服务端保存会话信息,特别适用于分布式微服务;

4.JWT组成

4.1 令牌组成

令牌就是token,类型为String,x(标头header).y(payload负载).z(签名signature)三段组成

  1. 标头(Header);
  2. 有效载荷(payload)
  3. 签名(signature)

4.2 Header

//标头通常是由两部分组成,令牌的类型(即JWT)和使用的签名算法,例如HMAC、SHA256或RSA,它会使用Base64编码组成JWT 结构的第一部分;
//注意:Base64是一种编码,也就是说,它是可以被翻译回原来的样子,它并不是一种加密过程;

//jwt将下面的头信息数据进行Base64编码(类似于加密),后期是可以进行解码;

//头部的默认值,后期可直接使用默认,不再重新写
{
  "alg":"HS256",
  "typ":"JWT"
}

4.3 Payload

//令牌的第二部分是有效负载(自包含),其中包含声明,声明式有关实体(通常是用户-用户名、用户id等)和其他数据的声明,同样的,它会使用Base64编码组成JWT结构的第二部分;

//注意:第二部分的有效负载不要放用户特别敏感的信息(例如:密码);

//jwt将下面的头信息数据进行Base64编码(类似于加密),后期是可以进行解码;

{
  "sub":"12345678",
  "name":"xx",
  "admin":true
}

4.4 Signature

前面两部分都是使用Base64进行编码的,即前端可以解开知道里面的信息,Sigurate需要使用编码后的header和payload以及我们提供的一个密钥,然后使用header中指定的签名算法(HS256)进行签名,签名的作用是保证JWT没有被篡改过
heder+payload+随机签名(保密性极高)
如:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload).secret)

签名目的:
最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被篡改,如果有人对头部以及负载的内容编码之后进行修改,在进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器就会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的,如果要对新的头部和负载进行签名,在不知道服务器加密是用的密钥的话,得出来的签名也是不一样的;

信息安全问题
1.Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗?
答:在JWT中,不应该在负载中加入任何敏感的数据,在上面的例子中,我们传输的是用户的User ID,这个值实际上不是什么敏感内容,一般情况下被知道也是安全的,但是像密码这样的内容就不能被放在JWT中了,如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快的知道你的密码了,因此JWT适合用于向Web应用传递一些非敏感信息,JWT还经常用户设计用户认证和授权系统,甚至实现web应用的单点登录。
在这里插入图片描述
在这里插入图片描述

5.使用JWT

可以直接去官网中看,与springboot的集成

5.1引入依赖

<!--引入依赖-->
<dependency>
	<groupId>com.auth0</groupId>
	<artifactId>java-jwt</artifactId>
	<version>3.4.8</version>
</dependency>

5.2 生成token

Calendar instance = Calendar.getInstance();
instance.add(Calendar.SECOND,99);
//生成令牌
HashMap<String,Object> map=new HashMap<>();//用于存放自定义的头部数据
Calendar instance=Calendar.getInstance().add(Calendar.SECOND.90);  //过期实际按
String token = JWT.create()
				  .withHeader(map)  //header
				  .withClaim("username","张三")  //payload 设置自定义用户名,即只能放一个
	              		  .withExpiresAT(instance.getTime()) //设置过期时间
				  .sign(Algorithm.HMAC256("token!Q2W#SRW"));//Signature 设置签名,保密,复杂
System.out.pringln(token);

5.3 根据令牌和签名解析数据


//创建验证对象
JWTVerfier jwtVerifier = JWT.require(Algorithm.HMAC256(":Q0w#ESR")).build();
DecodeJWT verify=jwtVerifier.verify("token数据"); //解密token

verify.getClaim("token负载中传的值").asString();  //获取解密得到token中的具体的值

6.封装工具类

//1.生成token
在这里插入图片描述

//2.验证token
在这里插入图片描述

7.springboot整合JWT

  1. 引入依赖
    jwt、数据库有关依赖、
  2. 编写配置

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

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

相关文章

如果大模型有信仰,那一定是“规模法则”

规模&#xff08;scale&#xff09;是除去时间、空间之外另一个重要的维度。规模缩放&#xff08;Scaling&#xff09;的过程中隐藏着世界非线性本质奥秘背后的共性——规模法则。结合伯努瓦曼德布洛特 Benoit Mandelbrot的《大自然的分形几何》、杰弗里韦斯特 Geoffery West 的…

面试官:Java虚拟机是什么,Java虚拟机的内存模型是什么样子的?

哈喽&#xff01;大家好&#xff0c;我是小奇&#xff0c;一个专给面试官添堵的撑序员 小奇打算以轻松幽默的对话方式来分享一些技术&#xff0c;如果你觉得通过小奇的文章学到了东西&#xff0c;那就给小奇一个赞吧 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一…

EmguCV学习笔记 VB.Net 2.S 特别示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

el-image 图片预览时 与 el-table (或avue-crud) 样式冲突 的解决

问题: 解决 <style scoped> ::v-deep(.el-table__cell) {position: static !important; } </style> 后效果

SD-WAN视频汇聚网关,帮助企业省去公网服务器费用与流量费用,低成本、高可靠建设视频汇聚与管控平台,助力视频企业级智能应用

在介绍方案之前&#xff0c;我们先算一笔账&#xff0c;传统的B端项目大多数的场景是&#xff1a; 1、多个分布在不同区域&#xff0c;不同网络的现场需要进行视频设备的统一汇聚管理&#xff1b; 2、多种不同类型厂家和型号的设备需要接入&#xff1b; 3、需要接入各种设备的实…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

Keepalived知识点整理

Keepalived知识点整理 高可用集群 keeaplived高可用集群集群类型系统可用性实现高可用VRRP:Virtual Router Redundancy ProtocolVRRP相关术语 keepalived简介keeplived架构配置文件组成部分配置文件主要部分的解释说明: 环境配置ka1ka2realserver1realserver2 实验1:实验2独立日…

jetson循环输入密码登录不进GUI桌面环境

大概安装了pip, opencv, nvidia-jetpack&#xff0c;添加了环境变量&#xff0c;重启后&#xff0c;Jetson orin nano 登录不进去GUI桌面系统&#xff0c;输入密码后&#xff0c;又出现登录界面要求输入密码&#xff0c;如此循环&#xff0c;没有其他报错。 注意到在启动界面有…

天地伟业入职智鼎测评题库:EQT情商测验、IQCAT思维能力自适应测验

天地伟业智鼎题库EQT情商测验 情商测验采用关键事件法提取和概括人们在社会生活中发生的情景了解作答者在面对典型的工作、生活情景时最可能采取的做法&#xff0c;考察作答者的情绪觉察、情绪调节、自我激励、同理心、社交技能这5种重要的情绪智力&#xff0c;在销售人员和管理…

与人打交道的七个绝招

与人打交道的七个绝招&#xff0c;学会了让你混得风生水起&#xff01; 一、跟强者打交道&#xff0c;别绕圈子。就事论事&#xff0c;直奔主题&#xff1b; 二、跟没钱的人打交道&#xff0c;就直接告诉他能挣多少钱&#xff1b; 三、跟小人打交道&#xff0c;越虚假越好&…

i.MX6裸机开发(2):LED灯——汇编实现

本章主要包括两部分&#xff0c;第一部分讲解i.MX6ULL的GPIO配置方法以及常用寄存器介绍&#xff0c; i.MX6ULL的GPIO配置方法与单片机稍有不同&#xff0c;我们将详细介绍这部分内容。 第二部分讲解具体的实现代码以及程序的编译下载。 学习重点&#xff1a; 掌握i.MX6ULL GP…

YOLOV8网络结构|搞懂Backbone-Conv

参数量计算: (输入通道*w)*(输出通道*w)*k^2+(输出通道*w)*2 w是模型缩放里面的width - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 输出通道c2=64,k=3,s=2 P1/2 特征图变小一半 先定义算子层 再搭一个forward前向传播 class Conv(nn.Module):"""Standard convo…

《Techporters架构搭建》-Day06 国际化

什么是国际化&#xff1f; 国际化&#xff0c;也叫i18n&#xff0c;为什么叫i18n呢&#xff1f; "i18n"是国际化&#xff08;internationalization&#xff09;的缩写&#xff0c;数字18代表了国际化这个单词中间的字母数量。类似这样的缩写还有k8s&#xff08;kube…

Ubuntu离线安装库并解决依赖关系

&#xff08;1&#xff09;起因 安装插件出现库未找到的错误 configure: error: curses library is required but not found.&#xff08;2&#xff09;解决方法 手动到Ubuntu的库发布网页下载 http://packages.ubuntu.com/ 选择系统对应架构的版本下载&#xff0c;然后上传…

AI语言大模型商业价值深度解析

点击蓝字 关注我 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;特别是深度学习算法的进步&#xff0c;AI语言大模型在自然语言处理领域的表现日益突出。国内外多种语言大模型如&#xff1a;OpenAi 的 ChatGpt&#xff0c;阿里通义千问&#xff0c;百度文心…

计算机网络之TCP序号,确认序号和报文传输时间

开篇提示 本篇适合于了解基础知识&#xff0c;进行扩展提高的使用&#xff0c;附带考研习题以及解析。 TCP序号和确认序号的区别 TCP首部中有序号和确认序号&#xff0c;他们都是4个字节&#xff08;4B&#xff09;&#xff0c;且在数据传输中有很重要的意义&#xff0c;那么两…

在Net8.0中使用 MQTTnet 开源库实现 MQTT 应用程序开发(实践)

1. 介绍 MQTTnet 是一个强大的开源 MQTT 客户端库&#xff0c;适用于 C# 平台。它提供了丰富的功能和灵活的 API&#xff0c;可以轻松地构建基于 MQTT 协议的应用程序。本文将逐步学习如何使用 MQTTnet 库创建 MQTT 客户端&#xff0c;并实现基本的发布、订阅功能。 简介 什么…

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案 1.快速创建应用 你可以通过 3 种方式在 Dify 的工作室内创建应用: 基于应用模板创建(新手推荐) 创建一个空白应用 通过 DSL 文件(本地 / 在线)创建应用 从模板创建…

六级英语翻译

大纲解读 1. 考查方式&#xff1a;段落汉译英。 2. 涉及主题&#xff1a;中国的历史、文化、经济、社会发展等。 3. 篇幅&#xff1a;六级为180-200个汉字。 4. *卷面分&#xff1a;106.5 / 710。 5. *考试时长&#xff1a;30分钟。 第一步&#xff1a;Extracting&…

Nvidia AI 发布 Llama-Minitron 3.1 4B:通过修剪和提炼 Llama 3.1 8B 构建的新语言模型

Nvidia 刚刚发布了语言模型的新版本&#xff0c;不过这次是一个小型语言模型&#xff1a;Llama-3.1-Minitron 4B 模型。这意味着它是语言模型不断发展的重要步骤之一&#xff0c;通过剪枝和知识提炼等尖端技术&#xff0c;将大型模型的效率与小型模型相结合。 Llama-3.1-Minitr…