JWT知识点
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于token的认证和传统的session认证的区别
传统的session认证
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.
基于session认证所显露的问题
Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
基于token的鉴权机制
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。
流程上是这样的:
• 用户使用用户名密码来请求服务器
• 服务器进行验证用户的信息
• 服务器通过验证发送给用户一个token
• 客户端存储token,并在每次请求时附送上这个token值
• 服务端验证token值,并返回数据
这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了*Access-Control-Allow-Origin: 。
JWT的组成:
JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。
在这里插入代码片
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
header
jwt的头部承载两部分信息:
• 声明类型,这里是jwt
• 声明加密的算法 通常直接使用 HMAC SHA256
playload
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分
• 标准中注册的声明
• 公共的声明
• 私有的声明
signature
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
• header (base64后的)
• payload (base64后的)
• secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
将这三部分用.连接成一个完整的字符串,构成了最终的jwt:
在这里插入代码片
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
优点
• 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
• 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
• 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
• 它不需要在服务端保存会话信息, 所以它易于应用的扩展
安全相关
• 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
• 保护好secret私钥,该私钥非常重要。
• 如果可以,请使用https协议
如何应用
一:导入依赖
<!--实现方式一:java-jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.11.0</version></dependency><!--实现方式二:jjwt--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version></dependency>
实现方式一:JWT的测试类
package comzuxia;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Calendar;@SpringBootTest
class JwrloginApplicationTests {//HMAC256是摘要算法,跟md5类似,只是这个歌HMAC256需要制定key而已(salt盐)String key="pgg123456";/*** 测试java-jwt生成token字符串*/@Testpublic void testGenerateToken(){Calendar calendar=Calendar.getInstance();calendar.add(Calendar.SECOND,60);//设置过期时间JWTCreator.Builder builder = JWT.create()//payload的内容,由一个个的claim组成.withClaim("userId", 123).withClaim("userName", "Java").withClaim("url", "http://www.roadjava.com").withExpiresAt(calendar.getTime());String token = builder.sign(Algorithm.HMAC256(key));//设置签名,参数为加密算法,算法的参数:key(salt盐)System.out.println(token);}
实现方式二:JJWT的测试类
package comzuxia;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;@SpringBootTest
class JJWTTest {//HMAC256是摘要算法,跟md5类似,只是这个歌HMAC256需要制定key而已(salt盐)String key="pgg123456";/*** 测试java-jwt生成token字符串*/@Testpublic void testGenerateToken(){//过期时间Calendar calendar=Calendar.getInstance();calendar.add(Calendar.SECOND,60*60);//设置过期时间//创建payload的私有声明,(根据业务需要添加)Map<String,Object> claims=new HashMap<>();claims.put("userId", 123);claims.put("userName", "Java");claims.put("url", "http://www.roadjava.com");JwtBuilder builder = Jwts.builder()//payload的内容,由一个个的claim组成.setClaims(claims).setExpiration(calendar.getTime())//设置签名使用的签名算法和签名使用的秘钥.signWith(SignatureAlgorithm.HS256,key);String compact = builder.compact();System.out.println(compact);}/*** 校验*/@Testpublic void testVerigy(){String token="eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6IkphdmEiLCJleHAiOjE2MzcyMjk1NzIsInVzZXJJZCI6MTIzLCJ1cmwiOiJodHRwOi8vd3d3LnJvYWRqYXZhLmNvbSJ9.5i1cXxMQdCBWtNDtwH1M69XbHX3EWpOqQUnmTGwExZo";Claims claims=Jwts.parser()//得到DefaultJwtParser.setSigningKey(key) //设置签名的秘钥.parseClaimsJws(token).getBody();//设置需要解析的jwtInteger userid= claims.get("userid",Integer.class);String userName=claims.get("userName",String.class);String url=claims.get("url",String.class);System.out.println("userid:"+userid);System.out.println("userName:"+userName);System.out.println("url:"+url);}
}
二:编写工具类
JWT的工具类
package comzuxia.util;import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import comzuxia.bean.UserInfo;
import java.util.Calendar;/*** jwt实现的方式*/
public class JwtUtil {//设置盐private static final String KEY="1234fdsaf";//方法一:用jwt生成token的方法public static String generateToken(UserInfo userInfo) {Calendar calendar=Calendar.getInstance();calendar.add(Calendar.SECOND,60);//设置过期时间JWTCreator.Builder builder = JWT.create()//payload的内容,由一个个的claim组成.withClaim("userInfo", JSON.toJSONString(userInfo)).withExpiresAt(calendar.getTime());String token = builder.sign(Algorithm.HMAC256(KEY));//设置签名,参数为加密算法,算法的参数:key(salt盐)return token;}//检验public static DecodedJWT verify(String tokenToBeVerify){DecodedJWT verify=null;try {verify = JWT.require(Algorithm.HMAC256(KEY)).build().verify(tokenToBeVerify);}catch ( Exception e){e.printStackTrace();System.out.println("出异常了");}return verify;}//解析为实体对象public static UserInfo parse(DecodedJWT decodedJWT){Claim claim = decodedJWT.getClaim("userInfo");if(claim!=null){String userString=claim.asString();UserInfo userInfo=JSON.parseObject(userString,UserInfo.class);return userInfo;}return null;}
}
JJWT的工具类
在这里插入代码片
实体类
package comzuxia.bean;public class UserInfo {private Integer id;private String name;private String address;public UserInfo() {}public UserInfo(Integer id, String name, String address) {this.id = id;this.name = name;this.address = address;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}相关文章:
JWT知识点
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提…...
UDP接收报文函数recvfrom和UDP发送报文函数sendto
#include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); sockfd、buff 和 nbytes 是前三个参数。sockfd 是本地创建的套接字描述符,buff 指向本地的缓存,nbyt…...
Redisson 分布式锁实战应用解析
文章目录 前言一、Redisson介绍二、Redisson的使用1.1 引入依赖1.2 编写配置1.3 示例测试_011.4 示例测试_02 三、Redisson源码分析2.1 加锁源码2.2 看门狗机制 前言 分布式锁主要是解决分布式系统下数据一致性的问题。在单机的环境下,应用是在同一进程下的&#x…...
【机器学习】对比学习(contrastive learning)
对比学习是一种机器学习技术,算法学习区分相似和不相似的数据点。对比学习的目标是学习数据的表示,以捕捉不同数据点之间的基本结构和关系。 在对比学习中,算法被训练最大化相似数据点之间的相似度,并最小化不相似数据点之间的相似…...
开源和闭源的优劣势比较
开源与闭源软件之争一直是技术领域一个备受关注的话题,而在近期特斯拉CEO马斯克的表态中,关于开源的讨论更是引发了广泛的关注。以下是一些关于开源和闭源的优劣势以及对未来大模型发展的一些见解: 开源软件的优势: 创新与合作&a…...
html手势密码解锁插件(附源码)
文章目录 1.设计来源1.1 界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134534785 html手势密码解锁插件(附源码),仿手机手势密码,拖动九…...
Jetson JetPack-5.1.2-L4T-R35.4.1 修复deskew algorithm的问题
1. 前言 官方Orin Nano开发套件 版本: JetPack 5.1.2 2. 问题描述 使用的是带有Orin Nano EVK的GMSL相机,但我无法看到MIPI帧。 这里是媒体设备信息: Media controller API version 5.10.120Media device information ------------------------ driver tegra-…...
Doris的分区表和分桶表
1 列定义 以AGGREGATE KEY数据模型为例进行说明。更多数据模型参阅Doris数据模型。 列的基本类型,可以通过在mysql-client中执行HELP CREATE TABLE; 查看。 AGGREGATE KEY数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为Key列。而其余则为Value列。 定义…...
华为HCIE技术(HCIP、HCIE)汇总
我所在的岗位是网络运维,路由与交换用的比较多,外网技术比较少。所以把经常用的写的比较详细。大家多多包涵。 理论部分 网络基础:ISO网络七层模型 交换机部分 首次Console口登陆配置Telnet访问 VLAN VLAN的介绍、单交换机vlan划分实验…...
React结合antd5实现整个表格编辑
通过react hooks 结合antd的table实现整个表格新增编辑。 引入组件依赖 import React, { useState } from react; import { Table, InputNumber, Button, Space, Input } from antd;定义数据 const originData [{ key: 1, name: 白银会员, value: 0, equity: 0, reward: 0…...
【C++进阶之路】第八篇:智能指针
文章目录 一、为什么需要智能指针?二、内存泄漏1.什么是内存泄漏,内存泄漏的危害2.内存泄漏分类(了解)3.如何检测内存泄漏(了解)4.如何避免内存泄漏 三、智能指针的使用及原理1.RAII2.智能指针的原理3.std:…...
保护服务器免受攻击:解析攻击情境与解决之道
在数字化时代,服务器安全问题日益突出,因为它们是企业和个人网络活动的核心。服务器被攻击可能引发一系列问题,理解攻击的不同情境以及采取相应的解决方法变得至关重要。 DDoS 攻击(分布式拒绝服务攻击) 情境ÿ…...
Python 获取两个数组中各个坐标点对之间最短的欧氏距离
Python 获取两个数组中各个坐标点对之间最短的欧氏距离 代码如下: import numpy as np from scipy import spatialxy1 = np.array([[243, 3173],[525, 2997]]...
假ArrayList导致的线上事故......
假ArrayList导致的线上事故… 线上事故回顾 晚饭时,当我正沉迷于排骨煲肉质鲜嫩,汤汁浓郁时,产研沟通群内发出一条消息,显示用户存在可用劵,但进去劵列表却什么也没有,并附含了一个视频。于是我一边吃了排…...
K8S精进之路-控制器Deployment-(1)
在K8S中,最小运行单位为POD,它是一个逻辑概念,其实是一组共享了某些资源的容器组。POD是能运行多个容器的,Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume。在POD中能够hold住网络…...
flutter iOS 视频mov格式转MP4格式
flutter iOS 视频mov格式转MP4格式 前言一、使用video_compress压缩视频总结 前言 今天在写项目的时候,突然发现iOS 里面的有些视频格式是mov的格式,这就导致在视频播放组件无法播放的问题,期间试过替换视频格式,但是又不想存储文…...
datafilecopy header validation failure for file +DATA/orcl/datafile/file1.ora
环境 linux 6.8 oracle 11.2.0.4 rac 未打补丁 现象: 数据库日志中显示 datafilecopy header validation failure for file DATA/orcl/datafile/file1.ora原因 用rman的backup as copy 对数据文件进行了copy或者叫位置更改时候,在sqlplus中对文件名进行…...
[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应
目录 前言: 一、道家的核心思想 二、恒者恒强,弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言: 马太效应和强弱互转的道家思想,都反应了自然规律和社会规律&…...
CentOS用nginx搭建文件下载服务器
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动。在工作中,我们经常会用到需要搭建文件服务器的情况,这里就以在linux下搭…...
Ubuntu下载离线安装包
旧版Ubuntu下载地址 https://old-releases.ubuntu.com/releases/ 下载离线包 sudo apt-get --download-only -odir::cache/ncayu install net-tools下载snmp离线安装包 sudo apt-get --download-only -odir::cache/root/snmp install snmp snmpd snmp-mibs-downloadersudo a…...
LogCabin数据模型揭秘:Tree结构在分布式存储中的应用
LogCabin数据模型揭秘:Tree结构在分布式存储中的应用 【免费下载链接】logcabin LogCabin is a distributed storage system built on Raft that provides a small amount of highly replicated, consistent storage. It is a reliable place for other distributed…...
ResearchClawBench:AI科研能力基准测试实战部署与评估指南
1. 项目概述:一个重新定义AI科研能力的基准测试 如果你和我一样,长期关注AI在科研自动化领域的发展,那你一定见过不少“AI科学家”的演示。它们能写代码、能画图、甚至能生成看起来像模像样的论文草稿。但一个核心问题始终悬而未决ÿ…...
库早报|刚刚,陕西3D打印公司完成A+轮融资;飞熊八喷头FDM即将众筹;欧洲法院驳回Stratasys对拓竹H2C禁令申请
2026年5月7日 星期四 01 固相增材企业陕西智拓完成A轮融资 天眼查APP显示,陕西智拓固相增材制造技术有限公司完成A轮融资,融资额未披露,陕西金资、陕西科技创投等机构参投。 公司成立于2016年9月,专注扩散焊固相增材制造技术&am…...
Mac上IDEA里Maven deploy总报401?别急,先检查这两个配置文件是否‘对暗号’
Mac上IDEA里Maven deploy报401?可能是配置文件没"对暗号" 作为Java开发者,在Mac上使用IntelliJ IDEA进行Maven部署时遇到401错误,就像拿着正确的钥匙却打不开门一样令人沮丧。这个错误通常意味着认证失败,但问题往往不在…...
StreamFX架构深度解析:现代OBS插件框架设计与技术实现
StreamFX架构深度解析:现代OBS插件框架设计与技术实现 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custo…...
掌握中兴光猫高级管理:专业级Telnet权限获取实现指南
掌握中兴光猫高级管理:专业级Telnet权限获取实现指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫设备的高级网络管理权限获取一直是技术爱好者和网络管理员关注…...
浏览器扩展开发实战:构建原生思维辅助工具的技术架构与实现
1. 项目概述:一个面向原生思维模式的浏览器扩展最近在折腾一个挺有意思的东西,一个叫NativeMindBrowser/NativeMindExtension的项目。光看这个名字,可能有点抽象,但它的核心想法其实非常直接:打造一个能深度融入你“原…...
前端传19位雪花ID给后端,为啥总查不到数据?手把手教你用Jackson搞定JS精度丢失
19位雪花ID在前端传递中的精度陷阱:从原理到解决方案的完整指南 最近在前后端分离项目中遇到一个诡异的问题:前端通过API传递的19位雪花ID,到了后端却总是查不到对应数据。经过排查发现,这背后隐藏着JavaScript数值精度限制的经典…...
CES深度复盘:硬件创新趋势与半导体技术洞察
1. 从硬件回归到趋势洞察:一场CES展的深度复盘 又一年CES落幕,拉斯维加斯的喧嚣逐渐散去,展台上的炫目灯光熄灭,但留给行业的思考才刚刚开始。每年一月的这场科技盛会,早已超越了单纯的新品发布会范畴,它更…...
淘宝自动化脚本taojinbi:解放双手的智能任务管理方案
淘宝自动化脚本taojinbi:解放双手的智能任务管理方案 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 淘宝自…...
