首页 > 其他分享 >JWT的基本组成结构

JWT的基本组成结构

时间:2023-06-18 09:56:05浏览次数:48  
标签:负载 Base64 JWT header 签名 payload 组成 结构

JWT组成结构

1.令牌组成

  • 1.标头(Header)
  • 2.有效载荷(Payload)
  • 3.签名(Signature)
  • 因此,JWT通常如下所示:xxxxx.yyyyy.zzzzz Header.Payload.Signature

2. Header

  • 标头通常由两部分组成令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。它会使用 Base64 编码组成 JWT 结构的第一部分。

  • 注意:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。

// typ =》 type 类型,省略 e ,减小数据大小
// algorithm =》 算法
{
  "alg": "HS256",
  "typ": "JWT"
}

2. Payload 有效负载

  • 令牌的第二部分是有效负载,其中包含声明。声明是有关实体 ,用户相关信息,类似 principal

  • (通常是用户)和其他数据的声明。同样的,它会使用 Base64 编码组成 JWT 结构的第二部分

注意敏感信息不能放入 payload,比如 密码,因为保存在客户端,还是会有被窃取的风险的

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3. Signature 签名

其实就是  算法 HS256(Base64(header + payload),secret私钥)=》Siganture签名,绝对不能泄露,不然的话,你的 token 就不安全了,会被攻击服务器

如果是公钥的话,算法 HS256(Base64(header + payload),随机盐salt + 公钥)=》Siganture签名, 重点就在 随机盐

  • 前面两部分都是使用 Base64 进行编码的,即前端可以解开知道里面的信息。Signature 需要使用编码后的 headerpayload 以及我们提供的一个密钥,然后使用 header 中指定的签名算法(默认HS256)进行签名。签名的作用是保证 JWT 没有被篡改过

  • 如:

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

JWT校验

如果,服务器通过前端传递的 JWT 的前两部分,headerpayload,通过 算法 HS256(Base64(header + payload),secret私钥) 计算出来的 Signature 签名和 前端传递的 JWTSignature 签名一致的话,就代表验证通过

私钥。只能保存在 安全的硬件设备、云服务提供商的密钥管理服务、本地计算机上的密钥库(做小项目的时候,通常直接生成放到 项目中)

签名目的
  • 最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断(通过算法和密钥计算)出新的头部和负载形成的签名和前端传递过来的JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。
信息安全问题
  • 在这里大家一定会问一个问题:Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗?
  • 是的。所以,在JWT中,不应该在负载里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第 三方通过Base64解码就能很快地知道你的密码了。因此JWT适合用于向Web应用传递一些非敏感信息。JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录。

4. 令牌样式

image-20230425003802801

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

  • 简洁(Compact)

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

  • 自包含(Self-contained)

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

image-20230425003924412

参考文章:https://blog.csdn.net/QGhurt/article/details/108192377

标签:负载,Base64,JWT,header,签名,payload,组成,结构
From: https://www.cnblogs.com/xxjs168/p/17488717.html

相关文章

  • 数据结构课程设计2023夏7-4 先序和中序构造二叉树
    本题目要求用先序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其后序序列。输入格式:在第一行中输入元素个数。第二行中输入先序序列,用空格分隔。第三行中输入中序序列,用空格分隔。输出格式:输出此二叉树的后序序列,用空格分隔,最后也有一个空格。输入样例:......
  • 集合体系结构
    集合体系结构List系列集合:添加的元素有序,可重复,有索引Collection:是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的set系列集合:添加的元素无序,不重复,无索引 方法名说明publicbooleanadd(Ee)把给定的对象添加到当前集合中publicvoidclear......
  • JWT的简单理解
    JWT简介是什么?1.翻译官网地址:https://jwt.io/introduction/翻译:jsonwebtoken(JWT)是一个开放标准(rfc7519),它定义了一种紧凑的、自包含的方式,用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任,因为它是数字签名的。jwt可以使用秘密(使用HMAC算法)或使用RSA或EC......
  • Python-练脑系列-03数据结构
    练脑不断,快乐不止;本次是第三期练脑。1、给定一个列表,其中每个元素都是一个由数字和运算符组成的字符串,例如['2+3','4*5','6/3'],计算列表中所有元素的值,并返回结果的列表。2、给定一个列表和一个整数k,返回列表中所有长度为k的连续子序列中的最大值。3、给定一个字典,其中键和值......
  • 哈工大体系结构lab3 —— 流水线处理器的verilog实现
    流水线处理器的verilog实现个人认为我码风还算可以,如果我的代码有写的错误/值得改进之处,欢迎指出!!base版本设计图如下,WB阶段有一个MUX没画,因为没地方了(懒了)哈哈最后版本跟我最开始写出来的框架有些许变化,如果你看到了让你不知所以然的代码,大概率是修锅的时候造的。。CPU.v`timesc......
  • 数据结构-枚举
    在Java中,枚举(Enumeration)是一种特殊的数据类型,用于定义一组具名的常量。枚举常量是一组预定义的值,它们在枚举类型中被列出,每个常量都有一个名称和一个关联的值。枚举类型在Java中是通过关键字enum来定义的。定义枚举类型后,可以使用枚举常量来表示具体的取值。enumSeason{......
  • 数据结构
    Java提供了许多常见的数据结构,包括但不限于以下几种:数组(Array):用于存储固定大小的元素序列。动态数据(ArrayList)链表(LinkedList):通过节点之间的链接关系来存储元素的线性数据结构。栈(Stack):遵循后进先出(LIFO)原则的数据结构,可以用于存储和检索元素。队列(Queue):遵循先进先出(FIFO)原......
  • 数据结构:栈与队列
    栈:栈是一种后进先出的数据结构,我们可以想象为一个瓶子,往里放东西。又比如,函数的递归调用,就是一种栈的结构。php中用数组实现栈:$arr=array();//入栈functionpush(&$arr,$val){$size=count($arr);$arr[$size]=$val;}//出栈functionpop(&$arr){$si......
  • Java流程控制05:Switch选择结构
    多选择结构还有一个实现方式就是switchcase语句。switchcase语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。switch(exception){casevalue://语句break;//可选casevalue:......
  • C# 程序基础结构
    usingSystem;//命名空间,相当于启动classname//创建一个类,相当于给这个程序起个名字{staticvoidMain()//静态voidMain()Main静态方法是C#程序的入口点。{Console.WriteLine("Hello,World");//程序的输出是由System命名空间......