JWT的登录认证与自校验原理分析

news/2024/6/18 21:32:39 标签: 1024程序员节

目录

一、JWT的概述

1.什么是JWT?

2.JWT的用户认证

3.JWT解决了什么问题?

4.关于JWT中的签名如何理解?

5.JWT的优势

二、JWT的结构

1.令牌的组成:

2.JWT的工具类

3.JWT所需的依赖

4.JWT登录生成Token的原理

三、JWT的自校验

1.什么是JWT的自校验?


一、JWT的概述

1.什么是JWT?

JWT是一个含签名并且携带用户相关信息的加密串,用户输入相关信息进行登录的时候,如果信息验证成功,会生成一个JWT(Token令牌),并且将这个token返回给前端保存到本地,当进行其他的请求api的时候,将这个Token带给后端,并且拦截器对请求进行拦截,验证这个Token,如果验证Token无误则放行这个请求,进行相应的业务逻辑处理,显示数据;有误则返回错误信息,跳转登陆界面

2.JWT的用户认证

3.JWT解决了什么问题?

授权因为JWT中包含用户的相关信息(如用户名或者用户ID),所以通过JWT的用户信息,服务可以确定用户的身份,一旦用户的身份验证成功后,系统就会授予它们一组权限来访问资源

信息交换:JWT可以签名,所以可以验证数据在传输过程中是否被篡改或伪造,这有助于去报信息的真实性和完整性

4.关于JWT中的签名如何理解?

想象一封信,在传输过程中,你希望确保这封信没有被别人篡改。为了做到这一点,你可以在信封上盖上你的个人印章(签名),这个印章只有你知道如何制作。当收信人收到信时,他可以检查印章是否有效,以确定信件没有被任何人打开或篡改过。

在网络通信中,签名密码就像这个个人印章。它是一个秘密的密钥,只有发送者和接收者知道。发送者使用签名密码对数据进行签名,生成一个数字签名,这个数字签名就像印章。接收者使用相同的密钥来验证数字签名,以确保数据在传输过程中没有被篡改或伪造。这有助于确保数据的完整性和真实性。

5.JWT的优势

1.简洁:可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快

2.自包含:负载中包含了所有用户所需要的信息,避免了多次查询数据库

3.自校验:对token可以自己校验是否过期

二、JWT的结构

1.令牌的组成:

  • 标头(Header):标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法

  • 有效载荷(Payload):设置用户自定义信息,过期时间,面向的用户 接收方签发时间

  • 签名(Signature):使用 header 中指定的签名算法(HS256)进行签名。签名的作用是保证 JWT 没有被篡改过。

2.JWT的工具类

public class JWTUtils {
    //这个作为JWT的签名密钥
    private static String sign="ddz";

    //封装了创建Token的操作
    public static String createToken(Map<String,String >map){
       //1.设置超时时间、确保操作不会无限期持续下去,提高系统的安全性和效率
        Calendar calendar=Calendar.getInstance();  //创建一个calendar对象
        calendar.add(Calendar.DATE,7);    //设置JWT过期时间7天

       //2.创建JWTbuilder对象,这个对象用来构建JWT的
        JWTCreator.Builder builder= JWT.create();

        //3.通过JWTbuild对象构建Token
        String token=builder
        //        .withHeader(map) //设置标头,可以不设置有默认值
                  .withClaim("name",map.get("name"))
                  .withClaim("pwd",map.get("pwd")) //设置用户自定义信息(负载)

                  .withExpiresAt(calendar.getTime()) //设置令牌过期时间

                  .sign(Algorithm.HMAC256(sign));    //设置用户签名

        return token;    //将token令牌返回
    }

    //获取签名的方法
    public static Algorithm getSignature(){
        return Algorithm.HMAC256(sign);
    }
    
    //token的校验
    public static DecodedJWT require(String token){
        return JWT.require(getSignature()).build().verify(token);
    }
    
    //获取token中的数据
    public static Claim getPayload(String token,String key){
        return require(token).getClaim(key);
    }
}

3.JWT所需的依赖

	<dependency>
			<groupId>com.auth0</groupId>
			<artifactId>java-jwt</artifactId>
			<version>3.4.0</version>
		</dependency>

4.JWT登录生成Token的原理

当用户在登录表单输入信息后,服务端验证用户名密码正确,服务端会签发一个JWT(Token)。

JWT分为三个部分,它们之间通过.连接,第一部分是头,第二部分是负载,它们都是通过Base64编码生成字符串然后通过.连接

签发token就是通过Base64编码将标头与载荷(用户揉入的数据)生成字符串再通过签名算法与密钥生成一个签名,将这三部分通过.连接起来就是JWT令牌了

三、JWT的自校验

1.什么是JWT的自校验?

JWT的自校验其实就是因为,Base64是一种编码方式,而不是加密方式,所以通过Base64编码的数据,也可以通过Base64进行解码,因为头和载荷都是通过Base64编码的所以可以解码出来,所以客户端传入一个token,通过.分割出头和负载,然后解码,在通过这个头、负载以及签名算法和只有服务端知道的密钥生成一个签名,将这个签名与传入的token的签名做一个比对,这样就可以校验这个签名是否被篡改过,因为一旦传过来的token被篡改过,那么根据头、负载、签名算法、密钥生成的签名,就会与传过来的签名不一致,这样就保障了数据的安全性

例如:头是A    负载是B   签名算法和密钥在服务端是一样的    得到的签名是C

            所以Token是   A.B.C

一旦对这个Token进行篡改 如 A.B.D                            这个token传过去的头是A 负载是B  生成的签名是 C   发现根据传过来的头和负载生成的签名C与传过来的签名D不一致,所以则判断Token有问题


http://www.niftyadmin.cn/n/5123146.html

相关文章

python常见的异常处理函数

python常见的异常处理函数 Python 的异常处理主要通过 try&#xff0c;except&#xff0c;finally&#xff0c;和 raise 关键字来实现。 1. try/except 这是 Python 中最常用的异常处理机制。try 块中的代码尝试执行&#xff0c;如果遇到任何异常&#xff0c;程序的控制流就会…

怎么禁止用户点击f12查看数据,查看网页代码

方案一、禁止网页的右键打开&#xff0c;漏洞&#xff1a;按12能打开 document.addEventListener("contextmenu", function(event){event.preventDefault();}); 方案二、禁止用按f12键&#xff0c;漏洞&#xff1a;多次按f12还是能打开 document.onkeydown functio…

Kubernetes 100个常用命令!点赞收藏一键三连

文章目录 集群信息&#xff1a;Pod 诊断&#xff1a;Pod 健康检查&#xff1a;Service 诊断&#xff1a;Deployment 诊断&#xff1a;StatefulSet 诊断&#xff1a;ConfigMap 和 Secret 诊断&#xff1a;命名空间诊断&#xff1a;资源使用情况&#xff1a;网络诊断&#xff1a;…

讯飞输入法13.0发布,推出行业首款生成式AI输入法

&#x1f989; AI新闻 &#x1f680; 讯飞输入法13.0发布&#xff0c;推出行业首款生成式AI输入法 摘要&#xff1a;科大讯飞在2023年全球开发者节上发布了全新讯飞输入法13.0版本&#xff0c;其中最大的亮点是推出了行业首款生成式AI输入法。这次升级将生成式AI能力融入输入…

Windows一些基础设置

开机自启动 方法一&#xff1a; 1、首先按下键盘上的“Wini”打开设置窗口&#xff0c;在左边找到并进入“应用”&#xff1b; 2、接着在右侧点击并进入“启动”设置。 3、在启动应用下&#xff0c;将不需要开机自启动的软件给关掉。 方法二&#xff1a; 1、按CtrlShiftEs…

HackTheBox - Starting Point -- Tier 0 ---Preignition

文章目录 一 题目二 实验过程 一 题目 Tags Network、Programming、RDP、Reconnaissance、Weak Credentials译文&#xff1a;网络、编程、RDP、侦察、凭证薄弱Connect To attack the target machine, you must be on the same network.Connect to the Starting Point VPN us…

联邦存款保险公司与银行失败和失败银行列表数据集

分享目的&#xff1a;了解M国数据&#xff0c;分析美国银行业和保险行业 美国联邦存款保险公司&#xff08;FDIC&#xff09;以及通常与银行失败和失败银行列表相关的一些常见信息。 美国联邦存款保险公司&#xff08;FDIC&#xff09;&#xff1a;美国联邦存款保险公司是美国…

JAVA毕业设计104—基于Java+Springboot+Vue的医院预约挂号小程序(源码+数据库)

基于JavaSpringbootVue的医院预约挂号小程序(源码数据库)104 一、系统介绍 本系统前后端分离带小程序 小程序&#xff08;用户端&#xff09;&#xff0c;后台管理系统&#xff08;管理员&#xff0c;医生&#xff09; 小程序&#xff1a; 预约挂号&#xff0c;就诊充值&…