JSON Web 令牌(JWT)是如何保护 API 的??

SpringBoot 使用 JWT 保护 Rest Api 接口 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。Jwt 主要应用场景:授权Authorization (授权) : 这是使用 JWT 的最常见场景。一旦用户登录,后续每个请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的 JWT 的一个特性,因为它的开销很小,并且可以轻松地跨域使用。 阅读详情
作者:summerblue
链接:https://segmentfault.com/a/1190000021783874

你可以已经听说过 JSON Web Token (JWT) 是目前用于保护 API 的最新技术。

与大多数安全主题一样,如果你打算使用它,那很有必要去了解它的工作原理(一定程度上)。问题在于,对 JWT 的大多数解释都是技术性的,这一点让人很头疼。

让我们看下,我能否解释清楚 JWT 是如何在不引起你的注意下保护您的 API !

API 验证

某些 API 资源需要限制访问 。例如,我们不希望一个用户能够更改另一个用户的密码。

这就是为什么我们保护某些资源,使用户在允许访问之前提供他的 ID 和密码——换句话说,我们对它们进行身份验证。

保护HTTP API的困难在于请求是 无状态的 —— API 无法知道是否有两个请求来自同一用户。

那么,为什么不要求用户在每次调用 API 时提供其 ID 和密码呢?仅因为那将是可怕的用户体验。

JSON Web Token

我们需要的是一种允许用户仅提供一次其凭证,随后在后续请求中由服务器以另一种方式标识的方式。

为此设计了几种系统,当前的最新标准是 JSON Web Token。

这是一篇 关于该主题的精彩文章 ,它很好地比喻了 JSON Web Token 的工作方式:

想象一下你要入住酒店,而不是一个 API 。「Token」是塑料酒店安全卡,可用于进入你的房间和使用酒店设施,但不能进入任何其他人的房间。

当你退房的时候,你交回卡片。这类似于注销。

Token 的结构

通常, JSON Web Token 是通过 HTTP 请求头发送的。类似如下:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

实际上, Token 部分是「Authorization: Bearer」之后的部分,仅是 HTTP 头信息。

在你断定这是难以理解的胡言乱语前,有几件事你很容易注意到。

首先,Token是由三个不同的字符串组成,以句点分隔。这三个部分是 Base64 编码 后的内容,并且分别对应 Header , Payload 以及 Signature。

// Header eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

// Payload eyJzdWIiOiIxMjM0NTY3ODkwIn0

// Signature dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

注意:Base64 是一种转换字符串的方法,以确保在跨网络传输期间不会被弄乱。这不是一种加密方式,任何人都可以 轻松解码 以查看原始数据。

我们可以对这些字符串进行解码,以更好地了解JWT的结构。

Header

以下是 Token 中的已解码 Header 部分。Header 是 Token 的元信息。它并没有告诉我们很多帮助你建立基本理解的知识,因此我们不会对此进行任何详细介绍。

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

Payload

Payload 能引起更多的关注。如果你想, Payload 可以包含任何数据,但是如果 Token 的目的是 API 访问身份验证,则可以仅包含用户 ID 。

{
  "userId": "1234567890" 
}

请注意, Payload 不安全 。任何人都可以解码 Token ,并确切了解 Payload 中的内容。因此,我们通常会包含一个 ID ,而不是诸如用户电子邮件之类的敏感识别信息。

即使 Payload 是在 API 上识别用户所需要的全部,它也不能提供身份验证的方法。如果其中包含所有内容,则有人可以轻松找到你的用户 ID 并伪造 Token 。

因此,这使我们进入了 Signature 部分,这是认证 Token 的关键部分。

哈希算法

在解释签名如何工作之前,我们需要定义什么是哈希算法。

首先,它是一个将字符串转换为称为 Hash 的新字符串的函数。例如,假设我们要对字符串「Hello, world」进行哈希处理。这是我们使用 SHA256 哈希算法得到的输出:

4ae7c3b6ac0beff671efa8cf57386151c06e58ca53a78d83f36107316cec125f

哈希的最重要属性是 你无法通过哈希算法来查看 Hash 的原始文本 。

有许多不同类型的哈希算法,但 SHA256 通常与 JWT 一起使用。

换句话说,我们不能根据上面的散列值算出原始字符串是 Hello,world。哈希非常复杂,以至于无法猜测原始字符串。

JWT 签名

回到 JWT 结构,来看一下令牌的第三部分,签名。实际上需要计算:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  "secret string"
);

下面是对这里发生的情况做解释:

首先, HMACSHA256 是哈希函数的名称, 并带有两个参数:要散列的字符串,以及「secret」。

其次,我们哈希的字符串是 base 64 的编码报头,加上 base 64 的编码有效载荷。

第三, secret 是任意一段字符串,只有服务器知道。

问. 为什么在签名散列中包含标头和有效负载?

这确保了签名对于此特定令牌是唯一的。*

问. secret 是什么?

为了回答这个问题,让我们考虑一下如何伪造令牌。

我们之前说过,您无法通过查看输出来确定哈希的输入。但是,由于我们知道签名包括标头和有效负载,因为它们是公共信息,所以如果您知道哈希算法(提示:通常在标头中指定),则可以生成相同的哈希。

但是只有服务器知道的秘密 不是 公共信息。将其包含在哈希中可防止某人生成自己的哈希来伪造令牌。而且由于散列会掩盖用于创建散列的信息,因此任何人都无法从散列中找出秘密。

将私有数据添加到哈希中的过程称为 salting ,几乎不可能破解令牌。

认证过程

因此,现在您对令牌的创建方式有了一个很好的了解。您如何使用它来验证您的API?

登录

用户登录时会生成令牌,令牌会与用户模型一起存储在数据库中。

  • loginController.js *

if (passwordCorrect) {
  user.token = generateToken(user.id);
  user.save();
}

然后令牌作为authorization头附加到登录请求的响应中。

loginController.js

if (passwordCorrect) {
  user.token = generateToken(user.id);
  user.save();
  res.headers("authorization", `Bearer ${token}`).send();
}

验证请求

现在,客户端有了令牌,他们可以将其附加到任何将来的请求以身份验证用户。

当服务器收到带有授权令牌的请求时,将发生以下情况:

1.它解码令牌并从有效载荷中提取ID。

2.它使用此ID在数据库中查找用户。

3.它将请求令牌与用户模型中存储的令牌进行比较。如果它们匹配,则对用户进行身份验证。

authMiddleware.js

const token = req.header.token;
const payload = decodeToken(token);
const user = User.findById(payload.id);
if (user.token = token) {
  // 通过身份认证
} else {
 // 未通过身份认证
}

退出登录

如果用户注销,只需删除附加到用户模型的令牌,现在令牌将不再起作用。用户将需要再次登录以生成新令牌。

logoutController.js

user.token = null;
user.save();

总结

因此,这是关于如何使用 JSON Web 令牌保护 API 的最基本的说明。希望你不会很头疼。

不过,相关的话题还有很多,所以这里有一些额外的读物:

  • [JWT.io]https://jwt.io/

  • [什么是 JSON Web 令牌?]https://robmclarty.com/blog/what-is-a-json-web-token

  • [了解如何使用 JSON Web 令牌 ( JWT ) 进行身份验证]https://github.com/dwyl/learn-json-web-tokens

原文链接:https://learnku.com/laravel/t/40490

推荐阅读:
Ngxix | 超详细!Nginx 日志配置实
HTTP客户端连接,选择HttpClient还是OkHttp?
为什么建议使用你 LocalDateTime ,而不是 Date?
答应我,别再写上千行的类了好吗
好文!必须点赞
Fast API 中的用户认证:深入理解 JWT(JSON Web Tokens) 本文深入探讨了在FastAPI中利用JWT实现安全API认证的方案。文章首先强调了API认证的重要性,对比了基于会话和基于令牌两种认证方式的优缺点。重点剖析了JWT的结构(Header,Payload,Signature)及其无状态认证的工作原理,特别指出JWT虽可验证但未加密的特性,以及安全密钥保护的必要性。随后介绍了使用passlib和bcrypt进行密码哈希存储的方法。最后展示了如何将这些技术整合到FastAPI应用中,通过SQLModel实现用户注册、登录和JWT认证的完整流程。文章为开发者提供了构 阅读详情

相关推荐

JWT令牌&&拦截器

JWT令牌&&拦截器

weixin_64308540的博客 1027

JSON Web Tokens介绍

官方介绍:https://jwt.io/introduction/  https://auth0.com/learn/json-web-tokens/ 什么是JSON WEB TOKEN? JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘...

盲目的拾荒者的博客 1327

使用Simple-JWT通过JWT认证保护Django REST API的项目示例

您现在已经使用Simple-JWT在Django Rest Framework中设置了JWT认证。这为在您的Django API中认证用户和访问受保护资源提供了一种安全的方式。请确保在客户端应用程序中适当地处理令牌过期和刷新。有关更多详细信息,您可以参考Django的simple-JWT文档。simple-JWT。

欧阳天涵的专栏 1221

nopCommerce 插件api json RESTful API |JWT 鉴权授权

1.GitHub - SevenSpikes/api-plugin-for-nopcommerce at nopCommerce_4.30_Beta

123po 533

fastapi-jwt:通过使用JSON Web令牌(JWT)启用身份验证来保护FastAPI应用程序

使用基于JWT令牌的身份验证保护FastAPI 是否想学习如何构建? 查看。 要使用这个项目吗? 货叉/克隆 创建并激活虚拟环境: $ python3 -m venv venv && source venv/bin/activate 安装要求: (venv)$ pip install -r requirements.txt 运行应用程序: (venv)$ python main.py 在

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API

重拾后端之Spring Boot(一):REST API的搭建可以这样简单重拾后端之Spring Boot(二):MongoDb的无缝集成重拾后端之Spring Boot(三):找回熟悉的Controller,Service重拾后端之Spring Boot(四):使用 JWT 和 Spring Security 保护 REST API 通常情况下,把API直接暴露出去是风险很大的,不说别的,直接被...

weixin_34038293的博客 453

DICOM三维重建:基于VTK实现三种面绘制算法

版本:VS2019、VTK9.0.1 #define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2) #define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2) #include "vtkDICOMImageReader.h" #include "vtkRenderWindowInteractor.h" #i

一直在笑的博客 5924

JSON Web Token (JWT) 完整指南

JSON Web Token (JWT) 完整指南

蜗牛的专栏 4599

5步上手Quartz.NetUI:.NET Core定时任务的开箱即用解决方案

Quartz.NetUI是一个基于.NET Core + Quartz.NET + Vue + IView的开箱即用的定时任务UI解决方案。它结合了Quartz.NET的强大功能和Vue.js的易用性,提供了一个不依赖数据库、只需在界面进行简单配置即可使用的定时任务管理系统。通过上述步骤,你已经学会了如何使用Quartz.NetUI在.NET Core项目中实现定时任务。Quartz.NetUI不仅功能强大,而且使用简单,非常适合那些需要快速实现定时任务管理的开发者。

java专栏 2408

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

JSON Web 令牌(JWT)是如何保护 API 的

API 验证 JSON Web Token Token 的结构 Header Payload 哈希算法 JWT 签名 认证过程 登录 验证请求 退出登录 总结 你可以已经听说过 JSON Web Token (JWT) 是目前用于保护 API 的最新技术。 与大多数安全主题一样,如果你打算使用它,那很有必要去了解它的工作原理(一定程度上)。问题在于,对 JWT 的大多数解释都是...

KHOST的博客 284

2026工控高薪:C#上位机面试15题(含答案)

基础岗(10-15K):考察串口/Modbus/PLC通信基础;资深岗(20-30K):考察工业级优化(抗干扰/断线重连)、物联网(MQTT)、跨协议整合;架构岗(30K+):考察上位机架构设计、边缘计算、项目落地避坑。我整理了2026年近20场高薪岗位(月薪20K+)的面试高频题,筛选出15道核心题,每题标注“考察点+实战答案”——答案拒绝纯理论,全部结合车间现场、PLC通信、物联网落地等真实场景,帮你避开“背答案但不落地”的面试坑。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1286

使用JSON Web令牌保护Node.js RESTful API

Have you ever wondered how authentication works? What’s behind all the complexity and abstractions. Actually, nothing special. It’s a way of encrypting a value, in turn creating a unique token that us...

cumian9828的博客 305

《拉依达的嵌入式\驱动面试宝典》—Linux篇(八)_Linux驱动编程

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 321

Autodesk Revit软件二次开发:Revit二次开发中的插件设计与实现

在 Revit 中,族是构成建筑模型的基本单元,可以是门窗、家具等。通过自定义族,可以创建符合特定需求的建筑构件。参数化设计允许族的尺寸、形状等属性根据参数变化而变化。使用 Revit API 创建自定义族涉及多个步骤,包括定义族类型、设置参数、创建几何形状等。// 创建族文档// 定义参数Parameter param = family.FamilyManager.AddParameter("Width", BuiltInParameterGroup.PG_LENGTH, "宽度");

kkchenjj的博客 2232

什么是用于REST API的JWT Bearer令牌以及如何通过代码和工具进行调试

JWT Bearer令牌是编码为JSON Web令牌的认证令牌。它们通常用于OAuth 2.0协议中,以授权用户访问API。

Kairo_01的博客 732

Android 编译系统(Build System)剖析

make是一种自动化构建工具,通过读取Makefile将源代码自动编译为可执行程序和库文件。

虎哥LoveDroid 2170

JWT-JSON Web令牌的深入介绍

JWT-JSON Web令牌的深入介绍 从桌面应用程序到Web应用程序或移动应用程序,身份验证是几乎所有应用程序中最重要的部分之一。 本教程是JWT(JSON Web令牌)的深入介绍,可帮助您了解: 基于会话的身份验证与基于令牌的身份验证(为什么JWT诞生了) JWT是如何工作的。 如何创建JWT。 我们如何保护我们的应用程序并验证JWT。 更多实践: – 使用Spring Security和JWT身份验证的安全Spring Boot应用程序 – Node.js –使用JSONWebToken示例(J.

ccf19881030的专栏 574

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

在 ASP.NET Core Web API 中应用 JWT 访问令牌和刷新令牌

作为全栈 .NET 开发人员,保护 API 是一项关键任务。利用 JWT(JSON Web 令牌)进行身份验证和授权是一种常见且有效的策略。本文将指导你在 ASP.NET Core Web API 中实现 JWT 访问令牌和刷新令牌。为什么要使用 JWT?JWT 令牌是紧凑的 URL 安全令牌,易于在各方之间转移。它们是自包含的,这意味着它们自身内部携带信息,从而减少了对服务器端会话存储的需求。设...

dotNET跨平台 717

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中Json web token (JWT)的使用

JWT是什么? 使用JWT的好处 使用io.jsonwebtoken包的方式 pom.xml导入的jar包 User实体 JjwtUtil类 TestJjwt测试类 打印的结果 使用com.auth0包的方式 pom.xml文件 User实体使用上面的 JWTInterceptor拦截器 spring-context.xml配置文件 web.xml配置文件 JWTUti......

UserGuan的博客 2万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

用JWT来保护我们的ASP.NET Core Web API

在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT。   什么是JWT呢?JWT的全称是JSON WEB TOKENS,是一种自包含令牌格式。官方网址:https://jwt.io/,或多或少应该都有听过这个。   先来看看下面的两个图:   站点是通过RPC的

umke888的博客 6433

如何使用 JWT 身份验证保护 REST API

JSON Web 令牌是一种开放的标准方式,您可以在两方交互期间安全地表示用户的身份。当两个系统交换数据时,您可以使用 JSON Web 令牌来识别您的用户,而无需在每个请求上发送私有凭据。如果将其应用于 REST API,您将看到我们的客户端-服务器交互如何从这些机制中受益:首先,用户或客户端应用程序发送登录请求。在此步骤中,用户提供的用户名、密码或任何其他类型的登录凭据本质上都会传送到 API。验证后,API 将创建一个 JSON Web 令牌并使用密钥对其进行签名。

分享身边生活经验blog 1537

web api json_有关使用JSON Web令牌保护无服务器API的速成班

web api jsonWhat a mouthful of a title. Wouldn’t you agree? In this walkthrough you’ll learn about securing your Serverless endpoints with JSON web tokens. 这么大的头衔。 你不同意吗? 在本演练中,您将学习如何使用JSON Web令牌保护无服务...

cumi7754的博客 382
上一篇: 什么?你还在使用fastjson,性能太差了
下一篇: 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值