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命令的时候出…...
Phi-3-mini-128k-instruct与智能车仿真:生成自然语言控制逻辑与调试报告
Phi-3-mini-128k-instruct与智能车仿真:生成自然语言控制逻辑与调试报告 最近在折腾一个智能车仿真项目,发现一个挺有意思的事儿:让AI来帮忙写控制逻辑和看报告,效率提升了不少。以前我们得手动把“绕过前面那个障碍物࿰…...
唯品会数据采集API接口||电商API数据采集
唯品会数据采集,优先走合规第三方 API(个人 / 企业均可);企业可申请官方开放平台 API(仅限合作方)。一、合规路径选择(必看)1. 官方开放平台(企业级)入口&…...
[特殊字符] Local Moondream2图文对话教程:详细步骤实现自定义问题提问
Local Moondream2图文对话教程:详细步骤实现自定义问题提问 1. 引言:让电脑拥有"眼睛"的智能工具 你是否曾经希望电脑能像人一样看懂图片,并且回答关于图片内容的问题?Local Moondream2就是这样一款神奇的工具&#x…...
零干扰聆听:铜钟音乐的极简主义开源解决方案
零干扰聆听:铜钟音乐的极简主义开源解决方案 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/ton…...
bert-base-chinese详细步骤:如何将test.py改造成支持流式文本处理的微服务
bert-base-chinese详细步骤:如何将test.py改造成支持流式文本处理的微服务 1. 项目背景与价值 在实际的工业场景中,我们经常需要处理大量的文本数据流。传统的批处理方式虽然简单,但无法满足实时性要求高的应用场景。比如智能客服系统需要实…...
Kronos金融市场基础模型:从技术原理到量化交易系统构建
Kronos金融市场基础模型:从技术原理到量化交易系统构建 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 金融市场的复杂性和波动性一直是投资者…...
荣耀XD21路由器IPTV设置指南:不用VLAN交换机实现单线复用
荣耀XD21路由器单线复用实战:无需VLAN交换机实现IPTV与网络并行传输 客厅弱电箱仅预留单根网线却需要同时承载IPTV和无线网络信号——这是许多家庭网络改造中遇到的典型难题。传统方案往往依赖价格不菲的VLAN交换机实现单线复用,但通过荣耀XD21路由器的隐…...
Ubuntu下基于simple-rtsp-server构建轻量级实时视频流媒体服务
1. 为什么选择simple-rtsp-server搭建流媒体服务 最近在给公司搭建内部监控系统时,我对比了市面上七八种RTSP服务器方案,最终选择了simple-rtsp-server。这个用纯C语言编写的轻量级服务器,编译后二进制文件只有几百KB,但性能却出乎…...
2026 年 OpenClaw 生态选型指南:从「红色龙虾」到国产「小龙虾」
2026 年初,一只名为 OpenClaw 的「红色龙虾」长期占据 GitHub 热度前列,星标在公开页面上已达到 三十万量级(具体数字每日波动)。业界常把它描述为 AI 从「只会聊」走向「能替你办事」的一块试金石:不是多一个聊天窗口…...
Kafka Connect集群管理可视化界面:高效实现多环境连接器配置实战指南
Kafka Connect集群管理可视化界面:高效实现多环境连接器配置实战指南 【免费下载链接】kafka-connect-ui Web tool for Kafka Connect | 项目地址: https://gitcode.com/gh_mirrors/ka/kafka-connect-ui 在Kafka生态系统中,连接器管理一直是数据…...
