聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用

哈喽大家好,我是咸鱼。

最近写的一个 Python 项目用到了 jwcrypto 这个库,这个库是专门用来处理 JWT 的,JWT 全称是 JSON Web Token ,JSON 格式的 Token。

今天就来简单入门一下 JWT。

官方介绍:https://jwt.io/introduction

先聊聊 Token

Token 的意思是令牌,通常用于身份验证。

例如,当客户端首次登录服务器时,服务器会生成一个 Token 并返回给客户端。此后,客户端只需在请求数据时带上这个 Token,无需再次提供用户名和密码。

为什么要有 Token ?

我们知道 HTTP 请求是无状态的,也就是说服务器无法识别每个请求的发起者(例如,我登录淘宝网后刷新页面,会要求我重新输入用户名和密码进行登录)。

为了解决这个问题,出现了一种解决方案:即服务器为每个客户端分配一个 session。当客户端发起请求时带上这个 session,服务器就能识别请求的发起者。

然而,这种方法很快暴露了一些弊端。首先是开销问题。服务器需要保存所有客户端的 session,如果访问的客户端数量增加,服务器将需要保存成千上万个 session,带来巨大的存储开销。

其次是跨域问题。例如,在集群架构中有两台服务器 A 和 B。如果咸鱼第一次请求到了 A 服务器,A 服务器保存了咸鱼的 session,但如果下一次请求被分配到 B 服务器,B 服务器上没有咸鱼的 session,该怎么办?

一种解决方案是使用 session 粘滞(session sticky)方法,使咸鱼的每次请求都打到同一个服务器(如 A 服务器)。但如果 A 服务器宕机了,请求就不得不转到 B 服务器,依然无法解决问题。

于是,有人提出了另一种思路:为什么要让服务器保存 session 呢?可以让每个客户端自己保存!服务器只负责生成 session,不负责保存。

但是,如果不保存 session,如何区分客户端?又如何验证 session 是服务器生成的呢?

这时,人们想到了让服务器生成一个 token。这个 token 是通过服务器独有的密钥和算法(例如 RS256 算法)生成的,并且服务器不会保存这个 token。

这样,客户端发起请求时带上这个 token,服务器收到后会用相同的算法和密钥进行验证。如果 token 匹配,服务器就能验证客户端的身份。

再聊聊 JWT

简单介绍了 token,我们来看看 JWT。

JWT(JSON Web Token)是一种在网络中以 JSON 格式安全地传输信息的令牌。其原理是:服务器认证之后,生成一个 JSON 格式的 token,并将其发回给用户,类似下面这样:

{"alg": "RSA","name": "咸鱼","role": "管理员","exp": "2024-05-20T00:00:00Z"
}

之后客户端与服务器通信的时候都通过这个 JSON Token 来验证身份,同时为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

优点:

  • 紧凑性:JWT 被设计成体积较小,便于 URL、POST 参数或 HTTP 头部传输。
  • 自包含:JWT 负载中包含所有必要的信息,不需要在每次请求时访问数据库。
  • 安全性:JWT 可以签名(使用 HMAC 或 RSA 算法),确保数据的完整性和真实性。通过加密(例如 JWE)还可以保证数据的机密性。

结构组成:

JWT 由 Header、Payload、Signature(签名) 三部分组成,其中 Header 和 Payload 都是 JSON 格式( JWT 中的 J ):

  • Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
  • Payload : 用来存放实际需要传递的数据
  • Signature(签名):服务器通过 Payload、Header 和一个密钥 (Secret) 使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

编码之后的 JWT 形式是一个很长的字符串,中间用点(.)分隔成三个部分,写成一行(里面没有换行),类似下面这样:

Header.Payload.Signature

关于 JWT 三部分的内容就不多讲了,官网有详细介绍。

jwcrypto 使用

我们可以使用 Python 的 jwcrypto 库来生成和验证 JWT、加密和解密数据,以及签名和验证签名等操作。

jwcrypto 提供了一系列功能,包括但不限于:

  • 生成和验证 JWT:可以使用 jwcrypto 生成 JWT,并在接收端验证 JWT 的有效性。
  • 加密和解密数据:支持使用不同的算法对数据进行加密和解密,例如 AES、RSA 等。
  • 签名和验证签名:支持使用不同的算法对数据进行签名,并在接收端验证签名的有效性。
  • 密钥管理:支持生成和管理密钥对、公钥和私钥,以及密钥的导入和导出。

安装 jwcrypto

pip install jwcrypto

生成一个带有签名的 JWT,其中包含了指定的用户 ID:

from jwcrypto import jwt,jwk# 使用 RSA 算法生成一个 2048 位的密钥对。
key = jwk.JWK.generate(kty='RSA', size=2048)
payload = {'user_id': 123}# 创建一个 JWT 对象,并指定其头部(header)为使用 RS256 算法进行签名。
token = jwt.JWT(header={'alg': 'RS256'}, claims=payload)# 使用之前生成的密钥对 JWT 进行签名。
token.make_signed_token(key)

生成 RSA 密钥对并导出公私钥:

from jwcrypto import jwk# 生成 RSA 密钥对
key = jwk.JWK.generate(kty='RSA', size=2048)# 导出公钥和私钥
public_key = key.export_public()
private_key = key.export_private()# 打印公钥和私钥
print("公钥:")
print(public_key)
print("\n私钥:")
print(private_key)

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

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

相关文章

邮件系统中的CC和BCC含义

一、背景 我们在发邮件时,有时会看到或用到CC和BCC相关的功能,下面简要介绍一下。 二、CC CC:Carbon Copy,也就是抄送,是一种电子邮件发送方式。 三、BCC BCC:Blind Carbon Copy,也就是密件…

谓词逻辑(一)

一、句子的谓词符号化 谓词逻辑,也叫一阶逻辑,它对每个最简单的命题尽一步进行分解。 1个体词:可以独立存在的客体。 2谓词:描述一个个体词的属性或多个个体词之间的关系(可用一元函数和多元函数来理解)…

【内存泄漏Bug】animation未释放

问题描述 一个页面做了动画特效,这个页面有可能跳转到其他页面,并长时间不返回,该页面此时已经不活跃了,该页面的对象为无用对象,存在内存泄漏风险 问题分析 这个activity的特性是 1. 有可能跳转到其他页面 2. 有可…

【qt】QListWidget 组件

QListWidget 组件 一.QListWidget的用途二.界面设计三.QListWidget的添加1.界面添加2.代码添加 四.列表项的设置1.文本2.图标3.复选框4.列表大小 五.字体和图标的设置1.字体:2.图标: 六.设置显示模式1.图标2.列表 七.其他功能实现1.删除2.全选3.反选4.ad…

清空了电脑回收站,之前的文件还能否恢复?

电脑已成为我们日常生活中不可或缺的一部分。我们在电脑上处理文档、保存图片、下载视频等,而电脑中的回收站则成为我们处理不再需要文件的一个便捷工具,当我们想要删除某些文档的话,它并不是立即从硬盘上消失,而是被系统移动到了…

【堡垒机小知识】堡垒机资产监控能监控哪些东西呢?

堡垒机,重要的网络安全工具,其资产监控功能在保障系统稳定运行、防范潜在风险方面发挥着至关重要的作用。但不少小伙伴对于监控内容不清楚,这里我们就来一起简单看看,仅供参考~ 堡垒机资产监控能监控哪些东西呢? 【…

js——数据操作——实现阶梯价格排序——基础积累

最近在写网络报价的时候,遇到一个需求,就是要根据采购数量,找到符合数量的阶梯区间,并找到最便宜的采购价格。 比如下面: let originViewList [{id:1,incrementalQuantity:10,priceList:[{minQuantity:1,price:20},…

Linux —— 线程同步

Linux —— 线程同步 死锁线程同步条件变量pthread_cond_waitpthread_cond_signal初始状态为什么之后会“阻塞”如何修改以持续运行 pthread_cond_broadcast 条件变量的接口抢票模拟 我们今天接着来了解线程: 死锁 死锁(Deadlock)是计算机科…

基础编程函数题

1.简单输出整数&#xff1a;本题要求实现一个函数&#xff0c;对给定的正整数N&#xff0c;打印从1到N的全部正整数。 #include <stdio.h> void PrintN ( int N ); int main () { int N; scanf("%d", &N); PrintN( N ); return 0; } void Prin…

会所前台装水离子雾化壁炉前和装后对比

会所前台装水离子雾化壁炉前和装后会有明显的对比&#xff1a; 装水离子雾化壁炉之前&#xff1a; 普通前台氛围&#xff1a; 在壁炉安装之前&#xff0c;前台可能显得普通&#xff0c;缺乏独特的装饰元素或焦点。 空间感平淡&#xff1a;前台的氛围可能相对平淡&#xff0c…

了解监控易(42):国产化信创运维,自主可控

在信息化快速发展的今天&#xff0c;数据安全和系统自主可控性成为了企业关注的重点。监控易作为一款具有完全自主可控优势的监控运维解决方案&#xff0c;凭借其独特的技术架构和灵活的适配能力&#xff0c;成功满足了信创及国产化替代的需求&#xff0c;展现出了显著的竞争优…

【Python设计模式05】装饰模式

装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向一个现有对象添加新的功能&#xff0c;同时又不改变其结构。装饰模式通过创建一个装饰类来包裹原始类&#xff0c;从而在不修改原始类代码的情况下扩展对象的功能。 装饰模式的结构…

Python踩坑系列之使用redis报错:module ‘redis‘ has no attribute ‘Redis‘问题

一步一步往后看哦&#xff01;&#xff01;&#xff01; 纳尼&#xff0c;大伙看看这是什么情况&#xff0c;都是这么写的呢&#xff0c;为啥我这就报错了0.0 出现问题不可怕&#xff0c;解决它就完事了。 方法一、安装redis重新运行程序 pip install redis 无果&#xff0…

金丝雀发布(灰度发布)介绍 及 声明式管理方法简介

目录 一 应用发布策略 1&#xff0c;滚动发布&#xff08;k8s默认&#xff09; 2&#xff0c;蓝绿发布 3&#xff0c;金丝雀发布 二 金丝雀发布&#xff08;Canary Release&#xff09; &#xff08;灰度发布&#xff09; 1&#xff0c;金丝雀发布图解 2&#xff0…

Oracle事务开始时的SCN

Oracle为每一个事物都分配一个唯一的SCN值&#xff0c;事务开始时的SCN可以从V$TRANSACTION.START_SCNB START_SCNW中查询&#xff0c;如下所示&#xff1a; SQL> update t2 set obj#1 where rownum1; 1 row updated. SQL> select XIDUSN,START_SCNB,START_SCNW from v…

数据库操作(函数)

函数是一段可以直接被另外一段程序调用的程序或代码 一。字符串函数 1.concat(s1,s1....sn)&#xff1a;字符串拼接&#xff0c;将s1&#xff0c;s2&#xff0c;sn拼接为一个字符串 例如&#xff1a; select concat("hello","world"); 2.lower(str&…

登录验证登录次数失败过多进行设置延时

现象结果示例截图 swagger示例效果 控制台示例效果 后端代码示例 package com.java.javamethod.service.impl;import com.java.javamethod.dao.UserMapper; import com.java.javamethod.domain.Result; import com.java.javamethod.domain.User; import lombok.extern.slf4j.…

《绝地潜兵2》开发商目标成为下一个暴雪或FS社

《绝地潜兵2》的开发商Arrowhead正以惊人的表现在游戏界崭露头角。这款游戏在发售后迅速获得了巨大成功&#xff0c;使得Arrowhead的首席创意官Johan Pilestedt怀揣雄心壮志&#xff0c;他们的目标是在保持独立的同时&#xff0c;成为下一个暴雪或From Software。 Johan Pilest…

firewalld

一、Firewalld概述 Firewalld 支持网络区域所定义的网络链接以及接口安全等级的动态防火墙管理工具 支持IPV4、IPV6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置 永久配置 二、Firewalld和iptables的关系 netfilter 位于L…

java中的抽象类到底如何用

抽象类的使用 一、设计模式中的使用1. 模板方法模式2. 抽象工厂模式 二、扩展性和灵活性三、为什么开发时抽象类用的很少&#xff0c;反而用接口的很多 一、设计模式中的使用 1. 模板方法模式 1.定义&#xff1a;当你需要为一组相关类提供一个操作的框架&#xff0c;其中一些…