【Web前端】JWT(JSON Web Tokens)概述

1、简介

JWT(JSON Web Tokens)是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。

它基于JSON对象,并通过数字签名确保其完整性和真实性。

JWT因其小巧、自包含以及易于在客户端和服务器之间传输的特性而被广泛使用于身份验证和信息交换的场景中。

2、组成部分

JWT由三个部分组成,这三部分通过点(.)分隔:

Header(头部):头部通常包含了两部分信息:

例如:

  • typ:表示令牌的类型,对于JWT,这个值通常是JWT
  • alg:表示签名所使用的算法,如HMAC SHA256或RSA。
{  "alg": "HS256",  "typ": "JWT"  
}

Payload(负载):负载包含了声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。声明分为三种类型:

  • 注册声明(Registered claims):这是一组预定义的声明,它们不是强制的,但是推荐使用,如iss(发行人)、exp(过期时间)、sub(主题)等。
  • 公共声明(Public claims):这些可以由使用JWT的双方自由定义。
  • 私有声明(Private claims):这些也是自定义的声明,但通常只在创建令牌的双方之间共享。

例如:

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

Signature(签名):签名部分是对前两部分的签名,以防止数据被篡改。
签名需要使用编码后的Header和Payload,一个密钥,以及算法(在Header中指定)来生成。

例如,如果使用的算法是HS256,签名将通过以下方式生成:

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

3、使用场景及优缺点

3.1使用场景

  • 身份验证:一旦用户登录,服务器就可以生成一个JWT并将其返回给用户。之后,用户就可以在后续请求中附带这个JWT来验证身份。
  • 信息交换:JWT可以被用于在双方之间安全地传输信息。由于JWT是自包含的,它可以包含所有必要的信息,并且可以通过签名来验证其完整性和真实性。

3.2优点

  • 紧凑:由于使用了Base64编码,JWT非常紧凑,易于通过URL、POST参数或HTTP头部传输。
  • 自包含:JWT包含了验证和所需的所有信息,因此服务器不需要存储关于会话的额外信息或频繁地查询数据库。
  • 跨域:JWT可以跨多个域安全地传输。

3.3缺点

  • 安全性:JWT默认是不加密的,除非使用JWE(JSON Web Encryption)进行加密。因此,敏感信息不应该放在JWT的Payload中。
  • 注销和令牌撤销:由于JWT是无状态的,很难在令牌过期之前撤销它。常见的解决方案是使用JWT与服务器端的黑名单或白名单配合。
  • 令牌大小:虽然JWT通常很紧凑,但如果包含大量的声明,它可能会变得相当大,这可能会影响性能。

4、工作流程

1. 生成JWT

当用户通过身份验证(如登录)后,服务器会执行以下步骤来生成JWT:

        1、创建Header(头部):Header部分是一个JSON对象,包含了令牌的元数据信息,如使用的签名算法(alg)和令牌的类型(typ,通常为JWT)。例如:

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

        2、创建Payload(负载):Payload部分也是一个JSON对象,包含了实际需要传递的声明(claims)。这些声明可以是预定义的(如iss发行人、exp过期时间等),也可以是自定义的。Payload也经过Base64URL编码,形成JWT的第二部分。

        3、生成Signature(签名):为了确保JWT的完整性和真实性,服务器会使用一个密钥(secret)和一个签名算法(在Header中指定)来对Header和Payload进行签名。签名的生成过程通常涉及将编码后的Header和Payload拼接起来,然后使用密钥和算法进行签名。签名部分也进行Base64URL编码,形成JWT的第三部分。

        4、组合JWT:将编码后的Header、Payload和Signature用点(.)分隔组合成一个完整的JWT字符串。

2. 传输JWT

生成JWT后,服务器会将其发送给客户端(如Web浏览器、移动应用等)。客户端随后可以在后续请求中附带这个JWT,以便进行身份验证或信息交换。JWT通常通过HTTP请求的头部(如Authorization头)发送,格式为“Bearer <token>”。

3. 验证JWT

当客户端发送带有JWT的请求时,服务器会执行以下步骤来验证JWT:

  1. 解析JWT:服务器将JWT字符串按点(.)分隔成三个部分,并分别对它们进行Base64URL解码,以恢复出原始的Header、Payload和Signature。

  2. 验证签名:服务器使用相同的密钥和签名算法对解码后的Header和Payload进行签名,并将生成的签名与JWT中的签名进行比较。如果两者相同,则表明JWT在传输过程中未被篡改。

  3. 验证Payload中的声明:服务器会检查Payload中的声明,如过期时间(exp)、发行人(iss)等,以确保JWT的有效性和适用性。

  4. 处理请求:如果JWT验证成功,服务器将处理客户端的请求,并返回相应的响应。如果JWT无效(如已过期、签名不匹配等),服务器将拒绝处理请求,并可能返回错误消息。

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

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

相关文章

python字符串验证从基础到进阶的总结

引言 在数据处理和文本挖掘中&#xff0c;对字符串的验证是确保数据符合特定要求的关键步骤之一。其中一个常见的验证需求是确认字符串是否只包含字母。Python为此提供了多种实现的方法&#xff0c;我们将逐一讨论它们。 方法1&#xff1a;使用 isalpha() 方法 def is_all_l…

UML 2.5图的分类

新书速览|《UML 2.5基础、建模与设计实践》新书速览|《UML 2.5基础、建模与设计实践 UML 2.5在UML 2.4.1的基础上进行了结构性的调整&#xff0c;简化和重新组织了 UML规范文档。UML规范被重新编写&#xff0c;使其“更易于阅读”&#xff0c;并且“尽可能减少前向引用”。 U…

php简单实现利用飞书群里机器人推送消息的方法

这是一篇利用的飞书的自定义机器人&#xff0c;将系统中的错误信息推送给技术群的功能代码示例。 飞书文档地址&#xff1a;开发文档 - 飞书开放平台 自定义机器人只能在群聊中使用的机器人&#xff0c;在当前的群聊中通过调用webhook地址来实现消息的推送。 配置群逻辑可以看…

LLM应用构建前的非结构化数据处理(三)文档表格的提取

1.学习内容 本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程&#xff0c;因涉及到非结构化数据的相关处理&#xff0c;遂做学习整理。 本节主要学习pdf中的表格数据处理 2.环境准备 和之前一样&#xff0c;可以参考LLM应用构建前…

金蝶部署常见问题解决

金蝶部署常见问题解决 金蝶版本&#xff1a; Apusic Application Server Enterprise Edition 9.0 SP8 kbc build 202312041121 报错信息&#xff1a; 与金蝶官方人员沟通&#xff0c;发现lib包版本太低&#xff0c;升级后可正常使用。替换lib包后重启服务。 下载lib: 链接: …

西瓜杯CTF(1)

#下班之前写了两个题&#xff0c;后面继续发 Codeinject <?php#Author: h1xaerror_reporting(0); show_source(__FILE__);eval("var_dump((Object)$_POST[1]);"); payload 闭合后面的括号来拼接 POST / HTTP/1.1 Host: 1dc86f1a-cccc-4298-955d-e9179f026d54…

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作

公司内部配置GitLab&#xff0c;通过SSH密钥来实现免密clone、push等操作。以下是配置SSH密钥以实现免密更新的步骤&#xff1a; 1.生成SSH密钥 在本地计算机上打开终端或命令提示符。输入以下命令以生成一个新的SSH密钥&#xff1a;ssh-keygen -t rsa -b 4096 -C "your…

VBA实现Excel数据排序功能

前言 本节会介绍使用VBA如何实现Excel工作表中数据的排序功能。 本节会通过下表数据内容为例进行实操&#xff1a; 1. Sort 单列排序 语法&#xff1a;Sort key1,Order1 说明&#xff1a; Key1&#xff1a;表示需要按照哪列进行排序 Order1&#xff1a;用来指定是升序xlAsce…

D2D用户的功率优化算法研究

D2D通信技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分布式网络中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有自动路由(转发消息)的功能。网络的参与者共享它们所拥有的一部分硬件资源&#xff0c;包括信息处理、存储…

短视频矩阵搭建,用云微客获客更方便

你的同行都爆单了&#xff0c;你还在问什么是矩阵&#xff1f;让我来告诉你。短视频矩阵是短视频获客的一种全新玩法&#xff0c;是以品牌宣传、产品推广为核心的一个高端布局手段&#xff0c;也是非常省钱的一种方式。 1.0时代&#xff0c;一部手机一个账号&#xff1b;2.0时代…

demon drone 200无人机标定流程

demon drone 200无人机标定流程 一、飞控固件更新1.1 固件更新1.2 参数更新 二、imu标定2.1 安装imu标定工具&#xff08;在你自己的电脑上&#xff09;2.2 录制rosbag(在对应飞机上)2.3 运行标定程序&#xff08;在你自己的电脑上&#xff09; 三、双目及imu联合标定3.1 安装标…

mysql索引笔记

这里想整理一下性能优化中用到的东西&#xff0c;先整理一下优化mysql索引中所查阅到的资料吧。 目录 MySQL索引类型详解存储方式区分1.B树索引2.哈希索引 逻辑区分1.普通索引2. 唯一索引3. 主键索引4. 空间索引5. 全文索引 实际使用区分1. 单列索引2. 多列索引 多表联查如何建…

GD 32中断系统实现

1.0 中断的概念 中断&#xff1a;简单来说就是打断的意思&#xff0c;在计算机系统中CPU在执行一个操作的时候&#xff0c;有一个比当前任务更为紧急的任务需要执行,cpu暂停当前任务转而去执行更为紧急任务的操作&#xff0c;执行完更为紧急任务之后再返回来执行原来未执行完的…

SRS流媒体源码解析--service

本文主要解析一下SRS3.0 service部分源码&#xff0c;主要和srs_service_st模块。 srs_service_st 模块包含了网络服务的基础实现&#xff0c;特别是与套接字&#xff08;sockets&#xff09;和网络通信相关的功能。主要功能和特点包括&#xff1a; &#xff08;1&#xff0…

高铁站客运枢纽IPTV电视系统-盐城高铁站西广场IP电视系统应用浅析

高铁站客运枢纽IPTV电视系统-盐城高铁站西广场IP电视系统应用浅析 由北京海特伟业科技有限公司任洪卓于2024年7月9日发布 随着科技的飞速发展&#xff0c;特别是“互联网”战略的深入推进&#xff0c;高铁站客运枢纽的信息化建设成为提升服务质量、增强乘客体验的重要手段。盐…

代码随想录算法训练营:29/60

非科班学习算法day29 | LeetCode134:加油站 &#xff0c;Leetcode135:分发糖果 &#xff0c;Leetcode860:柠檬水找零 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmercarl.com)https://programmercarl.com/…

IT专业高考假期入门指南

IT领域预习指南&#xff1a;开启未来科技之旅 一、确定兴趣方向 IT领域广阔&#xff0c;涵盖软件开发、网络安全、数据分析、人工智能等多个方向。首先&#xff0c;明确自己的兴趣所在&#xff0c;这将决定你后续学习的重点。比如&#xff0c;如果你对构建应用程序感兴趣&…

【1.3】动态规划-解码方法

一、题目 一条包含字母A-Z的消息通过以下映射进行了编码&#xff1a; A -> 1 B -> 2 ... Z -> 26 要解码已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&…

新能源汽车充电站远程监控系统S275钡铼技术无线RTU

新能源汽车充电站的远程监控系统在现代城市基础设施中扮演着至关重要的角色&#xff0c;而钡铼技术的S275无线RTU作为一款先进的物联网数据监测采集控制短信报警终端&#xff0c;为充电站的安全运行和高效管理提供了强大的技术支持。 技术特点和功能 钡铼S275采用了基于UCOSI…

Android11 窗口动画

窗口进入动画 应用端窗口绘制完成之后&#xff0c;调用finshDraw告知WMS&#xff0c;WMS这边最后就会调用WindowSurfacePlacer的performSurfacePlacement方法&#xff0c;最终调用到 WindowStateAnimator的commitFinishDrawingLocked方法 //frameworks/base/services/core/jav…