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

目录

  • 前言
  • 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.rhkb.cn/news/400936.html

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

相关文章

《Kotlin核心编程》2021版复习记录

目录 0 前言1 基础语法1.1 数据类型1.2 数组1.3 集合1.4 遍历数据和集合1.5 函数声明返回值类型1.6 var 和 val 2 高阶函数和lambda表达式2.1 高阶函数2.2 方法和成员引用2.3 链式调用2.4 扩展函数2.5 面向表达式编程2.5.1 when表达式2.5.2 for循环2.5.3 in 2.6 字符串相等 3 面…

手撕初阶数据结构之---排序

1.排序概念及运用 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下,就是大的在前面&#xff…

被老韭菜阴阳了?未来一个人最核心的能力:守脑如玉——早读(逆天打工人爬取热门微信文章解读)

tomato 版本TO? 引言Python 代码第一篇 洞见 未来一个人最核心的能力:守脑如玉第二篇 股友见闻结尾 (你看出本质了吗?) 引言 昨晚听别人的分析 好神奇 我会惊叹 为什么大家看到的都是同样的东西 而别人进行思考 思考…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求,特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符,PDF中的条码可以包含各种类型的信息,如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包,提供了丰富的功能和简洁易用的界面,使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸,勾选多人脸模式即可 人脸替换 高清修复自…

SPDK源码剖析一hello_world程序

SPDK初识之hello_world程序分析 首先是hello_world程序整体框架分析 int main(int argc, char **argv) {rc parse_args(argc, argv, &opts);if (spdk_env_init(&opts) < 0) { // spdk环境初始化&#xff0c;最终调用dpdk环境初始化}// 扫描设备&#xff0c;将驱…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求&#xff1a; 可用的 httpd 服务器&#xff08;如 Apache、Zeus、IIS 等&#xff09; PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

Java 实现 B树(通俗易懂)

目录 一.概念 二.节点定义 三.插入操作 1.查找位置 2.插入 3.分裂 四.B树和B*树 1.B树 2.B*树 一.概念 B树是一颗多叉平衡树&#xff0c;空树也是多叉平衡树。 一颗M阶的B树要满足以下条件&#xff1a; 1.根节点至少有两个孩子&#xff1b; 2.每个非根节点至少有(上…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 引言 在平面中&#xff0c;直线的定义可以理解为&#xff0c;任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线&#xff0c;只需要将这个向量改成三维向量即可。 什么是线…

uniapp加载第三方字体方案对比(附原生微信小程序方案)

文章目录 官方文档uniapp文档微信小程序文档 下载字体包引入方案限制微信小程序限制uniapp的限制 方案对比方案1&#xff1a;CSS本地加载方案2&#xff1a;CSS远程加载方案3&#xff1a;转换为base64&#xff0c;然后通过css引入方案4&#xff1a;使用uni.loadFontFace() 页面使…

(Jmeter、Fiddler)脚本转换Loadrunner脚本

背景&#xff1a;公司政治任务、各种体系文档要留档&#xff0c;但有些不在体系内的工具生成的脚本需要转化到体系内以备留档。 一、Loadrunner代理设置 开始录制配置&#xff1a; Record->Remote Application via LoadRunner Proxy LoadRrunner Proxy listens on port-…

米联客-FPGA程序设计Verilog语法入门篇连载-19 Verilog语法_低功耗设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的低功…

Spark MLlib 特征工程(下)

Spark MLlib 特征工程(下) 前面我们提到&#xff0c;典型的特征工程包含如下几个环节&#xff0c;即预处理、特征选择、归一化、离散化、Embedding 和向量计算&#xff0c;如下图所示。 在上一讲&#xff0c;我们着重讲解了其中的前 3 个环节&#xff0c;也就是预处理、特征选…

java---概念

一.配置环境&#xff08;三个变量&#xff09; 1.JAVA_HOME&#xff08;记录Java安装文件的路径&#xff09; 2.PATH&#xff08;系统直找的路径&#xff09; 3.CLASSPATH&#xff08;Java程序路径&#xff09; .;%JAVA_HOME%\lib 二.第一个Java程序 源代码&#xff1a; so…

使用kimi快速完成论文仿写的提示词,我帮你总结好了

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在完成论文写作时&#xff0c;很多人都会想到“仿写”&#xff0c;但正确的做法是借鉴而非复制。今天我们将分享如何利用Kimi智能助手来提高论文写作的效率和质量&#xff0c;同时确保原…