一文读懂JWT,JWS,JWE

JWT(JSON WEB TOKEN)详解 JWT(JSON WEB TOKEN),本文主要详细讲解了jwt,从其定义、token的理解、结构、使用等等帮助深刻理解jwt。 阅读详情

1.JWT是何物,有哪些常用的场景

JWT(json web token)是设计一种简洁,安全,无状态的token的实现规范rfc7519,通常用于网络请求方和网络接收方之间的网络请求认证。

jwt的常用场景
1.1: restful api接口的无状态认证, 在传统的web应用中,我们通常采用session认证。 session
认证的流程大概是这样的。

session认证流程:

  • 客户端将用户名/密码通过某种加密的方式发送给服务器
  • 服务器接收到客户端请求之后进行验证,验证通过后使用Set-Cookie将用户的唯一sessionid放入到cookie当中,并将生成的sessionid和用户的关联信息存入到内存。
  • 客户端第二次访问后服务器从当前cookie中取出sessionid并从内存中拿到相同的sessionid. 如果不存在,或者没有携带sessionid则说明该用户登陆过期,或者未登陆。

session认证的一些缺点:

  • 由于使用session进行认证的方式必须存储sessionid,当用户量过大时对服务器内存消耗影响巨大. 如果你没有设置session的过期时间(关闭浏览器并不会导致cookie消失)那么对你的服务器来说消耗是致命的。
  • 如果你没有将session存在一个所有服务器都可以获取得到的地方如redis, 那么意味着在本台服务器上面存储的sessionid其他服务器无法获取。用户进行请求时必须请求到这台服务器上面。可扩展性较差。
  • 跨平台性较差,传统的session认证方式在移动端很难行得通。你必须开发二套不同的逻辑对web和移动端进行认证。

jwt认证流程:

  • 客户端将用户名/密码通过某种加密的方式发送给服务器。
  • 服务器接收到客户端请求后进行验证,验证通过服务器生成token返回给客户端。客户端将token存储在本地。
  • 客户端每次请求将token携带在http header头中, 服务器端将token取出进行解密。

jwt认证的优点:

  • 服务器端无需保存token,以加解密的方式代替存储,节省了内存空间。
  • 无状态的token不依赖于服务器保存会话信息,更利于水平扩展。
  • 相比于传统的session认证方式,jwt对移动端的支持更友好。

可以看出jwt认证解决了传统的session认证的一些不足之处。

1.2: 一次性认证:
如需要对某一个应用进行授权使用,此时就可以将jwt进行携带访问。

2.jwt的组成和生成方式

2.1jwt主要由三个部分组成,分别是头部(header),载荷(payload),签名(signature)组成。

header:

  • 头部是用来声明此jwt的类型和加密算法,它们通常由alg和typ这二个字段组成。rfc文档示范的header头
  • alg字段通常用于表示加密采用的算法。
  • typ字段通常用于表示类型。
 {"typ":"JWT", "alg":"HS256"} //示范的jwt header头

payload:

  • 载荷就是我们存放公共参数/私有参数的地方.通俗点说该字段就是存放系统中用户的信息和jwt本身的一些信息,rfc文档本身替我们提供了一组字段的声明 (Claims)
  • iss: 该字段表示jwt的签发者。可以用你的应用唯一标识或者高权限的userid填充此字段。
  • sub: 该jwt面向的用户。
  • aud: jwt的接收方。
  • exp: jwt的过期时间,通常来说是一个时间戳。
  • iat: jwt的签发时间,常来说是一个时间戳。
  • jti:此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表, 当客户端携带jwt访问的时候需要在jti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉, 毕竟jwt所宣称的优点就是无状态访问。-.-
//一个正儿八经的payload示范
{
    "iss": "appid_xxxxxx"
    "sub": "012345122",
    "exp": "1572246721840",
    "iat": "1592246721840"
}

signature签名流程:

  • 首先将header和payload进行base64编码,然后使用"."将header和payload拼接起来。 类似于像下面这样:
String base64data = Base64.encode(header)+"."+Base64.encode(payload)
  • 在将payload和header进行base64之后进行签名,得到签名后的数据。 签名所使用的算法来自于header头中的alg字段。 签名过程类似于像下面这样:
    final JWSSigner signer = new ECDSASigner(this.privateKey);
           
             this.signature = signer.sign(base64data);
            //第一步, 实例化一个签名对象
            //第二步,对base64data 进行签名
           
  • 签名之后将签名的值和base64之后的header和payload用"."号连接起来。此时一个完整的jwt就出来啦。
jwt的最终结构: header.payload.signature

3.使用jwe来使你的jwt更加安全

签名到底在干什么:
在上面我们所谈到的jwt仅仅是签名后的jwt。在这里我们需要明白一个概念,那就是签名并不能保证数据的安全,也就是说如果有人获取到了你的jwt那么他可以通过转码得到你jwt当中所有的信息。那么读者可能会有点想骂人了,你特么上面说了那么多连一个数据安全都不能保证那么我看那么多有啥作用- -. 别急,我们先来了解一下签名的概念。其实对于签名更专业点的来说就是进行了一次哈希散列,对于散列我们首先要保证一下四点概念.

  • 相同的输入将始终产生相同的输出。
  • 多个不同的输入不应产生相同的输出。
  • 从输出到输入应该是不可能的。
  • 给定输入的任何修改都将导致哈希值发生巨大变化。

从上面4点大家看明白了吗? 哈希与身份验证结合使用,可以产生强有力的证据来证明给定的消息尚未被修改。也就是说这个jwt从我这里签发以后无法改变,从而保证了数据来源的可靠性。 当客户端携带jwt进行请求时服务器在执行一遍签名步骤。 如果签名的值一样就表示这个jwt是可靠的。此时我们在客户端和服务器之间就建立一种可信任的token机制。

应该怎样保证数据安全:
对于如何保证jwt本身的数据安全很多文章或文档都可以提及,我们可以把上面所生成的jwt成为jws(JSON Web Signed). 他本身的数据并没有进行加密。 此时如果我们想保证数据的安全就需要使用jwe(JSON Web Encryption)对jwt进行加密。jwe加密的秘文如下所示

// jwe相对于jws来说多了二个组成部分。
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
     OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
     ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
     Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
     mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
     1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
     6UklfCpIMfIjf7iGdXKHzg.
     48V1_ALb6US04U3b.
     5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
     SdiwkIr3ajwQzaBtQD_A.
     XFBoMYUZodetZdvTiFvSkQ

jwe的5个组成部分:

  • JWE header: 描述用于创建jwe加密密钥和jwe密文的加密操作,类似于jws中的header。参数不一一描述,详情请见jwe header参数
  • JWE Encrypted Key:用来加密文本内容所采用的算法。
  • JWE initialization vector: 加密明文时使用的初始化向量值,有些加密方式需要额外的或者随机的数据。这个参数是可选的。
  • JWE Ciphertext:明文加密后产生的密文值。
  • JWE Authentication Tag:数字认证标签。
  //一个完整的jwe json结构
  {
      "protected":"jwe受保护的header头",
      "unprotected":"JWE Shared Unprotected Header数据",
      "header":"",
      "encrypted_key":"密钥加密后数据	",
      "aad":"额外的认证数据",
      "iv":"同上的 JWE initialization vector",
      "ciphertext":"同上的JWE Ciphertext",
      "tag":"同上的JWE Authentication Tag"
     }

jwe创建流程:

  • 根据头部 alg 的声明,将header头进行编码
  • 随机生成密钥
  • 加密密钥
  • 生成iv如果不需要,此步骤可以省略.
  • 加密原始报文
  • 生成认证算法得到Authentication Tag.
  • 如果明文有声明zip压缩,那么压缩明文
Base64.encode(header)+"."+Base64.encode(encrypted_key)+","+Base64.encode(iv)+"."+Base64.encode(ciphertext)+"."Base64.encode(tag)

4. jwt的缺点以及常见的理解误区

缺点:

  • 无法主动的过期token. 常见的场景为后台踢出用户或封禁用户,此时若是token还在生效
    时间范围内,那么意味着该用户在被踢出系统后还可以在这个时间范围内进行访问。又或者用户修改了密码,此时原token依然可以进行加解密也就代表着用户仍然可以继续访问。 更为致命的是大多数客户端会将token存放在Local Storage或者vuex中,这意味着除非用户点击退出登陆。否则就算关闭软件在重新打开也会造成原密码可以登陆的假象。
  • jwt对比于传统的session认证方案并不会提高运行效率,因为本质上jwt做的是一个以时间换空间的动作。 频繁的加解密会带来不小的性能开销。

常见的理解误区:

  • 对jwt进行存储,这个是最常见的理解误区。 事实上很多人都觉得将jwt进行存储可以完美的解决主动过期的问题, 然而这是一种赔了夫人又损兵的做法。 既无法节省空间也无法节省时间。 如果你的应用必须要主动过期的功能,那么我推荐你使用传统的session,事实上传统的session也有不少成熟的解决方案。 如spring-session等。
  • jwt被盗用会导致数据泄漏不安全, 事实上使用jwe加密的jwt是不存在数据不安全的问题的。 第二,jwt的数据一般都是非敏感数据,由于签名机制的存在所以你盗用了jwt做不了任何事情。
  • 不存储如何实现退出功能。 直接在客户端清除token就行了。因为服务器不存储所以只需要在客户端清除token就可以做到用户退出。
  • 将token的时期设计的非常长。这是一个会造成很多隐性问题的设计,比如上述的密码修改等问题。 这个时候可以参见oauth2的做法,将token的过期时间设置为一小时,但是增加一个refreshToken。客户端在没有触发退出或者修改密码等操作时通过refreshToken来刷新token。
JWE:安全传输敏感数据的最佳实践 (上) JWE是"JSON Web Encryption"的缩写,是一种基于JSON的加密规范,用于在网络上传输加密的数据。它定义了一种将JSON数据加密为JWE格式的方法,以确保安全传输。JWE规范使用一种称为"JWE Compact Serialization"的格式来序列化加密后的数据,以便它可以轻松地在不同的系统之间传输。 阅读详情

相关推荐

JWT - 令牌认证(认证流程和原理、Jwt 工具类、搭配 Redis 使用)

1. 首先前端将用户名和密码发送给后端,后端对用户名和密码校验成功后,会将用户 id 和其他信息作为 payload ,然后将其分别进行 Base64 编码,拼接,最后再签名,形成一个 JWT(Token). 形成的 JWT 就形同 xxx.yyy.zzz 这种结构的字符串.http 协议是一种无状态的协议,也就意味着当用户第一次通过用户名和密码登录成功以后,下一次再请求的时候,用户还需要再进行登录才行,因为根据 http 协议,我们不能知道是哪个用户发出的请求.

CYK_byte的博客 2万+

什么是JWT?(细致讲解)

什么是JWT?传统的session、token认证、JWT登录鉴权

Ethereal的博客 8万+

第三篇:AMD 和 Intel

它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合!

u013089100的博客 1032

JWT简介、JWT优缺点、JWT使用方法、.NET6使用JWT示例、JWT与Session对比

JWT简介、JWT优缺点、JWT使用方法、.NET6使用JWT示例、JWT与Session对比

1万+

STM32F103ZE驱动PMW3901光流模块,从SPI配置到数据读取的完整避坑指南

本文详细解析了STM32F103ZE驱动PMW3901光流模块的全过程,从SPI配置、硬件连接到数据读取与处理,提供了完整的避坑指南。重点介绍了SPI参数配置、初始化序列优化、运动数据滤波等关键技巧,帮助开发者快速实现精准的光流检测。

weixin_42631411的博客 516

AXI Timer IP核使用说明

AXI Timer是提供定时技术功能的集成IP核,具有时间生成、事件捕获、产生PWM波以及产生中断的功能,下面具体讲述Timer IP核的使用说明。

weixin_43418104的博客 2489

golang jwt设置过期_一文读懂JWT,JWS,JWE

1.JWT是何物,有哪些常用的场景JWT(json web token)是设计一种简洁,安全,无状态的token的实现规范rfc7519,通常用于网络请求方和网络接收方之间的网络请求认证。jwt的常用场景1.1: restful api接口的无状态认证, 在传统的web应用中,我们通常采用session认证。session认证流程:客户端将用户名/密码通过某种加密的方式发送给服务器服务器接收到客户...

weixin_39886619的博客 2255

【R语言】富集分析可视化代码(整理版)

分别介绍了如何使用DAVID在线分析工具对基因进行GO/KEGG功能富集分析、使用R ggplot包对获得的基因GO/KEGG功能富集结果进行可视化、使用R clusterProfiler包和R AnnotationHub包对基因进行GO/KEGG功能富集分析、OrgDb包制作以及结果可视化等。故,我重新整理了一波,并补充了可对多个分组的富集结果进行可视化以及富集结果绘制圈图等的代码。关注“在打豆豆的小潘学长”公众号,发送“富集分析3”获得完整代码包和演示数据。一、单组富集结果可视化。

weixin_54004950的博客 1万+

jwt重放攻击_一文读懂JWT,JWS,JWE

读者躯壳投稿原文:https://blog.youkuaiyun.com/hellowordapi/article/details/1020996471.JWT是何物,有哪些常用的场景JWT(json web token)是设计一种简洁,安全,无状态的token的实现规范rfc7519,通常用于网络请求方和网络接收方之间的网络请求认证。jwt的常用场景1.1: restful api接口的无状态认证...

weixin_29208077的博客 283

拥有AI助手便能解放双手?——抖音直播脚本的生成

科技改变生活,AI助手帮你完成抖音创作!

Scientist_的博客 2354

告别盲打:为NXOpen Python API生成智能代码提示的完整指南

本文提供了一份为NXOpen Python API生成智能代码提示的完整指南。通过配置匹配的Python环境、利用类型存根文件生成工具创建.pyi文件,并在PyCharm或VSCode中正确配置,开发者可以彻底告别“盲打”,获得精准的代码补全和参数提示,从而大幅提升NX二次开发的效率和体验。

weixin_29057695的博客 371

Folia 五分钟上手:从导入本地音乐到跑通全屏歌词动画

Folia 是一款以全屏沉浸式歌词播放为招牌的本地与在线音乐播放器,支持本地曲库、Navidrome 和网易云、QQ 音乐、酷狗。读完这篇教程,你能拿到三个结果:本地文件夹里的歌在 Folia 里播通、进入全屏歌词模式、掌握一组日常播放快捷键。 ## 一、环境与安装:Folia 桌面版与 Web 版怎么选 装 Folia 有两条路,先看取舍再动手。 | 路线 | 前置条件 | 适用场景 |

gitblog_00892的博客 851

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

JWT简介& JWT结构& JWT示例& 前端添加JWT令牌功能& 后端程序

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。

qq_73126462的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

什么是JWT(Json-Web-Token)?JWT的用途和优势是什么?讲解+实战,一篇文章学会JWT怎么用!

什么是JWT(Json-Web-Token)?JWT的用途和优势是什么?讲解+实战,一篇文章学会JWT怎么用!

分享后端编程技术干货,努力用最直白的文字把技术讲明白! 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JWT使用和讲解(保姆级)

JWT使用和讲解(保姆级)

qq_53930044的博客 6431

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JWT(详解)

JWT

weixin_44736637的博客 3万+

JWT详细讲解

本文讲解了常见的认证机制、介绍了JWT以及JWT的使用、并且举了个案例SpringSecurity+JWT实现后台管理系统权限验证。

m0_71012114的博客 6769

JWT详细解析

Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519)。该token被设计为的,特别。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

m0_65224643的博客 1万+

JWT是什么?它有什么用?

JWT是 JSON Web Token 的缩写,通过数字签名的方式,以JSON对象为载体,在不同的服务器终端之间安全传输的信息。

努力 5266

JWT 详解

JWT是什么? JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

共勉 1万+

JWT详细讲解(保姆级教程)

本篇博文详细讲解JWT概念,组成,运行过程,和SAM相比的优势,并附加SpringBoot整合JWT的案例。

孤夜的博客 1万+

什么是JWT??

JWT

as15282235592的博客 6123

JWT和OAuth2.0

JWT是一种认证协议,提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。SSO私钥加密token。应用端公钥解密token。 OAuth2.0是一种授权框架,提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。

Kard的博客 1万+
上一篇: [OIDC&&Oauth2 ] 理解Oauth2授权框架
zh_coder
博客等级 码龄12年 31粉丝 20原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值