聊聊 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 ...
随机推荐
- 探索生成式AI的未来:Chat与Agent的较量与融合
近年来,生成式人工智能(AI)不仅在技术界引起了广泛关注,更成为了推动多个行业革新的关键力量.这种技术之所以备受瞩目,不仅在于其独特的创造性和高效性,还在于它对未来商业模式和社会结构可能产生的深远影响 ...
- K8S 性能优化-K8S Node 参数调优
前言 K8S 性能优化系列文章,本文为第四篇:Kubernetes Node 性能优化参数最佳实践. 系列文章: <K8S 性能优化 - OS sysctl 调优> <K8S 性能优 ...
- CentOS 利用pam控制ssh用户的登录及SSH安全配置
CentOS 利用pam控制ssh用户的登录 有关pam的使用,请找相关的文档.下面只说两个简单的例子. 首先在/etc/pam.d/sshd加入一句: account required ...
- 重走py 之路 ——列表(一)
前言 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>>这本书的时候觉得对有基础的有很多的赘余,打算 ...
- c# 前台和后台线程
前台和后台线程 Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程.这两者的区别就是:应用程序必须运行完所有的前台线程才可以退 ...
- 常用注解使用总结系列: @Order 注解
@Order 注解 @Order注解主要用来控制配置类的加载顺序示例代码: package com.runlion.tms.admin.constant; public class AService ...
- ESXI 6.5 零基础从安装到批量生成/管理虚拟机简易教程
制造U盘安装盘 1 先提前下载好,ESXI 6.5 ISO文件. 2 下载制作U盘安装工具,RUFUS. Rufus非常小巧的绿色EXE文件,默认配置选中ISO文件就可以,点击开始,就自动制作,非常方 ...
- 【SIGIR 2022】面向长代码序列的Transformer模型优化方法,提升长代码场景性能
简介: 论文主导通过引入稀疏自注意力的方式来提高Transformer模型处理长序列的效率和性能 阿里云机器学习平台PAI与华东师范大学高明教授团队合作在SIGIR2022上发表了结构感知的稀疏注意力 ...
- PolarDB-X 发布 2.1.0 版本,Paxos 重磅开源
简介:2022年4月1号,PolarDB-X 正式开源X-Paxos,基于原生MySQL存储节点,提供Paxos三副本共识协议,可以做到金融级数据库的高可用和容灾能力,做到RPO=0的生产级别可用性 ...
- Apsara Stack 技术百科 | 标准化的云时代:一云多芯
简介:随着今年云栖大会现场平头哥的自研云芯片倚天710发布,以及众多新兴厂商的芯片发布,将有越来越多的类型芯片进入到主流市场,"多芯"的架构将在数据中心中越来越常见,阿里云混合云 ...