JWT中的Token
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 认证流程

- 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这一过程一般是一个HTTP POST请求,建议的方式是通过SSL传输(https协议),从而避免敏感信息被嗅探;
- 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Based64编码拼接后签名,形成一个JWT(token),形成的JWT就是一个形同lll.zzz.xxx的字符串(token、head.payload、singurater三部分组成,中间用点.连接);
- 后端将JWT字符串作为登录成功的返回结果返回给前端,前端可以将返回的结果保存在localStorage或sessionStorage上,退出登录时前端删除保存的JWT即可;
- 前端在每次请求时将JST放入HTTP Header中的Authorization位(解决XSS和XSRF问题-防伪跨拦截攻击);
- 后端检查是否存在,如存在验证JWT的有效性,例如:检查签名是否正确,检查Token是否过期,检查Token的接收方是否是自己(可选);
- 验证通过后,后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应的结果;
3.2 JWT优势
- 简洁(compact):可以通过URL,POST参数或在HTTP header发送,因为数据量小,传输速度也很快;
- 自包含(Self-contained):负载中包含了所有用户所需要的信息,避免了多次查询数据库;
- 因为token是以json加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持;
- 不需要在服务端保存会话信息,特别适用于分布式微服务;
4.JWT组成
4.1 令牌组成
令牌就是token,类型为String,x(标头header).y(payload负载).z(签名signature)三段组成
- 标头(Header);
- 有效载荷(payload)
- 签名(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数据"); //解密tokenverify.getClaim("token负载中传的值").asString(); //获取解密得到token中的具体的值
6.封装工具类
//1.生成token

//2.验证token

7.springboot整合JWT
- 引入依赖
jwt、数据库有关依赖、 - 编写配置
相关文章:
JWT中的Token
1.JWT是什么? jwt(json web token的缩写)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以json对象安全地传输信息,此信息可以验证和信任,因…...
苹果在iOS 18.1中向第三方开发者开放iPhone的NFC芯片
苹果公司今天宣布,开发者很快就能首次在自己的应用程序中提供 NFC 交易功能,而目前这主要是Apple Pay独有的功能。从今年晚些时候的 iOS 18.1 开始,开发者将可以使用新的 API 提供独立于 Apple Pay 和 Apple Wallet 的应用内非接触式交易。 这…...
系统开发之禁止卸载应用名单
本文目的主要是记录自己系统(Android7.1系统)开发实现代码,以便后期通用的功能可以直接使用,不需要再去通过搜索然后筛选再验证的繁琐流程,大大减小自己的开发时间。 我实现思路是在系统内新增自己的数据库用来记录禁止…...
wait 和 notify
目录 wait() 方法 notify() 方法 notifyAll() 方法 nofity 和 notifyAll wait 和 notify wait 和 sleep 的区别 wait 和 join 的区别 由于线程之间是抢占式执行的,因此,线程之间执行的先后顺序难以预知,但是,在实际开发中&…...
docker 启动 mongo,redis,nacos.
docker run --name mymongodb -e MONGO_INITDB_ROOT_USERNAMEadmin -e MONGO_INITDB_ROOT_PASSWORDXiaoyusadsad -p 27017:27017 -v /path/to/mongo-data:/data/db -d mongodb/mongodb-community-server:4.4.18-ubuntu2004-v 的目录必须是绝对目录 目录必须 chmod 777 /path/…...
Docker Swarm 搭建
Docker Swarm 搭建 1. 环境介绍 操作系统Centos 7Centos 7Centos 7内核版本Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64Linux 3.10.0-957.el7.x86_64主机名称swarm-managerswarm-worker1swarm-worker2IP192.168.1.100192.168.1.200192.168.1.250Docker Domain20…...
浅述TSINGSEE青犀EasyCVR视频汇聚平台与海康安防平台的区别对比
在我们的很多项目中都遇到过用户的咨询:TSINGSEE青犀EasyCVR视频汇聚平台与海康平台的区别在哪里?确实,在安防视频监控领域,EasyCVR视频汇聚平台与海康威视平台是两个备受关注的选择。它们各自具有独特的功能和优势,适…...
设计模式系列:策略模式的设计与实践
一、背景 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 二、结构 策略模式主要包含三个角色&…...
数据挖掘之数据预处理
数据预处理是数据挖掘中的一个关键步骤,它的主要目的是对原始数据进行清洗、转换和格式化,以确保其质量和一致性,从而为后续的数据挖掘任务(如分类、回归、聚类等)提供可靠的数据基础。数据预处理一般包括以下几个主要…...
RocketMQ核心知识点整理,值得收藏!
1. 基本概念 Topic: 消息类别的集合,如订单消息发送到order_topic。标签(Tag): 同一Topic下区分不同消息的标志,实现精细化消息管理。ConsumeGroup: 消息消费组,可订阅多个Topic,一个Topic可被多个消费组订…...
微信小程序骨架屏
骨架屏是常用的一种优化方案,针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定,这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具,字节开发工具都有对应…...
Window下node安装以及配置
在 Windows 下安装 Node.js 非常简单,你可以通过官方提供的安装程序或者使用多版本管理工具(如 NVM-Win)来进行安装。下面是两种方法的具体步骤: 1. 安装 Node.js程序 步骤如下: 访问官方网站: 访问 Node…...
校园疫情防控系统--论文pf
TOC springboot432校园疫情防控系统--论文pf 课题的来源 2019年在我国武汉爆发了一场规模非常庞大、传播速度十分迅速、对人体危害及其严重的新冠肺炎疫情。引发此次急性感染性新冠肺炎疫情的冠状病毒传播性较强,其传播主要是通过呼吸道飞沫和密切接触这两个途径…...
在Debian 9上使用Apt安装Java的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 Java 和 JVM(Java 虚拟机)是许多软件的必备组件,包括 Tomcat、Jetty、Glassfish、Cassandra 和…...
人工智能在网络安全中的三大支柱
人工智能 (AI) 席卷了网络安全行业,各种供应商都在努力将 AI 融入其解决方案中。但 AI 与安全之间的关系不仅仅在于实现 AI 功能,还在于攻击者和防御者如何利用该技术改变现代威胁形势。它还涉及如何开发、更新和保护这些 AI 模型。如今,网络…...
rk3568mpp终端学习笔记
RK3568Terminal封装MppGraph 通过脚本取和设置音量/zigsun/bin/linux/bin.debug.Linux.rk3568/get_record_voice_value.sh /zigsun/bin/linux/bin.debug.Linux.rk3568/set_record_voice_value.sh class RK3568Terminal : public IAVLinkManager, p…...
【C++继承】赋值兼容转换作用域派生类的默认成员函数
1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类(或子类)。继承呈现了面向对象程序设计的层次结构…...
HTML5+JavaScript绘制彩虹和云朵
HTML5JavaScript绘制彩虹和云朵 彩虹,简称虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱,由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…...
MySQL——单表查询(二)按条件查询(2)带 IN 关键字的查询
IN 关键字用于判断某个字段的值是否在指定集合中,如果字段的值在集合中,则满足条件,该字段所在的记录将被查询出来。其语法格式如下所示: SELECT *|字段名 1,字段名 2,… FROM 表名 WHERE 字段名 [NOT〕IN(元素 1,元素 2,…) 在上…...
【mysql】mysql 用户管理---创建、权限管理等等
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
