聊聊 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

添加、修改和删除列表元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。 …

vs无法打开或包括文件”QTxxx“

vs创建项目时默认引入core、gui、和widgets等模块,在需要网络通讯或者图表等开发时需要添加相应模块。 点击扩展 -> QT VS Tools -> QT Project Setting->Qt Modules,添加相应模块即可

【Jenkins】Centos7安装Jenkins(环境:JDK11,tomcat9,maven3.8)

目录 Jenkins部署环境Maven安装1.上传安装包2.解压3.配置Maven环境变量4.使配置文件立即生效5.校验Maven安装6.Maven配置阿里云仓库7.Maven配置依赖下载位置 Git安装安装监测安装 JDK17安装1.查看旧版本JDK2.卸载旧版本JDK3.查看是否卸载干净4.创建java目录5.下载JDK11安装包6.…

kettle从入门到精通 第六十二课 ETL之kettle job中发送邮件(带多个附件),闭坑指南

1、今天群里一个朋友加我微信遇到问下向我求助。一顿测试下来发现原来是使用kettle姿势不对,对kettle没有完全驾驭导致的,今天和大家一起分享下这个问题。 2、先自我膨胀下,自从写kettle系列文章之后认识了很多朋友,同时文章也帮助…

设计模式6——单例模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 单例模式(Singleto…

1-4月我国5G用户、流量占比均过半,呈现平稳增长态势!

1-4月份,通信行业整体运行平稳。电信业务量收平稳增长;5G、千兆光网等新型基础设施建设持续推进,网络连接用户规模不断扩大,移动互联网接入流量较快增长。 一、总体运行情况 电信业务收入稳步增长,电信业务总量增速保持…

vue3.0(十)双向数据绑定原理和v2.0对比

文章目录 MVVM框架1 理解ViewModel2 MVVM的优点 vue2.0 双向数据绑定原理1 实现双向数据绑定2 实现3 Vue2.0 缺点和解决办法 vue3.0 双向数据绑定原理vue2.0和vue3.0 的差异Vue2.0Vue3.0Object.defineProperty和Proxy的对比 MVVM框架 MVVM(Model-View-ViewModel&am…

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

欢聚笔试题求助帖

事情是这样的,这段时间一直在求职投简历,期望在暑假之前接到一份大数据开发的实习工作。投了很多公司,然后就收到了欢聚的笔试邀约,HR说要我一天之内做出来,恰巧第二天还有组会要汇报,我就先放下了&#xf…

21.1zabbix低级自动发现-监控项详解

详解分析:低级自动发现:自动创建监控项(红色部分字体是怎么创建得监控项?) 点击对应得主机-监控项-Network interfaces应用集,键值有进4个,出4个。因为本机存在4块网卡 注释:本机存…

BGP(一)边界网关协议

BGP协议基础 路由分类 直连路由 非直连路由(间接路由) 静态路由动态路由 IGP:内网网关路由协议(在企业内部或数据中心内部使用) DV:距离矢量路由协议RIP(v1/v2)IGRP——网络直径&…

文本转语音软件-TTSMaker

一、TTSMaker介绍 TTSMaker(马克配音)是一款免费的文本转语音工具,提供语音合成服务,支持多种语言,包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言,以及超过300种语音风格。 可…

Leetcode刷题笔记2:数组基础2

导语 leetcode刷题笔记记录,本篇博客记录数组基础1部分的题目,主要题目包括: 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 知识点 滑动窗口 所谓滑动窗口,就是不断的调节子序列的起始位…

(二)vForm 动态表单设计器之下拉、选择

系列文章目录 (一)vForm 动态表单设计器之使用 目录 系列文章目录 前言 一、后端需提供接口 二、组件配置 总结 前言 动态表单下拉、选择等组件,大概率要使用数据库中的数据,那么vForm如何拿到数据库中的数据呢?跟随…

Xed编辑器开发第二期:使用Rust从0到1写一个文本编辑器

第三篇 这部分接着处理用户退出命令以及一些其他新功能; 3.1 使用CtrlQ退出 modifiers: event::KeyModifiers::CONTROL,使用CONTROL替换之前的NONE值即可; 3.2 重构键盘输入 让我们重构我们的代码,以便我们有一个用于低级按键读取的函数&…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞,我刷题还是太少了,所以很多例子来自ctfshow,以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中,有两中判断相等的符号,和&…

flutter使用dbus插件时,在终端无法使用“dart-dbus”命令

不用flutter的人,可能都不会找到这儿,遇到这个问题,所以这里默认flutter已经装过了,且对flutter如何使用插件也有所了解了。 由于我在项目中用到了dbus插件,用法如图所示,我需要使用这条命令来生成一个sou…

前端javascript包管理,npm升级用pnpm

一 pnpm 介绍 pnpm(Package Manager)是一个快速、节省磁盘空间的 JavaScript 包管理器,它是 Node.js 生态系统中 npm 的一个替代品。pnpm 解决了传统包管理工具在处理依赖时的一些痛点,特别是关于存储空间使用和依赖地狱的问题。…

vite vue-cli 之vue3安装Vue devtools调试工具

一.vite的官方配置-vite-plugin-vue-devtools vite.config.js import { fileURLToPath, URL } from node:urlimport vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx import { defineConfig } from vite import VueDevTools from vite-plugin-vue-devt…

Android JetPack ViewModel

一、什么是ViewModel? Android ViewModel在我们使用MVVM开发模式时会经常用到,对我来说就是好用,好维护。 它相对于MVC模式, 一来可以减少Activity层的代码,可以把一些业务逻辑和对数据的交互到ViewModel层去&#…