聊聊 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)
聊聊 JSON Web Token (JWT) 和 jwcrypto 的使用的更多相关文章
- JSON WEB Token(JWT)
最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...
- JSON Web Token (JWT) 简介
JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...
- JSON Web Token (JWT) 实现与使用方法
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- Json Web Token(JWT)详解
什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...
- JSON Web Token (JWT),服务端信息传输安全解决方案。
JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...
- 漫谈JSON Web Token(JWT)
一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...
- 基于 Token 的身份验证:JSON Web Token(JWT)
1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...
- JSON Web Token (JWT) - Introduction
To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/ ...
- json web token JWT实现TP5创建和验证
根据博客进行jwt初始化配置 https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.55 ...
- JSON Web Token (JWT) - Weak secret
This API with its /hello endpoint (accessible with GET) seems rather welcoming at first glance but i ...
随机推荐
- keycloak~网站对接到Keycloak的步骤
新网站对接到KC的部署 kc的环境 向kc申请自己的客户端 kc的登录接口 通过code换token接口 刷新token接口 kc的用户信息接口 kc的jwt token说明 1. kc的环境 测试环 ...
- 在Mac系统上使用Qt调用摄像头不出图解决方法
需求:在Mac系统上,调用摄像头,实现旋转.缩放.处理视频帧等功能 问题:使用获取视频帧的方法,在Mac上调不起来摄像头 解决方法: 将视频窗口(QVideoWidget)和视频帧(QVideoFra ...
- react native 0.73 配置 react-native-fs
安装react-native-fs npm npm install react-native-fs --save yarn yarn add react-native-fs 安卓配置 android/ ...
- 第十四篇:JavaScript基础
一.CSS内容补充之position 10.position:fixed:固定div在页面的一个位置: top:0; right:0; left:0; position:absolute + rela ...
- sql 语句系列(加减乘除与平均)[八百章之第十四章]
avg的注意事项 一张t2表: select * from t2 select AVG(sal) from t2 得到的结果是: 本来我们得到的结果应该是10的.但是得到的结果确实15. 这是因为忽略 ...
- Kafka的实现细节
Kafka的实现细节 一.Topic和Partition 在Kafka中的每一条消息都有一个topic.一般来说在我们应用中产生不同类型的数据,都可以设置不同的主题.一个主题一般会有多个消息的订阅者, ...
- 力扣451(java)-根据字符出现频率排序(中等)
题目: 给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 .一个字符出现的 频率 是它出现在字符串中的次数. 返回 已排序的字符串 .如果有多个答案,返回其中任何一个. 示例 1: 输入 ...
- 牛客网-SQL专项训练25
①批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是(B) 解析: A选项:不能定义一个check约束后,立即在同一个批处理中使用: C选项:Create def ...
- 飞桨PaddlePaddle的安装
飞桨PaddlePaddle的安装 MacOS 下的 PIP 安装 一.环境准备 1.1 如何查看您的环境 可以使用以下命令查看本机的操作系统和位数信息: uname -m && ca ...
- 技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
简介: 关于 Android 热修复方案--DexPatch 的介绍与使用说明 方案介绍 为了解决 Native 模块上线后的问题,mPaaS 提供了热修复功能,实现不发布客户端 apk 场景下的热修 ...