JWT-JSON Web令牌的深入介绍

article/2025/10/16 18:01:45

in-depth-introduction-jwt-feature-image

JWT-JSON Web令牌的深入介绍

从桌面应用程序到Web应用程序或移动应用程序,身份验证是几乎所有应用程序中最重要的部分之一。 本教程是JWT(JSON Web令牌)的深入介绍,可帮助您了解:

  • 基于会话的身份验证与基于令牌的身份验证(为什么JWT诞生了)
  • JWT是如何工作的。
  • 如何创建JWT。
  • 我们如何保护我们的应用程序并验证JWT。
  • 更多实践:
    – 使用Spring Security和JWT身份验证的安全Spring Boot应用程序
    – Node.js –使用JSONWebToken示例(JWT)的基于令牌的身份验证
    – Spring Boot,MongoDB:基于Spring Security的JWT身份验证

– 使用Vuex和Vue路由器进行Vue.js JWT身份验证
– 使用HttpInterceptor和路由器进行Angular 8 JWT身份验证
– React JWT身份验证(无Redux)示例

使用JWT的Spring Security概述:
[按体系结构使用了 MySQL,Spring Security示例的Spring Boot JWT Auth[(https://bezkoder.com/spring-boot-jwt-mysql-spring-security-architecture/)

内容

  • 基于会话的身份验证和基于令牌的身份验证
  • JWT是如何工作的
  • 如何创建JWT
    • 标头
    • 有效载荷
    • 签名
    • 结合一切
  • JWT如何保护我们的数据
  • 服务端如何校验从客户端过来的JWT
  • 结论
  • 进一步阅读

基于会话的身份验证和基于令牌的身份验证

对于使用任何网站,移动应用程序或桌面应用程序……您几乎需要创建一个帐户,然后使用该帐户登录以访问该应用程序的功能。 我们称该行为为身份验证

那么,如何验证帐户?
首先,我们来看看过去流行的网站使用的一种简单方法:基于会话的身份验证

in-depth-introduction-jwt-session-based-authentication
在上图中,当用户登录网站时,服务器将为该用户生成一个会话并将其存储(在内存或数据库中)。服务器还会为客户端返回一个SessionId,以将其保存在浏览器Cookie中。

服务器上的会话具有到期时间。在此时间之后,该会话已过期,用户必须重新登录才能创建另一个会话。

如果用户已登录并且会话尚未到期,则Cookie(包括SessionId)将始终与所有向服务器的HTTP请求一起使用。服务器将比较此SessionId与存储的会话以进行身份​​验证并返回相应的响应。

没关系。但是为什么我们需要基于令牌的身份验证?
答案是我们不仅有网站,而且那里有很多平台。

假设我们有一个与Session配合良好的网站。有一天,我们想为移动(本地应用程序)实现系统,并与当前的Web应用程序使用同一数据库。我们应该做什么?我们无法使用基于会话的身份验证对使用Native App的用户进行身份验证,因为这些类型没有Cookie。

我们是否应该构建另一个支持Native Apps的后端项目?
还是应该为Native App用户编写一个身份验证模块?

这就是基于令牌的身份验证诞生的原因。
使用此方法,服务器会将用户登录状态编码为JSON Web令牌(JWT),并将其发送给客户端。 如今,许多RESTful API都在使用它。 让我们转到下一部分,我们将知道它是如何工作的。

JWT是如何工作的

现在看下面的流程:
in-depth-introduction-jwt-token-based-authentication
您会发现它很容易理解。 服务器没有创建会话,而是从用户登录数据生成了JWT,并将其发送给客户端。 客户端保存JWT,从现在开始,来自客户端的每个请求都应附加到该JWT(通常在标头处)。 服务器将验证JWT并返回响应。

要在客户端存储JWT,取决于您使用的平台:
- 浏览器:Local Storage
- IOS: Keychain
- Android: SharedPreferences
这是基于令牌的身份验证流程的概述。 在下一节中,您将更深入地了解它。

如何创建JWT

首先,您应该了解JWT的三个重要部分:

  • 标头
  • 有效载荷
  • 签名

标头

标头回答了这个问题:我们将如何计算JWT?
现在来看一个标头示例,它是一个JSON对象,如下所示:

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

– typ是“ type”,表示此处的令牌类型是JWT。
– alg代表“算法”,它是一种用于生成令牌签名的哈希算法。 在上面的代码中,HS256是HMAC-SHA256 –使用密钥的算法。

有效载荷

有效负载可帮助我们回答:我们想在JWT中存储什么?
这是有效负载示例:

{"userId": "abcd12345ghijk","username": "bezkoder","email": "contact@bezkoder.com",// standard fields"iss": "zKoder, author of bezkoder.com","iat": 1570238918,"exp": 1570238992
}

在上面的JSON对象中,我们存储3个用户字段:userId,username, email。 您可以保存所需的任何字段。

我们也有一些Standard Fields。 它们是可选的。

  • iss(Issuer):谁发行JWT
  • iat(发布于):JWT的发布时间:
  • exp(到期时间):JWT到期时间
    我们可以在[https://en.wikipedia.org/wiki/JSON_Web_Token#Standard_fields](https://en.wikipedia.org/wiki/JSON_Web_Token#Standard_fields]查看更多的Standard Fields

签名

这部分是我们使用上面我告诉过您的哈希算法的地方。
查看下面获得签名的代码:

const data = Base64UrlEncode(header) + '.' + Base64UrlEncode(payload);
const hashedData = Hash(data, secret);
const signature = Base64UrlEncode(hashedData);

让我们解释一下。
–首先,我们对Header和Payload进行编码,并用点将它们连接起来。

data = '[encodedHeader].[encodedPayload]'

–接下来,我们使用带有秘钥字符串的Hash算法(在Header中定义)对数据进行哈希处理。
–最后,我们对哈希结果进行编码以获得签名

结合一切

在拥有Header,Payload,Signature之后,我们将它们组合成JWT标准结构:header.payload.signature。
以下代码将说明我们如何做到这一点。

const encodedHeader = base64urlEncode(header);
/* Result */
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"const encodedPayload = base64urlEncode(payload);
/* Result */
"eyJ1c2VySWQiOiJhYmNkMTIzNDVnaGlqayIsInVzZXJuYW1lIjoiYmV6a29kZXIiLCJlbWFpbCI6ImNvbnRhY3RAYmV6a29kZXIuY29tIn0"const data = encodedHeader + "." + encodedPayload;
const hashedData = Hash(data, secret);
const signature = base64urlEncode(hashedData);
/* Result */
"crrCKWNGay10ZYbzNG3e0hfLKbL7ktolT7GqjUMwi3k"// header.payload.signature
const JWT = encodedHeader + "." + encodedPayload + "." + signature;
/* Result */
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzNDVnaGlqayIsInVzZXJuYW1lIjoiYmV6a29kZXIiLCJlbWFpbCI6ImNvbnRhY3RAYmV6a29kZXIuY29tIn0.5IN4qmZTS3LEaXCisfJQhrSyhSPXEgM1ux-qXsGKacQ"

JWT如何保护我们的数据

JWT不保护您的数据

JWT完全不会隐藏,掩盖和保护数据。 您可以看到,生成JWT(标头,有效负载,签名)的过程仅对数据进行哈希处理,而不对数据进行加密。

JWT的目的是证明数据是由真实来源生成的。

那么,如果有中间人攻击可以获取JWT,然后解码用户信息怎么办? 是的,这是可能的,因此请始终确保您的应用程序具有HTTPS加密。

服务器如何从客户端验证JWT

在上一节中,我们使用Secret字符串创建签名。 此Secret字符串对于每个应用都是唯一的,并且必须安全地存储在服务器端。

从客户端接收JWT时,服务器获取签名,并验证签名是否已通过与上述相同的算法和Secret字符串正确地进行了哈希处理。 如果它与服务器的签名匹配,则JWT有效。

重要!

当发送给服务端时,有经验的程序猿仍然可以添加或编辑有效载荷信息。 在这种情况下我们该怎么办?
我们先存储令牌,然后再将其发送给客户端。 它可以确保客户端稍后发送的JWT有效。

此外,将用户的令牌保存在服务器上还将使系统的强制注销功能受益。

结论

永远不会有最佳的身份验证方法。 这取决于用例和实现方式。

但是,对于要在许多平台上扩展为大量用户的应用程序,首选JWT身份验证,因为令牌将存储在客户端。

祝您学习愉快,再见!

进一步学习

  • RFC7519 – JSON Web Token (JWT)
  • JWT Standard fields

http://chatgpt.dhexx.cn/article/fjZJUpZ0.shtml

相关文章

JSON Web Token原理深入理解

什么是JWT JWT全称Json Web Token,翻译为JSON格式的网络令牌,很多时候又简称为Token(JWT是Token的一种实现方式)。它要解决的问题,就是为多种终端设备,提供统一的、安全的令牌格式。因此,JWT只是一个令牌格式而已&…

【JWT】jwt令牌研究

一、JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法,如下图: 问题: 传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,并根据令牌获取用户的相关信息&#xff0c…

JWT令牌验证

JWT令牌验证 jwt的由来及解决的问题JWT的工作原理JWT组成重点:JWT实现验证:4.1 首先前后端跨域配置:4.2 jwt配置:4.3 web.xml配置:4.4 登录成功时生成jwt令牌前端NodeJs服务器配置拦截器,配置在http目录下4…

如何使用JSON Web令牌(JWT)保护您的文档

如何使用JSON Web令牌(JWT)保护您的文档 在本文中,我们讲解如何使用JSON网络令牌JWT来保护在线文档免受未经授权的访问,从而可以更安全的把在线文档编辑器开发集成进您自己的网络应用中去。 这里将集成开源的办公套件ONLYOFFICE …

day13 SpringBoot案例3 令牌技术、登录校验

登录校验的实现思路是怎样的? 项目中访问核心资源,通常都要进行登录校验,访问京东商城的订单,必须要先登录才能访问查询 实现思路: 可以在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登…

pythonjson数据解析失败_json解析失败是什么意思

因为代码的不美观等因素,我们会使用一些解析工具进行处理,有些人在解析时出现了报错。解析失败需要考虑多方面的因素,如格式、String类型、boolean类型等原因,在格式上分为格式错误和格式正确两种讨论。下面就json解析失败的原因为…

Java Web Token令牌校验

前言:本文只涉及JWT的理论部分,不涉及代码 传统的用户校验可以结合cookiesession来实现,但是校验信息存放在服务端,当用户过多时会给服务器造成太大的压力,所以我们可以使用token进行校验,将用户信息加以签…

JWT令牌生成与校验

目录 1 JWT介绍1.1 什么是JWT?1.2 JWT令牌结构 2 配置JWT令牌服务3 生成JWT令牌4 校验JWT令牌5 JWT整合Spring Security5.1 创建表 6 配置授权服务6.1 测试 1 JWT介绍 通过上边的测试我们发现,当资源服务和授权服务不在一起时资源服务使用RemoteTokenSe…

信息系统基础知识(笔记)

一、信息 1.1、信息的基本概念 信息就是信息,既不是物质们也不是论量,信息是能够用来消除不确定的东西 两个概念层次:本体论(客观层,与课客体本身因素相关,与主题因素无关) 认知论&#xff0…

计算机毕业论文内容参考|基于大数据的信息物理融合系统的分析与设计方法

文章目录 导文摘要前言绪论课题背景国内外现状与趋势:课题内容:相关技术与方法介绍:系统架构设计:数据采集与处理:数据存储与管理:数据分析与挖掘:系统优化与调试:应用场景:挑战与机遇:研究方向:系统分析:系统设计:系统实现:系统测试:总结与展望:

工业4.0中的人-信息-物理系统集成(HSI):设计与评估方法

于栖洋 译 摘要:本文概述了工业4.0中集成人和信息物理系统的设计和使用空间,特别关注分析、设计和评估方法和阶段的相互作用。本文首先介绍了工业4.0面临的挑战,综述了现有的系统设计方法,描述了方法模型的设计和使用空间,并以工…

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中,将培育人工智能、移动智能终端…

Unity物理系统(一)物理系统相关组件

一、物理系统相关组件 Unity中的物理系统涉及的组件分为如下几类: 刚体角色控制器碰撞体布料关节力场 二、刚体(Rigidbody) Rigidbody(刚体)组件可以使游戏对象在物理系统的控制下进行运动,Rigidbody …

工业信息物理系统测试验证平台(ETest_CPS)

1.产品简介 ETest_CPS是基于ETest Studio开发出的工业信息物理系统测试验证平台(Embedded System Test Studiofor Cyber-Physical System,简称:ETest_CPS)。ETest_CPS由软件和硬件组成,软件采用ETest,硬件包括测试机柜…

信息化与信息系统5

信息系统规划 大型信息系统的特点 考点: 具体包括以下6点: 规模庞大,跨地域性,网络结构复杂,业务种类多,数量大,用户多。 信息系统规划方法 规划流程 1. 分析企业信息化的现状 2. 制定企…

信息物理社会融合系统:一种以数据为中心的框架

信息物理社会融合系统:一种以数据为中心的框架 翟书颖1, 郭斌2, 李茹1, 王庭良1, 於志文2, 周兴社2 1. 西北工业大学明德学院,陕西 西安 710129 2. 西北工业大学计算机学院,陕西 西安 710129 摘要:信息物理社会融合系统连接信息空…

ETest_CPS——工业信息物理系统测试验证平台

1)产品简介 ETest_CPS是一款工业信息物理系统测试验证平台(Embedded System Test Studio for Cyber-Physical System,简称:ETest_CPS)。ETest_CPS由软件和硬件组成,软件采用ETest,硬件包括测试机柜、测试主…

信息物理系统-Rijndael加密算法的实现

信息物理系统-Rijndael加密算法的实现: 概述: AES标准的Rijndael算法是一种分组加密算法,本次实验通过PtolemyII软件,实现了明文长度为128位,密钥长度为128位的Rijndael加密算法。 实验的完成采取自底向上的&#x…

信息化与信息系统4

信息安全概念 安全分层 信息安全分为4层:设备安全,数据安全,内容安全,行为安全 会给出某些特性,要求反向选择是属于哪一层。 信息系统的安全保护等级 第一级:对个人,公司造成损害 第二级&a…

物理系统(一)

物理系统主要由以下几部分组成:Rigidbody(刚体)、Character Controller(角色控制器)、Collider(碰撞器)、Cloth(布料)、Joint(关节) 如图&#xf…