JWT(JSON Web Tokens) 详细介绍
文章目录
- 什么是JWT?
- JWT的组成部分
- JWT的使用场景
- 优点
- 缺点
- Java中如何实现JWT编解码
- 引入JJWT依赖
- 编码JWT
- 解码JWT
- 使用示例
什么是JWT?
JWT(JSON Web Tokens)是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。JWT可以传递信息,这个信息是经过数字签名的,因此可以验证其完整性及被签发人。JWT广泛用于身份验证和信息交换,特别是在客户端和服务器之间的通信中。
JWT的组成部分
JWT通常由三部分组成,它们之间用.(点)分隔:
-
Header(头部):头部包含两部分信息:
typ:表示令牌的类型,对于JWT,此值固定为JWT。alg:表示签名所使用的算法,如HMAC SHA256或RSA。
例如:
{"alg": "HS256","typ": "JWT" }然后使用Base64对这个JSON进行编码。
-
Payload(负载):负载部分包含声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:注册的、公共的和私有的。
- 注册声明(Registered claims):建议但不强制使用的一组预定义声明,如
iss(签发者)、exp(过期时间)、sub(主题)等。 - 公共声明(Public claims):可以随意定义。
- 私有声明(Private claims):用于在同意使用它们的各方之间共享信息,既不是注册也不是公共的声明。
例如:
{"sub": "1234567890","name": "John Doe","admin": true }这部分也使用Base64编码。
- 注册声明(Registered claims):建议但不强制使用的一组预定义声明,如
-
Signature(签名):签名部分是对前两部分的签名,以防止数据被篡改。首先,需要指定的头部中指定的算法对编码后的头部和编码后的负载进行签名。
签名过程为:- 对Header和Payload进行Base64编码后的字符串使用
.连接。 - 使用Header中指定的签名算法(如HMAC SHA256)和密钥对连接后的字符串进行签名。
- 对Header和Payload进行Base64编码后的字符串使用
JWT的使用场景
JWT因其简洁、自包含的特点,广泛用于以下场景:
- 身份验证:JWT允许用户登录后,服务器返回一个JWT,以后用户只需携带JWT访问资源即可,无需携带用户名和密码。
- 信息交换:JWT可以在不同服务间安全地传输用户信息,无需多次查询数据库。
优点
- 紧凑:可以通过URL、POST参数或在HTTP头部中发送,易于传输。
- 自包含:负载中包含了所有必要的信息,减少了需要查询信息的需求。
- 安全性:通过签名可以验证消息的完整性及签发人。
缺点
- 令牌大小:由于包含的信息较多,JWT可能会比其他令牌(如简单的token字符串)更大。
- 性能:每次请求都需要验证JWT,可能会对性能产生影响。
- 令牌泄露:如果JWT被拦截,攻击者将能够在令牌有效期内冒充用户。因此,必须确保HTTPS的使用来防止中间人攻击。
总的来说,JWT提供了一种轻量级、安全的方式,用于在双方之间传递信息,特别适用于身份验证和信息交换的场景。
Java中如何实现JWT编解码
在Java中实现JWT的编解码,你通常会使用一些流行的库,如jjwt(Java JWT)或nimbus-jose-jwt。这些库提供了生成JWT、验证JWT、解析JWT等功能的简便方法。下面我将以jjwt为例,介绍如何在Java中实现JWT的编解码。
引入JJWT依赖
首先,你需要在你的项目中引入JJWT的依赖。如果你使用的是Maven,可以在pom.xml中添加如下依赖:
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> <!-- 请检查最新版本 -->
</dependency>
编码JWT
编码JWT通常涉及到创建一个Claims对象,设置你需要的声明(claims),然后使用密钥对其进行签名。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;public class JwtUtil {private static final String SECRET_KEY = "your-256-bit-secret"; // 密钥public static String generateToken(String subject) {return Jwts.builder().setSubject(subject) // 设置主题.setIssuedAt(new Date()) // 设置签发时间.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 设置过期时间,这里设置为10小时后过期.signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 使用HS256算法和密钥进行签名.compact(); // 压缩并返回JWT字符串}
}
解码JWT
解码JWT涉及到验证签名并解析JWT中的声明。
public static Claims parseToken(String token) {try {return Jwts.parser().setSigningKey(SECRET_KEY) // 设置用于签名的密钥.parseClaimsJws(token) // 解析JWT.getBody(); // 获取Claims对象} catch (Exception e) {// 可以在这里处理异常,比如返回null或抛出运行时异常e.printStackTrace();return null;}
}
使用示例
public class Main {public static void main(String[] args) {String token = JwtUtil.generateToken("user123");System.out.println("Generated Token: " + token);Claims claims = JwtUtil.parseToken(token);if (claims != null) {System.out.println("Subject: " + claims.getSubject());// 你还可以获取其他声明,如过期时间、签发时间等}}
}
请注意,在实际应用中,你需要将SECRET_KEY替换为一个安全且难以猜测的密钥。此外,JWT的安全性也依赖于密钥的保密性,因此请确保你的密钥不被泄露。
此外,JWT的过期时间、签发者、受众等声明可以根据你的需求进行设置。JJWT库提供了丰富的API来支持这些功能。
相关文章:
JWT(JSON Web Tokens) 详细介绍
文章目录 什么是JWT?JWT的组成部分JWT的使用场景优点缺点 Java中如何实现JWT编解码引入JJWT依赖编码JWT解码JWT使用示例 什么是JWT? JWT(JSON Web Tokens)是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。JWT可以传递信息,这…...
数据结构练习题————(二叉树)——考前必备合集!
今天在牛客网和力扣上带来了数据结构中二叉树的进阶练习题 1.二叉搜索树与双向链表———二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 2.二叉树遍历————二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 3.二叉树的层序遍历————102. 二叉树的层序遍历 - 力扣&am…...
一天认识一个硬件之鼠标
今天来给大家分享一下鼠标的相关内容,先来分享一下什么是鼠标: 鼠标是一种计算机输入设备,用于控制屏幕上的光标移动和进行各种操作。它最早由道格拉斯恩格尔巴特在1963年发明,并在1968年12月9日制成了世界上第一个鼠标。介绍完了…...
Django 请求配置
http请求配置 请求流程 urls.py配置 from first_app import viewsurlpatterns [path(admin/, admin.site.urls),path(test/,views.first_test), ] views.py配置 from django.shortcuts import render,HttpResponse# Create your views here. def first_test(request):prin…...
轮播图组件更加完善版
依然是基于微博语法开发,使用时请注意标签替换 优化了滑动的效果,默认的索引,滑动距离等, 使用方式和以前一样没变,主要修改了组件内部 <template><wbx-view class"" style"width: 100vw;heig…...
cpu路、核、线程
路:主板插口实际插入的 CPU 个数,也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如,一台服务器可能有2路或4路插槽,这意味着它最多可以安装2个或4个物理处理器。 核:单块 CPU 上面能…...
鸿蒙开发(NEXT/API 12)【硬件(注册出行业务事件监听)】车载系统
注册出行业务事件监听,用于接收业务发送事件的通知。 接口说明 接口名描述[on] (type: ‘smartMobilityEvent’, smartMobilityTypes: SmartMobilityType[],callback: Callback): void应用注册出行业务事件监听。 开发步骤 导入Car Kit模块。 import { smartMobi…...
安卓中有main函数吗?
在标准的Android应用程序开发中,并不直接使用类似于传统Java或C程序中的main函数入口点。Android应用程序是基于组件的架构,它依赖于几个关键组件来执行不同的任务,这些组件包括Activity、Service、Broadcast Receiver和Content Provider。 …...
js-17-对数组、对象进行浅拷贝和深拷贝
目录 数组一、浅拷贝1. 展开运算符...2. Array.prototype.slice() 二、深拷贝1. JSON方法2. 递归函数 对象一、浅拷贝1. Object.assign()2. 展开运算符... 二、深拷贝1. JSON方法2. 递归函数 自己总结的一些方法,可能有不到位的地方,欢迎指出 数组 一、…...
Ubuntu24.04中安装Electron
1. 安装Nodejs 使用代理服务从github下载并执行Nodejs安装脚本(假设代理服务器为192.168.2.150:10792) curl -x 192.168.2.150:10792 -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash #注意,Nodejs官网的安装命令少了下面这一行: …...
CPU中也应用到了缓存:CPU3层高速缓存,以及它的缓存一致性问题、MESI协议和Java的一些应用
为什么需要cpu高速缓存? 缓存,一般是为了用来协调两端的数据传输效率差(也可以归纳为性能差),提升响应速度。那么CPU的高速缓存是用来协调什么之间的速度差呢? CPU在处理一条指令的时候,会读写…...
如何使用开发者工具捕获鼠标右键点击事件
要使用浏览器的开发者工具捕获鼠标右键点击事件,请按照以下步骤操作: 打开开发者工具 在大多数浏览器中,您可以按 F12 键或右键单击页面并选择"检查"或"检查元素"。 切换到 Console 标签页 在开发者工具中,找到并点击 “Console” 标签。 添加事件监听器…...
【几何】个人练习-Leetcode-1453. Maximum Number of Darts Inside of a Circular Dartboard
题目链接:https://leetcode.cn/problems/maximum-number-of-darts-inside-of-a-circular-dartboard/description/ 题目大意:给出一系列点和一个圆的半径,(寻找一个圆心)求这个半径的圆最多能覆盖多少个点。 思路&…...
啤酒:从饮品到文化的演变
在人类饮品的长河中,啤酒以其不同的魅力走过了一段漫长的历史旅程。它不仅仅是一种简单的饮品,更是一种文化的象征,一种生活的态度。今天,我们将一起追溯啤酒从单一的饮品到丰富文化的演变过程,并感受Fendi Club精酿啤…...
Java 中 Map 常用类和数据结构详解
1. 引言 在Java编程中,Map是一种重要的数据结构,广泛应用于各种场景,Map实现了键值对(key-value)的存储方式,使得开发者能够快速检索、更新和操作数据。本篇文章将详细讲解Java中常用的Map类及其底层数据结…...
实时监控,动态调整 —— 淘宝商品详情API助力商家实现灵活经营
在讨论实时监控和动态调整的策略时,虽然我不能直接提供淘宝商品详情API的具体代码(因为这通常涉及商业机密和API密钥等敏感信息),但我可以给出一个概念性的示例,说明如何使用这类API来辅助商家实现灵活经营。 概念性示…...
WebGL常用接口和事件
目录 初始化WebGL上下文清除缓冲区缓冲区对象着色器和程序属性指针渲染事件监听错误处理纹理映射...
Golang | Leetcode Golang题解之第429题N叉树的层序遍历
题目: 题解: func levelOrder(root *Node) (ans [][]int) {if root nil {return}q : []*Node{root}for q ! nil {level : []int{}tmp : qq nilfor _, node : range tmp {level append(level, node.Val)q append(q, node.Children...)}ans append(a…...
数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式
数据库的全透明加密和半透明加密主要是针对数据存储安全的不同处理方式。 全透明加密(也称作无损加密或自动加密)就像是给文字戴上了一层无形的面具。在用户看来,他们在数据库中输入的是明文(比如姓名、密码)…...
MySQL的登录、访问、退出
一、登录: 访问MySQL服务器对应的命令:mysql.exe ,位置:C:\Program Files\MySQL\MySQL Server 8.0\bin (mysql.exe需要带参数执行,所以直接在图形界面下执行该命令会自动结束) 执行mysql.exe命令的时候出…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
