详细分析JWT的基本知识(附Demo)

news2025/1/11 5:07:45

目录

  • 前言
  • 1. 基本知识
  • 2. JWT验证过程
  • 3. Demo

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

1. 基本知识

紧凑的、URL-safe 的表示方式,通常用于认证和信息交换

JWT 由三部分组成,用点号分隔:

  • Header(头部):通常包括令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)
  • Payload(负载):包含要传递的声明(Claims),例如用户信息、权限等
  • Signature(签名):使用头部中指定的算法对编码后的头部和负载进行签名,以确保信息的完整性和来源的真实性

为了更好的解析jwt的组成,我们找一个网址,查看本地存储所得到的jwt,去解析:https://jwt.io/

截图如下:(为避免不必要,已将多数数据隐藏)

在这里插入图片描述

一、Header(头部)

  • 类型(typ):通常为 JWT,表示这是一个 JSON Web Token
  • 算法(alg):指定用于签名的算法

例如,HS256 代表 HMAC SHA-256 算法
头部被 Base64 URL 编码后,通常如下所示:

{
  "alg": "HS256",
  "typ": "JWT"
}

二、Payload(负载)

  • 注册声明(Registered Claims):这些是预定义的声明,如 exp(过期时间)、iss(发行者)、sub(主题)等
  • 公共声明(Public Claims):自定义声明,可以与 IANA 注册表中的标准声明名称进行匹配
  • 私有声明(Private Claims):应用程序之间自定义的声明,用于传递特定的信息

jti:唯一的令牌标识符,用于防止重放攻击

三、 Signature(签名)

签名部分用于验证消息的完整性和来源,通过对编码后的头部和负载进行 HMAC SHA-256 签名生成的

公式如下:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

验证JWT是否被修改的过程:

  1. 解码 Header 和 Payload
    将 Base64 URL 编码后的 Header 和 Payload 部分进行解码

  2. 验证 Signature
    使用密钥(your-256-bit-secret)和指定的算法(HS256)对 Header 和 Payload 进行签名,生成一个签名部分
    验证生成的签名与 JWT 的实际签名部分是否一致,以确定令牌是否被篡改

总的来说JWT 的各部分作用:

部分描述作用
Header包含令牌的元数据,如类型和算法指定令牌类型和签名算法
Payload包含声明信息,包括注册声明、公共声明和私有声明传递用户和权限信息等
Signature使用头部中指定的算法和密钥对 Header 和 Payload 进行签名验证令牌的完整性和来源

JWT 与其他认证机制对比

特性/机制JWTSession-Based AuthenticationOAuth2API Key
认证类型无状态(Stateless)有状态(Stateful)无状态(Stateless)无状态(Stateless)
存储位置客户端存储(通常在本地存储或 Cookie 中)服务器端存储会话信息通常使用访问令牌存储在客户端或服务器端客户端存储(通常在请求头中)
扩展性适合分布式系统和微服务架构不适合扩展到分布式系统或微服务支持授权和资源访问控制,适合大型应用适合简单的 API 访问控制
安全性签名保证数据完整性,但需要 HTTPS 保护服务器端存储提供安全性,但会话劫持问题OAuth2 提供了多层安全性(如授权码流、客户端流等)安全性较低,容易被暴露
易用性易于在客户端和服务器端使用,支持多种语言和平台服务器需要管理会话,较复杂需要处理授权过程,较复杂简单直接,但不支持细粒度的权限控制
过期管理内置过期时间,通常在令牌中指定需要服务器端管理会话过期通过刷新令牌机制管理需要手动管理过期和权限
适用场景适合 API 身份验证、微服务架构适合传统的 web 应用适合第三方应用授权、复杂的用户权限控制适合简单的服务或接口调用

2. JWT验证过程

在客户端和服务器之间安全地传递信息的机制,在身份验证过程中,JWT 用于证明用户的身份,并在服务器上进行授权

精简的步骤如下:

一、用户登录
1.1 用户提供凭据(如用户名和密码)到服务器
1.2 服务器验证凭据,生成 JWT 如果凭据有效,服务器生成一个 JWT。该令牌通常包含用户的身份信息(如用户ID、角色等)以及其他声明(如过期时间 exp)
1.3 服务器返回 JWT 给客户端

二、客户端使用 JWT
客户端将 JWT 存储在本地(如 localStorage)
客户端在请求受保护资源时,将 JWT 附加到请求的 Authorization 头中

三、服务器验证 JWT
服务器接收请求,提取并解码 JWT。(服务器从请求的 Authorization 头中提取 JWT,并对其进行 Base64 解码以获取 Header 和 Payload 部分)
验证 JWT 签名和有效性(如过期时间)。(服务器使用预先定义的密钥和算法(如 HMAC SHA-256)对 JWT 的签名进行验证,以确保令牌没有被篡改)
如果有效,授权访问资源;否则,返回 401 错误

四、处理请求
服务器根据 JWT 中的信息处理请求并返回数据
客户端处理服务器响应

基本的交互形式如下:

登录请求

客户端请求:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "username": "john",
  "password": "password123"
}

服务器响应:

{
  "access_token": "eyJhbGciOiAiSFMyNTYiLCAiaWF0IjogMTYzNjIxxxxx.eyJzdWIiOiIxMjM0NTY3ODkwIiwgIm5hbWUiOiJKb2huIERvZSIsICJpYXQiOiAxNjM2MjQ3ODYxLCAiZXhwIjogMTYzNjI1MxxxxxxHRJ7to7Yb2PTthg4civ9kW-FwcE"
}

访问受保护资源

客户端请求:

GET /protected-resource HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiAiSFMyNTYiLCAiaWF0IjogMTYzNjI0Nzg2MSxxxxxx6IDE2MzYyNTExNjF9.eyJzdWIiOiIxMjM0NTY3ODkwIiwgIm5hbWUiOiJKb2huIERvZSIsICJpYXQiOiAxNjM2MjQ3ODYxLCxxxxxxjI1MTE2MX0._XxZ9mOeA9v0qjPvHRJ7to7Yb2PTthg4civ9kW-FwcE

服务器响应:

{
  "data": "This is a protected resource."
}

3. Demo

使用 Node.js 和 jsonwebtoken 库的简单示例,演示如何生成和验证 JWT:

const jwt = require('jsonwebtoken');

// 密钥,用于签名和验证 JWT
const secretKey = 'your-very-secure-secret';

// 生成 JWT
function generateToken(payload) {
    return jwt.sign(payload, secretKey, { expiresIn: '1h' });
}

// 验证 JWT
function verifyToken(token) {
    try {
        const decoded = jwt.verify(token, secretKey);
        return { valid: true, decoded };
    } catch (error) {
        return { valid: false, error: error.message };
    }
}

// 示例使用
const payload = { userId: 123, role: 'admin' };
const token = generateToken(payload);
console.log('Generated JWT:', token);

const verificationResult = verifyToken(token);
console.log('Verification Result:', verificationResult);

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

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

相关文章

机器学习回归分析系列2-二项回归模型

04 二项回归模型 4.1 简介 二项回归模型用于处理二元响应变量,即因变量是0或1的分类变量。最常见的二项回归模型是逻辑回归,它可以用来预测事件发生的概率。 逻辑回归模型假设: 其中,p 是事件发生的概率,x1,x2,…,x…

allegro PCB设计心得笔记(四) -- 显示坐标原点和更改默认产品选项

一、修改坐标原点 Allegro PCB设计过程中,有时需要修改坐标原点,但是PCB文件不显示坐标原点,无法确认已修改的坐标原点是否已经修改好。 显示PCB原点的设置方法如下: Setup -> Design Parameter Editor,如下图所示&…

Kafka系统及其角色

Apache Kafka系统介绍 Apache Kafka 是由 LinkedIn 公司最初开发的一个高性能、分布式的消息传递系统。它被设计为一个可扩展、持久、分布式的流式处理平台,以满足 LinkedIn 在实时数据处理方面的需求 。Kafka 的诞生源于 LinkedIn 需要处理海量数据时现有消息队列系…

深度解析:NPM、PNPM、Yarn 包管理工具的介绍与对比

在前端开发中,包管理工具是不可或缺的一部分,它们帮助我们轻松管理项目依赖、发布和共享代码。NPM、PNPM、Yarn 是目前最流行的包管理工具,但它们各有特点和使用场景。本文将深入解析这三大包管理工具,帮助你选择最适合自己项目的…

嘎嘎嘎拿到去年想要的包

一年多了 继续,把项目收尾吧 好好学前端,外企!react!从0开始,紧迫!加油!

react中使用nextjs框架,前端调后端接口跨域解决方式

前端在项目目录中next.config.js文件中添加以下代码 async rewrites() {return [{source: "/api/:path*",destination: ${process.env.NEXT_PUBLIC_API_DOMAIN}/api/:path*,basePath: false}]} 截图: source: "/api/:path*": 定义了一个 URL …

【源码+文档+调试讲解】基于python和协同过滤算法的电影推荐系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本基于python和协同过滤算法的电影推荐系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内…

【C++】位运算

目录 位运算概述 位运算常见操作 判断字符是否唯一 算法思路 代码实现 丢失的数字 算法思想 代码实现 两整数之和 算法思路 代码实现 只出现一次的数字 算法思路 代码实现 消失的两个数字 算法思想 代码实现 位运算概述 在计算机中我们知道数据在内存中都是以二…

科创微应用平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,场地信息管理,场地类型管理,预约参观管理,场地预约管理,活动信息订单,系统管理 微信端账号功能包括:系统首…

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04,并已配置好ipv6公网地址,已安装好docker和docker-compose。一块单独的硬盘,用于单独存储nextcloud数据。(非必需)有一个能够正常解析的域名,并已配置好AAAA记录解析。…

windows下wsl ubuntu 搭建深度学习环境

wsl安装ubuntu 删除之前安装的ubuntu; 查看都安装了哪些版本: wsl -l -v 删除想要删除的版本: wsl --unregister ${名字} 删除之后 ubuntu.exe的安装包还在c盘中, 找到它, 并将 ubuntu.exe的所在文件夹的所有文件都复制到你想要安装的新的路径下, 比如我在E盘新创建一个文…

ARM高性能计算(HPC)处理器Neoverse介绍

思考: Neoverse系列中的N、V、E有什么区别? 这三个字母的缩写又是什么? ARM Neoverse架构是ARM专为服务器、数据中心、高性能计算(HPC)和网络基础设施设计的一系列处理器架构。Neoverse架构分为N系列、V系列和E系列,这些系列面向不同的应用场景,各自有不同的设计目标和…

Hackademic.RTB1靶场实战【超详细】

靶机下载链接:https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转,页面提示目标是读取到 key.txt 文件 fin…

5.mysql多表查询

MYSQL多表查询 MYSQL多表查询1.多表关系笛卡尔积 2. 多表查询概述2.1 内连接2.2 外连接2.3自连接联合查询union ,union all 2.4子查询2.4.1标量子查询2.4.2列子查询2.4.3行子查询2.4.4表子查询 MYSQL多表查询 create table student(id int auto_increment primary …

CMU15445 (Fall 2023) Project2 - EXTENDIBLE HASH INDEX 思路分享

文章目录 Task 1 - Read/Write Page GuardsPageGuard函数实现移动构造函数移动赋值函数UpgradeRead/UpgradeWriteDrop析构函数BufferPoolManager函数实现FetchPageBasicFetchPageRead/FetchPageWriteNewPageGuarded BUG调试 Task2 - Hash Table PageHeader PageDirectory PageB…

uniapp粘贴板地址识别

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

OSPF进阶

一、LSA详解 Type&#xff1a;LSA的类型&#xff08;1、2、3、4、5、7类&#xff09; link-state-ID&#xff1a;链路状态表示符 ADV router&#xff1a;产生该LSA的路由器 age&#xff1a;老化时间 Metric&#xff1a;开销值&#xff0c;一般都为ADV router到达该路由的开…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络&#xff08;LeNet&#xff09; 问题 LeNet网络 手写的数字识别 MNIST ①输入的是&#xff1a;3232的image ②放到一个55的卷积层里面&#xff08;为什么是5&#xff1f;因为32-x128&#xff0c;∴x5&#xff09;&#xff0c…

【rh】rh项目部署

【fastadmin】 1、项目先clone到本地&#xff0c;其中web为h5前端使用(gitclone后&#xff0c;把web内容放进去再提交)&#xff0c;其余为项目后端使用 2、安装本地环境&#xff0c;项目跑起来&#xff0c;步骤如下&#xff1a; 1&#xff09;查春.git 和 composer,json 版本信…

servlet基础操作(get)

1&#xff0c;首先创建一个javaweb的项目 简历一般的java项目选中项目&#xff0c;双击shift出现搜索栏 找到这个框架&#xff0c;选择里面的javaweb&#xff0c;注意选择右侧版本显示为4.0的javaweb 之后部署Tomcat 我这里是本地&#xff0c;所以在本地选的是local 第一步实…