我们一起聊一聊JWT的那些事

我们一起聊一聊JWT的那些事

在这里插入图片描述
一切美好,如期而至…

什么是JWT

JWT,全称为 JSON Web Token,是一种用于在网络上安全地传递信息的开放标准(RFC 7519)。JWT 是一种紧凑且独立的方式,用于在各方之间以 JSON 对象形式安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用秘密(使用 HMAC 算法)或使用公钥/私钥对(使用 RSA 或 ECDSA 算法)进行签名。

JWT 通常用于身份验证和信息交换。在身份验证方面,当用户成功登录后,服务器会生成一个包含用户标识信息的 JWT,并将其发送回客户端。客户端随后可以在每个后续请求中包含 JWT,以证明其身份。在信息交换方面,由于 JWT 的信息是经过签名的,接收方可以验证其来源和完整性。

JWT 的结构如下:

xxxxx.yyyyy.zzzzz

其中,每一部分由点号分隔:

  • 第一部分是头部(Header),通常包含两部分信息:令牌类型(JWT)和所使用的签名算法,例如 HMAC SHA256 或 RSA。

  • 第二部分是载荷(Payload),包含声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。有三种类型的声明:注册的声明,公共的声明和私有的声明。

  • 第三部分是签名(Signature),用于验证消息在传递过程中没有被篡改,并确保消息的发送方是可信的。

JWT 的优点包括:

  1. 自包含: JWT 包含了所有需要的信息,减少了在服务器存储会话状态的需要。

  2. 跨域: 由于 JWT 是在各方之间传递的标准格式,可以在不同域之间轻松传递信息。

  3. 安全性: 当使用数字签名时,可以确保 JWT 的来源和完整性。

然而,需要注意的是,为了确保安全性,不应该在 JWT 中存储敏感信息,尤其是在使用对称加密算法的情况下。对于敏感信息,最好在服务器端进行验证。

和普通的token有啥区别子

JSON Web Token(JWT)和普通的 token 之间有一些关键区别,主要涉及到它们的结构、用途和安全性等方面:

  1. 结构差异:

    • 普通 Token: 通常是一个简单的字符串,可能是随机生成的一串字符,例如 UUID(Universally Unique Identifier)。
    • JWT: 具有明确定义的结构,包含头部、载荷和签名三个部分,并以点号分隔。这种结构使得 JWT 可以携带更多的信息,并且具有更灵活的用途。
  2. 内容携带:

    • 普通 Token: 只是一个标识符,不携带其他有关用户或实体的信息。
    • JWT: 可以携带一些声明(claims),这些声明包含有关用户、角色、权限等信息。由于 JWT 是基于 JSON 格式的,因此它可以以一种结构化的方式携带更多的信息。
  3. 签名和验证:

    • 普通 Token: 通常需要在服务器端进行验证,但不一定使用数字签名或加密。
    • JWT: 通常使用数字签名来验证其真实性。这使得 JWT 在传递过程中能够被验证,确保它没有被篡改。JWT 还支持使用非对称加密来提供额外的安全性。
  4. 安全性:

    • 普通 Token: 可能存在被伪造或截获的风险,因为它没有内置的安全机制。
    • JWT: 通过数字签名或加密,提供了一定程度的安全性。如果使用对称加密,需要确保密钥的安全性;如果使用非对称加密,可以更安全地传递公钥。
  5. 用途:

    • 普通 Token: 通常用于简单的身份验证,例如在会话中保存用户的登录状态。
    • JWT: 由于其结构和灵活性,可用于更广泛的用途,包括身份验证、信息交换和声明传递。

总体而言,JWT 是一种更为灵活、结构化且安全的令牌,适用于需要携带更多信息和在跨域环境中进行安全传递的场景。普通 Token 更适合简单的身份验证场景。选择使用哪种令牌取决于具体的应用需求和安全要求。

如何生成JWT

前端生成

生成 JSON Web Tokens(JWT)涉及以下步骤:

  1. 选择一个密钥: JWT 使用密钥进行签名以确保数据的完整性和来源。密钥可以是对称密钥(HMAC算法)或非对称密钥(RSA或ECDSA算法)。

  2. 构建JWT的头部(Header): JWT的头部包含有关令牌的元信息,如算法和令牌类型。这部分信息通常以Base64编码的JSON字符串表示,并放置在JWT的第一部分。

  3. 构建JWT的载荷(Payload): 载荷包含有关JWT主体(subject)的声明和其他信息。与头部一样,这部分信息也是以Base64编码的JSON字符串表示,并放置在JWT的第二部分。

  4. 对头部和载荷进行签名: 使用选择的算法和密钥对头部和载荷进行签名。签名是通过将Base64编码的头部和载荷字符串与密钥一起进行加密而生成的。

  5. 将头部、载荷和签名组合成JWT: 将Base64编码的头部、Base64编码的载荷和签名以点号分隔组合在一起形成JWT。

下面是一个简单的例子,使用Node.js中的jsonwebtoken库生成JWT:

const jwt = require('jsonwebtoken');// 构建头部
const header = {"alg": "HS256",  // HMAC SHA-256算法"typ": "JWT"
};// 构建载荷
const payload = {"sub": "1234567890",  // 主体标识"name": "John Doe","iat": Math.floor(Date.now() / 1000)  // 签发时间(当前时间)
};// 选择密钥
const secretKey = "yourSecretKey";// 生成JWT
const token = jwt.sign(payload, secretKey, { header });console.log(token);

在实际应用中,建议使用更安全的随机生成的密钥,并根据具体的需求选择适当的算法和配置选项。生成JWT的代码示例可能会根据所选的编程语言和库而有所不同,但上述步骤是通用的。

后端生成

在Java中,你可以使用 io.jsonwebtoken 库来生成 JSON Web Tokens(JWT)。以下是一个简单的例子:

首先,你需要将 jjwt 库添加到你的项目中。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.2</version><scope>runtime</scope>
</dependency>

然后,你可以使用以下Java代码生成JWT:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;public class JwtGenerator {public static void main(String[] args) {// 构建头部String algorithm = SignatureAlgorithm.HS256.getJcaName();String header = "{\"alg\":\"" + algorithm + "\",\"typ\":\"JWT\"}";// 构建载荷String subject = "1234567890";  // 主体标识String name = "John Doe";long nowMillis = System.currentTimeMillis();Date iat = new Date(nowMillis);  // 签发时间(当前时间)// 选择密钥String secretKey = "yourSecretKey";// 生成JWTString token = Jwts.builder().setHeader(header).setSubject(subject).claim("name", name).setIssuedAt(iat).signWith(SignatureAlgorithm.HS256, secretKey).compact();System.out.println(token);}
}

请确保替换示例中的密钥和其他参数为你实际的值。这个例子中使用了 HMAC SHA-256 算法,但你可以根据需求选择其他算法。在实际应用中,密钥应该是安全的,并且可能需要使用环境变量或其他方式来管理。

还有那些库

除了 io.jsonwebtoken,还有一些其他常用的Java库可以用于生成和处理JSON Web Tokens(JWT)。以下是一些常见的JWT库:

  1. Nimbus JOSE + JWT:
    在这里插入图片描述

    • 官方网站: Nimbus JOSE + JWT
    • 主要功能:
      • 提供了处理JOSE(JSON Object Signing and Encryption)和JWT的Java库。
      • 支持各种JWT相关的标准和规范,如JWT、JWS(JSON Web Signature)、JWE(JSON Web Encryption)等。
      • 提供了易于使用的API,支持生成和验证JWT。
  2. Java-JWT:
    在这里插入图片描述

    • GitHub地址: Java-JWT
    • 主要功能:
      • Auth0开发的Java库,用于生成和验证JWT。
      • 支持标准的JWT算法,如HMAC SHA256、RS256等。
      • 提供了简洁的API,适用于各种JWT用例。
  3. JJWT:
    在这里插入图片描述

    • GitHub地址: JJWT
    • 主要功能:
      • 一个简单的Java库,用于生成、解析和验证JWT。
      • 支持各种算法,包括HMAC SHA256、RS256等。
      • 提供了流畅的API,易于使用。
        当然,还有HuTool工具类,就不多赘述了
        在这里插入图片描述

选择使用哪个库取决于你的具体需求、项目的特点以及个人偏好。在使用之前,请仔细查阅相关文档,了解库的功能、性能和安全性。

JWT的解析和验证

解析和验证 JSON Web Tokens(JWT)通常包括以下步骤:

  1. 拆分 JWT: JWT 由三部分组成,分别是头部(Header)、载荷(Payload)、签名(Signature),它们之间用点号分隔。首先,将 JWT 字符串拆分成这三个部分。

  2. 解码 Base64: 对头部和载荷进行 Base64 解码,得到 JSON 字符串。

  3. 解析 JSON: 将解码后的头部和载荷 JSON 字符串解析为 JSON 对象。

  4. 验证签名(可选): 如果 JWT 使用签名算法进行签名,需要对头部、载荷和签名进行验证。验证的步骤通常包括获取密钥(对称或非对称密钥),使用相同的签名算法对头部和载荷进行签名,然后比较生成的签名与 JWT 中的签名是否匹配。

以下是一个使用 Java 的示例,使用 io.jsonwebtoken 库进行 JWT 解析和验证的过程:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureException;public class JwtParser {public static void main(String[] args) {// 要解析和验证的 JWT 字符串String jwtString = "yourJwtStringHere";try {// 解析 JWTJws<Claims> jws = Jwts.parserBuilder().setSigningKey("yourSecretKey")  // 设置密钥.build().parseClaimsJws(jwtString);// 获取载荷(Claims)Claims claims = jws.getBody();// 在此可以获取 JWT 中的信息,例如:String subject = claims.getSubject();String name = (String) claims.get("name");// 其他声明的获取方法...// 验证通过,可以继续处理业务逻辑System.out.println("JWT验证通过");} catch (ExpiredJwtException e) {// JWT 过期异常System.out.println("JWT已过期");} catch (SignatureException e) {// JWT 签名异常System.out.println("JWT签名验证失败");} catch (Exception e) {// 其他异常System.out.println("JWT解析失败");}}
}

请注意,上述代码中的密钥和其他参数需要根据你的实际情况进行调整。此外,对于非对称加密的情况,需要提供公钥进行验证。在实际应用中,也可以考虑使用库提供的更复杂的配置选项和错误处理机制。

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

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

相关文章

javaTCP协议实现一对一聊天

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…

消费1000返1500元,买了4罐奶粉倒赚商家2000元?商家亏吗?

大家好&#xff0c;我是微三云胡佳东&#xff0c;一个深耕私域电商模式玩法的互联网人&#xff01;&#xff01; 在当前的全球经济环境下&#xff0c;消费增值的概念正逐渐受到广泛的关注。这一模式的崛起&#xff0c;不仅仅是一种商业模式的创新&#xff0c;更代表着我们对经…

[⑦ADRV902x]: JESD204学习笔记

前言 JESD204B/C基于SERDES&#xff08;SERialization/DESerialization&#xff09;技术&#xff0c;也就是串化和解串&#xff0c;在发送端将多位并行的数据转换为1 bit的串行数据&#xff0c;在接收端将串行数据恢复成原始的并行数据。 在JESD204接口出现以前&#xff0c;数…

TOC清洁验证棉签:擦拭取样清洁验证专用的强力助手!

由PP聚丙烯杆聚酯纤维布头构成的TOC清洁验证棉签&#xff0c;用于清洁验证协议的表面采样取样&#xff0c;对难以到达的区域或狭小空间的精密清洗等。 棉签杆使用聚丙烯制作,杆上的缺口能使棉签头在较小的操作及污染下放进小瓶中,具有较好的化学相容性。 有缺口的分离式手柄允许…

class036 二叉树高频题目-上-不含树型dp【算法】

class036 二叉树高频题目-上-不含树型dp code1 102. 二叉树的层序遍历 // 二叉树的层序遍历 // 测试链接 : https://leetcode.cn/problems/binary-tree-level-order-traversal/ code1 普通bfs code2 一次操作一层 package class036;import java.util.ArrayList; import java…

全自动影像仪图像自动匹配对焦,测量一致性好

全自动影像仪使用自动边缘提取、自动匹配、自动对焦、测量合成等先进的机器视觉和人工智能技术&#xff0c;能实现高精度的测量与自动对焦。这些技术提高测量的连贯性和准确性&#xff0c;进而提升生产效率与产品质量。 此外&#xff0c;全自动影像仪还具有多种功能&#xff0…

【二叉树】

文章目录 树形结构注意要点细分概念树在生活中的应用 二叉树什么是二叉树二叉树特点&#xff1a;两种特殊的二叉树二叉树的性质二叉树性质的练习二叉树的存储二叉树的遍历前序遍历中序遍历后序遍历遍历练习 树形结构 树是一种非线性的数据结构&#xff0c;它具有以下的特点&am…

LeetCode 1038. 从二叉搜索树到更大和树:(反)中序遍历

【LetMeFly】1038.从二叉搜索树到更大和树&#xff1a;&#xff08;反&#xff09;中序遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/binary-search-tree-to-greater-sum-tree/ 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于…

k8s中的Pod网络;Service网络;网络插件Calico

Pod网络&#xff1b;Service网络&#xff1b;网络插件Calico Pod网络 在K8S集群里&#xff0c;多个节点上的Pod相互通信&#xff0c;要通过网络插件来完成&#xff0c;比如Calico网络插件。 使用kubeadm初始化K8S集群时&#xff0c;有指定一个参数–pod-network-cidr10.18.0…

如何让软文更具画面感,媒介盒子分享

写软文这种带有销售性质的文案时&#xff0c;总说要有画面感&#xff0c;要有想象空间。只有针对目标用户的感受的设计&#xff0c;要了解用户想的是什么&#xff0c;要用可视化的描述来影响用户的感受&#xff0c;今天媒介盒子就和大家分享&#xff1a;如何让软文更具画面感。…

2023-12-05 LeetCode每日一题(到达首都的最少油耗)

2023-12-05每日一题 一、题目编号 2477. 到达首都的最少油耗二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n - 1 &#xff0c;且恰好有 …

Ubuntu之Sim2Real环境配置(坑居多)

不要一上来就复制哦,因为很多下面的步骤让我走了很多弯路,如果可能的话,我会重新整理再发出来 前提: 参考教程 Docs 创建工作空间(不用跟着操作,无用) 1.创建sim2real server container 1.尝试创建sim2real_server容器 后来使用 docker ps -a 发现我已经有sim2real_se…

机器学习 类别特征编码:Category Encoders 库的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

202350读书笔记|《再别康桥:徐志摩诗选》——微风起,清芬酝藉,不减荼

202350读书笔记|《再别康桥&#xff1a;徐志摩诗选》——微风起&#xff0c;清芬酝藉&#xff0c;不减荼 《再别康桥&#xff1a;徐志摩诗选》我觉得有时候诗人是很狂热的&#xff0c;上头的感觉。 有几首很喜欢&#xff0c;节选如下&#xff1a; 偶然 我是天空里的一片云&…

内测分发平台支持应用的异地容灾的重要性

大家好&#xff0c;我是咕噜-凯撒&#xff0c;随着网络社会的发展&#xff0c;人们对于应用程序的依赖程度越来越高。无论是企业用户还是个人用户&#xff0c;都希望能够随时随地访问到需要使用的应用。所以对于内测分发平台来说保证应用的连续性和可靠性是非常的关键。内侧分发…

推荐一个开源的监控程序-Uptime

先放几张截图介绍一下 现场演示 尝试一下&#xff01; 东京演示服务器&#xff1a;https://demo.uptime.kuma.pet&#xff08;由 Uptime Kuma 赞助商 赞助&#xff09; 这是一个临时的现场演示&#xff0c;所有数据将在10分钟后删除。使用距离您较近的一个&#xff0c;但我建…

LinuxBasicsForHackers笔记 -- BASH 脚本

你的第一个脚本&#xff1a;“你好&#xff0c;黑客崛起&#xff01;” 首先&#xff0c;您需要告诉操作系统您要为脚本使用哪个解释器。 为此&#xff0c;请输入 shebang&#xff0c;它是井号和感叹号的组合&#xff0c;如下所示&#xff1a;#! 然后&#xff0c;在 shebang …

探索SpringBoot发展历程

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

年薪50w的测试开发是如何编写测试方案!看过来!!!

1. 测试方案内容 测试目标 测试对象测试完成时间 测试范围 测试目标 新增功能回归模块优先级 测试顺序测试深浅 测试策略 测试方法&#xff1a;黑盒、白盒、灰盒测试阶段&#xff1a;单元、集成、系统、验收测试类型&#xff1a; 功能性性能和稳定性安全自动化... 测试工…

您知道计算机是怎么分类的嘛

地表最强计算机 第 61 版全球最强大的超级计算机已经发布。名为 Top500&#xff0c;顾名思义&#xff0c;该列表列出了全球 500 台最强大的超级计算机。榜单显示&#xff0c;美国的AMD、英特尔和IBM处理器是超级计算系统的首选。在 TOP10 中&#xff0c;有四个系统使用 AMD 处理…