JWT令牌技术

写在前面

        我以为,最美的日子,当是晨起侍花,闲来煮茶,阳光下打盹,细雨中漫步,夜灯下读书,在这清浅时光里,一半烟火,一半诗意,任窗外花开花落,云来云往,自是余味无尽,万般惬意。

                                                                                                                          ——不吃葱的阿冬


🍟问题一 什么是令牌技术?它的作用是什么?

🍔问题二 令牌技术与身份验证之间有何关系?

🥪问题三  令牌技术有哪些优点和缺点?

🍞问题四  令牌技术在Web应用程序中的具体应用是什么?


目录

写在前面

目录

介绍

令牌技术的优缺点

作用

JWT组成

 1.引入依赖

2.生成令牌

3.校验令牌


介绍

JWT全称:JSON Web Token

官网链接:JSON Web Tokens - jwt.io

什么是令牌技术?

令牌技术就相当于我们每个人的身份证ID,其本质就是一个字符串,不能伪造但是可以辨别真假。

服务器具有生成令牌和校验令牌的能力。其流程为:

① 用户登录,用户请求登录,经过负载均衡把请求转给了第一台服务器,对第一台服务器的账号密码进行校验,验证成功后,生成一个令牌并返回给客户端。

②客户端收到令牌后,把令牌存储起来,可以存在Cookie中或者其他存储空间

③查询操作 用户登录成功后,携带令牌继续执行查询操作,然后将请求转发到第二台机器,第二台机器先进行权限校验操作,服务器验证令牌是否有效,如果有效,就说明用户已经执行了登录操作,如果无效,就说明用户之前未执行登录操作。

令牌技术的优缺点

优点:1)解决了集群环境下的认证问题。 2)减轻服务器的存储鸭梨(无需在服务器端进行存储)

缺点:1)需要自己手动实现(包括令牌的生成,传递,校验)

作用

对token信息的防伪作用,其本质是一个token,是一种紧凑的URL安全方法

JWT组成

JWT由三部分组成,每部分通过“.”来分隔。

①Header(头部):头部包含令牌的类型(即JWT)以及使用的哈希算法(常用(SHA256)

②Payload(负载):负载这部分是存放有效信息的部分,里面是一些自定义的部分,也可以存在JWT提供的现场字段,如:exp(过期时间戳).

!!!这部分不要存放敏感信息,因为这部分可以解码还原原始内容。

③Signature(签名):此部分用于防止JWT内容被篡改,确保安全性(这部分修改任何一个字符都会校验失败)。

 1.引入依赖

<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

2.生成令牌

使用Jar包中提供的API来完成JWT令牌的生成

package com.items.blog;import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtUtilTest {//过期时间: 1000分钟private static final long expiration = 1000 * 60 * 1000;private static final String secretString = "qXfusNTfqww9YFvMYtFa6eNu1lRd9+LMhkyvnfxJ224=";private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));//随机生成一个key,然后将生成的seccretString返回生成一个token@Testpublic void genKey(){SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);String key = Encoders.BASE64.encode(secretKey.getEncoded());System.out.println(key);}//生成token@Testpublic void genToken(){Map<String, Object> claim  = new HashMap<>();claim.put("id",1);claim.put("name","zhangsan");String token = Jwts.builder().setClaims(claim).setExpiration(new Date(System.currentTimeMillis()+expiration)).signWith(key).compact();System.out.println(token);}}

由于对密钥的生成长度和内容由要求,所以可以使用 getKey() 函数来随机获得一个密钥.

然后运行程序输出的内容就是JWT令牌,放到官网解析,就可以在PAYLOAD部分看到我们存储的信息了。

其中HEADER部分可以看到使用的算法是HS256。

PAYLOAD部分是我们自定义的内容,exp表示过期时间。

VERIFY SIGNATURE部分是经过签名算法计算出来的,所以不会解析。

3.校验令牌

完成了令牌的生成,需要根据令牌来校验令牌的合法性(防止客户端伪造)

运行结果:

 令牌解析过后,可以看见里面存储的信息,解析过程中没有报错就说明已经解析成功了。

令牌解析时,也会对事件进行校验,如果令牌过期了,解析会失败,重新生成密钥就可以了

由于修改令牌中的任何一个字符,都会发生校验失败,所以令牌无法篡改。

令牌技术通常用于完成用户登录的校验,其具体步骤为:

① 登录页面把密码提交给服务器

② 服务器端验证用户名密码是否正确,如果正确,服务器生成令牌,下发给客户端

③ 客户端把令牌存储起来(如Cookie等),后续请求时,把token发给服务器

④ 服务器对令牌进行校验,如果令牌正确进行下一步操作

 

实操在下一个项目中 

未完待续。。。 。。

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

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

相关文章

JVM优化Java代码的秘密:深入解析JVM的内部工作机制

JVM优化Java代码的秘密&#xff1a;深入解析JVM的内部工作机制 当我们谈论Java性能优化时&#xff0c;JVM&#xff08;Java虚拟机&#xff09;的优化策略是无法回避的话题。JVM是Java应用的运行环境&#xff0c;它负责将Java字节码转换为可在特定操作系统和硬件上运行的机器码…

no main manifest attribute,in xxx.jar(关于Spring项目,无法在云服务器上运行jar包的解决方法)

目录 问题详情 解决方法 问题详情 项目可以打包正常&#xff0c;但是云服务器上无法运行&#xff0c;报错&#xff1a;no main manifest attribute&#xff0c;in xxx.jar 解决方法 1.查看pom.xml配置文件&#xff0c;检查以下代码&#xff0c;没有则加上&#xff1a; <…

B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】

导语&#xff1a; 详解B树与跳表的结构及区别&#xff0c;描述B树与跳表新增数据的过程&#xff0c;解释MySQL与Redis选择对应结构的原因。 mysql数据表里直接遍历这一行行数据&#xff0c;性能就是O(n)&#xff0c;比较慢。为了加速查询&#xff0c;使用了B树来做索引&#x…

HTML5 Web Worker之性能优化

描述 由于 JavaScript 是单线程的&#xff0c;当执行比较耗时的任务时&#xff0c;就会阻塞主线程并导致页面无法响应&#xff0c;这就是 Web Workers 发挥作用的地方。它允许在一个单独的线程&#xff08;称为工作线程&#xff09;中执行耗时的任务。这使得 JavaScript 代码可…

第三周组会——动态多目标优化算法

首先对上周写的DF测试函数进行了优化和增加 DF4 pf: DF5测试函数PF DF6 遇到的问题,在算法问题的参数taut(变化频率)默认是10数字变小时就算是9,算法会跟不上收敛 新读的文献 A Novel Dynamic Multiobjective Optimization Algorithm With Hierarchical Response System 一…

linux系统docker的使用命令

docker命令 命令镜像操作镜像查找镜像拉取查看镜像制作过程推送镜像查看镜像修改名字查看镜像的详细信息删除镜像查看镜像所占空间 容器操作运行容器查看容器查看容器详细信息删除容器启动容器停止容器重启容器暂停容器激活容器杀死容器进入容器查看容器的日志复制文件重命名容…

1.2_3 TCP/IP参考模型

文章目录 1.2_3 TCP/IP参考模型&#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型&#xff08;二&#xff09;5层参考模型&#xff08;三&#xff09;5层参考模型的数据封装与解封装 1.2_3 TCP/IP参考模型 &#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型 TCP/I…

【理解指针(1)】

理解指针&#xff08;1&#xff09; 1什么是内存2指针变量和地址21 取地址操作符&#xff08;&&#xff09;22 指针变量23 解引用操作符&#xff08;*&#xff09;24 指针变量的大小 3指针变量的意义31指针的解引用32 指针加减整数33 void* 指针 4. const 修饰指针41 const…

[嵌入式系统-38]:龙芯1B 开发学习套件 -8-启动过程详解

目录 一、启动程序的入口 二、初始化硬件浮点单元fpu 三、全局指针 四、设置系统栈 五、设置内存 六、设置Cache 七、配置协处理器 八、初始化TLB 一、启动程序的入口 FRAME(_start, sp, 0, ra)&#xff1a;这一行是一个汇编宏&#xff0c;用于创建一个函数框架。_star…

递归搜索回溯相关的题目解析和练习2

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;下面的题目用的方法和前面几篇的方法是一样的&#xff0c;写起来是比较困难的&#xff0c;加油 字母大小写全排列 https://leetcode.cn/problems/letter-case-permutation/ 解析 代码 class Solution {vector<string&g…

【Docker】容器的概念

容器技术&#xff1a;容器技术是基于虚拟化技术的&#xff0c;它使应用程序从一个计算机环境快速可靠地转移到另一个计算机环境中&#xff0c;可以说是一个新型地虚拟化技术。 一、docker容器 Docker:是一个开源地容器引擎Docker 是一种轻量级的容器化技术&#xff0c;其主要原…

测试Tomcat是否安装成功

bin目录下有一个文件&#xff1a;startup.batxxx.bat文件是windows操作系统专用的&#xff0c;bat文件是批处理文件&#xff0c;这种文件可以编写大量的Windows的dos命令&#xff0c;然后执行bat文件就相当于批量的执行dos命令start.sh这个文件在Windows当中无法执行&#xff0…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…

20个Python中列表(list)最常用的方法和函数。

本篇文章中,我们分别介绍10个Python中列表(list)最常用的方法和函数。 列表方法示例 1. 创建空列表和使用 append() 方法 # 创建一个空列表 my_list = []# 使用 append() 方法在列表末尾添加元素 my_list.append(5) my_list.append(10) print("After append:",…

离线数仓建设

一.数据仓库分层 ODS(Operation Data Store)层&#xff1a;原始数据层&#xff0c;存放加载原始日志、数据&#xff0c;数据保持原貌不做处理。 DWD(Data warehouse detail)层&#xff1a;对ODS层数据进行清洗&#xff08;去除空值&#xff0c;超过极限范围的数据&#xff09;、…

三维不同坐标系下点位姿态旋转平移变换

文章目录 前言正文计算方法思路Python实现总结前言 本文主要说明以下几种场景3D变换的应用: 3D相机坐标系下长方体物体,有本身坐标系,沿该物体长边方向移动一段距离,并绕长边轴正旋转方向转90度,求解当前物体中心点在相机坐标系下的位置和姿态多关节机器人末端沿工具坐标…

介绍Android UI绘制过程以及注意事项

Android UI绘制是一个复杂的过程&#xff0c;它涉及到多个步骤&#xff0c;从测量&#xff08;measure&#xff09;到布局&#xff08;layout&#xff09;再到绘制&#xff08;draw&#xff09;。以下是这个过程的简要介绍以及一些注意事项&#xff1a; 1. **测量&#xff08;…