JWT安全

2023-09-13 22:23:17

JWT是什么?

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。

JWT全称JSON Web Token,是一种传输信息的标准,用于JSON对象在各方之间安全地传输信息。支持JSON对象传输,是JWT比较优越的一点。

为什么要使用JWT?

基于oauth2协议认证过程中,以密码类型认证方式为例,包括认证和授权两个步骤。分别如下:

  1. 客户端通过客户端用户名和密码,密码授权方式,以及用户名和密码,向授权服务器认证,如果有效则返回。token(访问令牌)。
  2. 客户端携带token(访问令牌)访问资源服务器,资源服务器验证token,如果有效则返回受保护的资源。

一般在资源服务验证token时,需要通过token向授权服务器调用认证服务,并且,需要通过token向授权服务器获取用户信息。在服务的相互调用过程中,会频繁地调用授权服务器,如果使用JWT有如下几个优势:

  1. 由于JWT具有时效性,如果token失效则直接校验失败
  2. 在资源服务可以基于密钥对token进行校验,而无需调用授权服务器的认证服务,避免频繁调用认证服务器。
  3. 在JWT中携带非敏感的认证信息,同样避免了频繁调用授权服务器获取用户相关信息,方便了在服务之间传递。

并且,JWT还有下面的优点:

  • 流行
  • 安全
  • 稳定
  • 易用
  • 支持 JSON

所有这些因素,令 JWT 名声大振

JWT比token更方便。由于token的验证需要调用认证服务,并且需要通过token向授权服务器获取用户信息,在这个过程中,会频繁调用授权服务器,而使用JWT可以避免这个缺点,使用JWT可以避免频繁调用认证服务器,同时JWT中携带了非敏感的身份认证信息(不必担心泄露后造成风险),同样可以避免频繁调用授权服务器

JWT的数据结构

一个典型的JWT如下图所示,他通常由头部(Header)、载荷(Payload)、签名 (Signature)组成。

在这里插入图片描述

JWT头部:通常由算法类型和令牌类型两部分组成,使用 Base64Url 编码表示

算法类型:指定用于生成签名的算法,例如 HMAC、RSA 或者 ECDSA。

令牌类型:指定令牌的类型,常见的是 JWT。

如下面的数据,是一个JWT头部:

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

载荷(Payload):也使用 Base64Url 编码表示,载荷存储了有关用户或实体的声明等一些有用信息。

声明:如用户 ID、角色、权限等信息。

注册声明:包含一些标准的声明(比如发行人、过期时间等)和一些自定义的 声明。

标准中注册的声明(建议但不强制使用):

  • iss: jwt签发者
  • sub:jwt所面向的用户
  • aud: 接收jwt的一方
  • exp:jwt的过期时间,这个过期时间必须要大于签发时
  • nbf: 定义在什么时间之前,该jwt都是不可用的
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

如下面的数据,是一个JWT载荷:

{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022
}

签名(Signature):签名是对头部和载荷进行签名的结果,用于验证 JWT 的完整性和真实性。

签名生成方式:将头部和载荷进行 Base64Url 编码后拼接在一起,然后使 用指定的加密算法(如 HMAC、RSA)进行签名,将生成的签名添加到 JWT 中

JWT的工作过程

如下图,在用户登录账户名和密码时,如果认证成功,服务器会创建一个JWT cookie,将该cookie返回给用户,然后用户带着这个cookie再去访问服务器,服务器检查JWT是否合法,如果合法则返回一个响应:
在这里插入图片描述

更多推荐

ElasticSearch(ES)简单介绍

ES简介Elasticsearch(通常简称为ES)是一个开源的分布式搜索和分析引擎,旨在处理各种类型的数据,包括结构化、半结构化和非结构化数据。它最初是为全文搜索而设计的,但随着时间的推移,它已经演变成一个功能强大的数据分析工具,用于实时搜索、日志和事件数据分析、业务智能等各种用途。以下是关于Elasticsearc

正则表达式基础

正则表达式是一种用来匹配字符串的技术,它可以通过特定的模式来搜索、替换或提取字符串中的内容。正则表达式的语法有很多不同的标记和修饰符,以下是一些常见的基础语法代码:\d:匹配任意一个数字。\w:匹配任意一个字母或数字。\s:匹配任意一个空白字符。.:匹配除换行符以外的任意一个字符。[abc]:匹配字符集合中的任意一个字

RocketMQ概论

目录前言:1.概述2.下载安装、集群搭建3.消息模型4.如何保证吞吐量4.1.消息存储4.1.1顺序读写4.1.2.异步刷盘4.1.3.零拷贝4.2.网络传输前言:RocketMQ的代码示例在安装目录下有全套详细demo,所以本文不侧重于讲API这种死的东西,而是侧重于讲解RocketMQ的特性。消息中间件无非需要关注

OJ练习第173题——单词接龙 II

单词接龙II力扣链接:126.单词接龙II题目描述按字典wordList完成从单词beginWord到单词endWord转化,一个表示此过程的转换序列是形式上像beginWord->s1->s2->…->sk这样的单词序列,并满足:每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词si(1<=i<=k)必须是字典

算法通关村 | 透彻理解动态规划

1.斐波那契数列1,1,2,3,5,8,13,.....f(n)=f(n-1)+f(n-2)代码实现publicstaticintcount_2=0;publicintfibonacci(intn){if(n<=2){count_2++;returnn;}intf1=1;intf2=2;intsum=0;for(int

Redis主从复制(Redis6.2.5版本)

1、Redis单击服务问题?Redis的单机服务在实际的应用中会有很多的问题,所以在实际的使用中如果使用了redis服务,往往都不是单机服务,都会配置主从复制或者哨兵机制及redis的集群服务等。Redis的单机服务,当主机发生机器故障的时候,我们就需要做数据迁移,同时也会大概率出现数据大量都是的情况,并且短时间内,系

ChatGPT:解释Java中 ‘HttpResponse‘ 使用 ‘try-with-resources‘ 的警告和处理 ‘Throwable‘ 打印警告

ChatGPT:解释Java中‘HttpResponse’使用‘try-with-resources’的警告和处理‘Throwable’打印警告我在IDEA中对一个函数的警告点击了ignore,怎么撤回这个呢ChatGPT:要撤回在IDEA中对一个函数的警告的忽略,您可以按照以下步骤进行操作:打开您的项目,并在编辑器中

SkyWalking快速上手(三)——架构剖析2

文章目录介绍UI组件什么是UI组件?UI组件的配置配置UI组件示例使用SkyWalkingUIStorage组件什么是Storage组件?Storage组件的配置配置Storage组件示例结语介绍接上篇文章:SkyWalking快速上手(二)——架构剖析1SkyWalking是一个开源的分布式系统追踪、监控和诊断工具,

Python爬虫:通过js逆向获取某视频平台上的视频的m3u8链接

Python爬虫:通过js逆向获取某视频平台上的视频的m3u8链接1.前言2.js逆向分析3.参考代码和运行结果1.前言现在我们在网页端看的视频,其前端实现原理就小编目前知道的而言,总的有两点:其一,直接就是一个mp4(或其他类似的)视频链接,如果我们能得到这个视频链接,直接用这个链接就能下载到这个视频;其二,和第一点

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计

基于stm32单片机的app视频遥控抽水灭火水泵小车设计1、项目简介1.1系统构成1.2系统功能2、部分电路设计2.1L298N电机驱动电路设计2.2继电器控制电路设计3、部分代码展示3.1小车控制代码3.1水泵控制代码4演示视频及代码资料获取1、项目简介视频简介中包含资料https://www.bilibili.co

自定义协议、序列化与反序列化

在编写TCP和UDP程序的时候,我们很自然的就使用了读取的函数对数据进行获取,对于UDP来说提供的是无连接的以数据报的形式进行传输,对于TCP来说是面向数据流的,在之前的程序中我们只是进行了读取的操作,但是并没有对读取的内容进行分析。那如果我们要传输一些结构化的数据的话,那么就需要引入"协议"这个概念。网络版计算器在本

热文推荐