JWT的介绍与应用

article/2025/8/21 20:56:04

目录

 

2.JWT的应用场景

3.JWT的应用详解

4.为什么要用JWT

2.1 传统Session认证的弊端

2.2 JWT认证的优势

5.JWT结构

1.Header

2.Payload

3.Signature

6.JWT的种类


JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。

2.JWT的应用场景

身份验证:这是使用JWT最常见的情况。一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

信息交换:JSON Web Tokens是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

3.JWT的应用详解

利用token进行用户身份验证的流程:

  1. 客户端使用用户名和密码请求登录
  2. 服务端收到请求,验证用户名和密码
  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端
  4. 客户端收到token后可以把它存储起来,比如放到cookie中
  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据。

这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:

  • 支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
  • 无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
  • 更适用CDN:可以通过内容分发网络请求服务端的所有资料
  • 更适用于移动端:当客户端是非浏览器平台时,cookie是不被支持的,此时采用token认证方式会简单很多
  • 无需考虑CSRF:由于不再依赖cookie,所以采用token认证方式不会发生CSRF,所以也就无需考虑CSRF的防御

而JWT就是上述流程当中token的一种具体实现方式,其全称是JSON Web Token,官网地址:https://jwt.io/

通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。JWT的认证流程如下:

首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探
后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串
后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可
前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题)
后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等
验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果。

4.为什么要用JWT

2.1 传统Session认证的弊端

我们知道HTTP本身是一种无状态的协议,这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,认证通过后HTTP协议不会记录下认证后的状态,那么下一次请求时,用户还要再一次进行认证,因为根据HTTP协议,我们并不知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在用户首次登录成功后,在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这是传统的基于session认证的过程

然而,传统的session认证有如下的问题:

  • 每个用户的登录信息都会保存到服务器的session中,随着用户的增多,服务器开销会明显增大
  • 由于session是存在与服务器的物理内存中,所以在分布式系统中,这种方式将会失效。虽然可以将session统一保存到Redis中,但是这样做无疑增加了系统的复杂性,对于不需要redis的应用也会白白多引入一个缓存中间件
  • 对于非浏览器的客户端、手机移动端等不适用,因为session依赖于cookie,而移动端经常没有cookie
  • 因为session认证本质基于cookie,所以如果cookie被截获,用户很容易收到跨站请求伪造攻击。并且如果浏览器禁用了cookie,这种方式也会失效
  • 前后端分离系统中更加不适用,后端部署复杂,前端发送的请求往往经过多个中间件到达后端,cookie中关于session的信息会转发多次
  • 由于基于Cookie,而cookie无法跨域,所以session的认证也无法跨域,对单点登录不适用

2.2 JWT认证的优势

对比传统的session认证方式,JWT的优势是:

  • 简洁:JWT Token数据量小,传输速度也很快
  • 因为JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
  • 不需要在服务端保存会话信息,也就是说不依赖于cookie和session,所以没有了传统session认证的弊端,特别适用于分布式微服务
  • 单点登录友好:使用Session进行身份认证的话,由于cookie无法跨域,难以实现单点登录。但是,使用token进行认证的话, token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依赖cookie,不会存在这些问题
  • 适合移动端应用:使用Session进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到Cookie(需要 Cookie 保存 SessionId),所以不适合移动端

因为这些优势,目前无论单体应用还是分布式应用,都更加推荐用JWT token的方式进行用户认证

5.JWT结构

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串:
JWTString = Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

1.Header

JWT头是一个描述JWT元数据的JSON对象,alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256);typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存

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

2.Payload

有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据。 JWT指定七个默认字段供选择

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

除以上默认字段外,我们还可以自定义私有字段,一般会把包含用户信息的数据放到payload中,如下例:

{"sub": "1234567890","name": "Helen","admin": true
}

请注意,默认情况下JWT是未加密的,因为只是采用base64算法,拿到JWT字符串后可以转换回原本的JSON数据,任何人都可以解读其内容,因此不要构建隐私信息字段,比如用户的密码一定不能保存到JWT中,以防止信息泄露。JWT只是适合在网络中传输一些非敏感的信息

3.Signature

签名哈希部分是对上面两部分数据签名,需要使用base64编码后的header和payload数据,通过指定的算法生成哈希,以确保数据不会被篡改。首先,需要指定一个密钥(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用header中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名
H M A C S H A 256 ( b a s e 64 U r l E n c o d e ( h e a d e r ) + " . " + b a s e 64 U r l E n c o d e ( p a y l o a d ) , s e c r e t ) HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用.分隔,就构成整个JWT对象

注意JWT每部分的作用,在服务端接收到客户端发送过来的JWT token之后:

header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值。

6.JWT的种类

其实JWT(JSON Web Token)指的是一种规范,这种规范允许我们使用JWT在两个组织之间传递安全可靠的信息,JWT的具体实现可以分为以下几种:

nonsecure JWT:未经过签名,不安全的JWT
JWS:经过签名的JWT
JWE:payload部分经过加密的JWT
1.nonsecure JWT
未经过签名,不安全的JWT。其header部分没有指定签名算法

{
  "alg": "none",
  "typ": "JWT"
}
1
2
3
4
并且也没有Signature部分

2.JWS
JWS ,也就是JWT Signature,其结构就是在之前nonsecure JWT的基础上,在头部声明签名算法,并在最后添加上签名。创建签名,是保证jwt不能被他人随意篡改。我们通常使用的JWT一般都是JWS

为了完成签名,除了用到header信息和payload信息外,还需要算法的密钥,也就是secretKey。加密的算法一般有2类:

对称加密:secretKey指加密密钥,可以生成签名与验签
非对称加密:secretKey指私钥,只用来生成签名,不能用来验签(验签用的是公钥)
JWT的密钥或者密钥对,一般统一称为JSON Web Key,也就是JWK

到目前为止,jwt的签名算法有三种:

HMAC【哈希消息验证码(对称)】:HS256/HS384/HS512
RSASSA【RSA签名算法(非对称)】(RS256/RS384/RS512)
ECDSA【椭圆曲线数据签名算法(非对称)】(ES256/ES384/ES512)


http://chatgpt.dhexx.cn/article/adot6YMI.shtml

相关文章

判断MySQL安装是否成功的两种验证方法

如何判断MySQL是否安装成功? 一、命令提示符cmd窗口验证二、MySQL控制台验证 一、命令提示符cmd窗口验证 键盘winR打开命令提示符,输入cmd。 在电脑中找到安装好的MySQL的bin文件目录 。这是我的安装目录C:\Program Files\MySQL\MySQL Server 5.7\bin。…

Anaconda 安装及验证是否安装成功

关于安装: 1、打开准备好的安装包(官网下载或者镜像网站下载都可以),点next 2、继续点I Agree 3、点All Users 4、安装位置,默认安装在C盘,点击更改,自定义路径,要确保这个路径下是…

如何将Excel数据转化成树状结构

数据如下图 请问怎么才能将以上数据转换成树状结构 因为数据较多,除去手动分组的方法请问还有什么方法呢?

Excel表格中建立树形结构

Excel表格中建立树形结构 2010-04-05 17:56:37| 分类: 开发笔记 |字号 订阅 有时在excel表格中需要建立树形结构,如下图所示。 对动物、植物进行分类。 动物、植物类中分别有子类,像动物中有鸟、猫、狗等。 每个子类又有自己的子类&#…

excel数据处理,表格数据处理成树形结构

excel数据模版如下:红色部分为一级菜单,绿色部分为二级菜单,绿色部分对应的是三级菜单 现在将数据转化为树形结构 名称,编码,上级编码,这种格式,首先将数据做转化导入到mysql mysql根据逗号将一…

poi java导入树状结构即父子数据的excel

父子结构的excel(java)导入数据库,页面上展示成树状结构 excel数据结构 java代码 Controller层 我这里传入的参数除了文件,有一个id,id为页面上的目录上的一个节点id,可理解为我导入的目录实在某一个节点下展现&…

Mac如何使用python创建Excel文件,并进行内容写入

python中创建Excel文件,并进行内容写入 引用第三方库 1、进入python环境路径下,使用终端进入该路径; cd XXX #python环境路径如找不到该路径,可以直接复制pycharm中的python环境路径,在finder搜索,会展…

今天用Excel做一颗圣诞树,小伙伴们都惊呆了!

今天是圣诞节,教大家用Excel做一棵圣诞树 具体操作如下: 1、首先把你要用来画圣诞树的列,调整为合适的列宽; 2、然后按住Ctrl,选中树状的单元格区域; 3、再输入RAND()函数,按下CtrlEnter填充…

java poi导出树形结构到excel文件

maven pom.xml下载poi包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifact…

Python 自动化操作 Excel 绘制条形图!

作者 | 黄伟呢 来源 | 数据分析与统计学之美 今天&#xff0c;有位朋友在群里面咨询了一个问题。 大致意思如图所示&#xff1a; 有人提议用vba&#xff0c;但是不得不说&#xff0c;没有学过vba的朋友&#xff0c;会觉得vba用起来很困难。那还不容易&#xff0c;直接上Python&…

python实现,excel随机抽取特定行到新表中(附上源码和桌面软件)

引言 最近&#xff0c;经常抽查excel表中的一些行&#xff0c;到一个新表中&#xff1b;于是想着写一个程序&#xff0c;自动完成。 功能 基础功能 从原表中随机抽取n行&#xff0c;到一个新表中&#xff08;可用于老师抽查学生作业&#xff0c;领导抽查核酸&#xff08;坏…

Python自动化操作Excel绘制条形图!

公众号后台回复“图书“&#xff0c;了解更多号主新书内容 作者&#xff1a;黄伟呢 来源&#xff1a;数据分析与统计学之美 大家好&#xff0c;我是黄伟&#xff0c;统计学硕士&#xff0c;CSDN博客专家&#x1f680; 今天&#xff0c;有位朋友在群里面咨询了一个问题。 大致意…

树形数据展示 - 嵌套子表格

一、目标样式 父表格嵌套子表格&#xff0c;子表格默认折叠&#xff0c;点击父表格左侧加号可以展开父表格显示对应的子表格&#xff0c;展示每行数据更详细的信息 目标效果 二、问题样式 &#xff08;一&#xff09;问题说明 父表格展开后&#xff0c;子表格展示成功&#xff…

如何利用Python程序读取Excel创建折线图

如何利用Python程序读取Excel创建折线图 如何利用Python程序读取Excel创建折线图首先第一步&#xff1a;打开命令提示符第二步&#xff1a;通过pip命令安装所需要的工具库 其次打开IDLE开始编程 附录常用的工具库安装pip常用命令常用的工具库常用的marker常用的颜色 如何利用Py…

poi实现对树形结构数据导出excel并合并表格

poi实现对树形结构数据导出excel并合并表格 1.主要逻辑&#xff01;2.完整代码 最近好像得罪了poi&#xff0c;遇到的都是导出word、Excel、pdf的问题。下面我记录一下poi对树形结构的处理&#xff0c;前面先梳理整体思路&#xff0c;文章末尾会贴上完整代码。 首先我们看一下模…

【JAVA】读取excel导入数据库,形成树状结构

最近需要导入一个excel表格&#xff0c;存到数据库并以树状结构读取出来 下面两张图片是需要导入的excel Transactional(rollbackFor Exception.class)public String import(MultipartFile file, Integer projectId) throws Exception {//poi解析excelInputStream inputStrea…

html 树 excel,用Excel实现简易树状关系

引子 - Excel训练营 - 写在前面 树状图对大家来说并不陌生。 树状图&#xff0c;亦称树枝状图&#xff0c;其文绉绉的定义如下&#xff1a; 树形图是数据树的图形表示形式&#xff0c;以父子层次结构来组织对象。是枚举法的一种表达方式。 而excel能够在一定程度上实现比较简单…

JAVA对树状结构数据导出Excel自动合并同级内容代码

针对树形结构数据进行Excel导出并进行合并处理 针对树形结构数据的Excel导出的1 需求1 对象结构2 对数据进行树形结构数据组合并且进行计算工具类3 对数据库的数据进行处理(全文最重要的数据处理方法思路逻辑)4 递归查询 父节点信息5 对数据写入Excel,6 自动合并代码参考我的上…

1、简单的Excel地址导入与树状结构生成

2019独角兽企业重金招聘Python工程师标准>>> 一、地区表结构 DROP TABLE IF EXISTS pro_area; /*!40101 SET saved_cs_client character_set_client */; /*!40101 SET character_set_client utf8 */; CREATE TABLE pro_area (area_id bigint(30) NOT NULL AUT…