JWT从入门到上天系列第二章:JWT的结构

2024-03-01 04:04

本文主要是介绍JWT从入门到上天系列第二章:JWT的结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

😉😉 欢迎加入我们的学习交流群呀!

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、Security、Docker、Grpc、消息中间件、Rpc、SpringCloud等等很多应用和源码级别高质量视频和笔记资料,你想学的我们这里都有!

🥭🥭3:QQ群:583783824   📚📚  工作VX:BigTreeJava 拉你进VX群,免费领取!

💞💞4:以上内容,进群免费领取呦~ 💞💞💞💞

     上篇,我们介绍了什么是JWT,他就是基于客户端保存,客户端请求的时候携带这个令牌,我们后端记性验证即可。这个避免了我们的Session占用、他还是间接的因为数据量很小,他还是自包含的,因为用查询数据库。

一:JWT结构

1:令牌组成

        tocken他本质上就是一个字符串,他的本质上就是由x.y.z组成的token。

        标头.有效荷载.签名  xxxxx.yyyyy.zzzzz 中间使用点去分隔。

        分割的三块是{}.{}.{}这三个JSON对象基于Base加密之后的字符拼接内容

        也就是{}.{}.{}---经过Base64编码---xxxxx.yyyyy.zzzzz

2:标头信息

         typ:表示令牌使用JWT这种形式

        alg:表示的加密算法,常用加密算法:SHA256、RSA

        {}:这个JSON会给予Base64编码成为上边的xxxx

{"typ":"JWT","alg":"HS256"
}

3:有效荷载

        令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。

        同样的,它会使用 Base64 编码组成,服务端可以给予Base64解码,所以不是Base64不算是加密。

        有效荷载里边建议不要放特别敏感的信息,例如仅仅放一个用户名就行了,千万不要放密码。

{"sub":"1111111","name":"123456"
}

4:签名

        前面两部分都是使用 Base64 进行编码的,即前端可以通过Base64解码解开知道里面的信息。

        Signature 需要使用编码后的 header 和 payload以及我们提供的一个密钥(盐值,这个月也叫签名),然后使用 header 中指定的签名算法(HS256)进行签名。

        签名的作用是保证 JWT 没有被篡改过

        这个Tocken传到后台的时候,会先有一个验签的过程,也就是上边内容再算一遍(签名从服务器中去取)。 看最终的结果是不是和第三区域的内容一致,一致则是正确的签名。如果Token改了,验签一定过不了。

二:签名目的

1:签名目的

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

2:信息安全问题

        在这里大家一定会问一个问题:Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗?

        是的。所以,在JT中,不应该在负载里面加入任何敏感的数据。

        在上面的例子中,我们传输的是用户的UserID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。因此JWT适合用于向Web应用传递一些非敏感信息。JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录。

容易输出:

是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。

简洁(Compact):

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

自包含(Self-contained):

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

这篇关于JWT从入门到上天系列第二章:JWT的结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761154

相关文章

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题: