当前位置: 首页 > news >正文

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的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO&#xff09;场景。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 是本地创建的套接字描述符&#xff0c;buff 指向本地的缓存&#xff0c;nbyt…...

Redisson 分布式锁实战应用解析

文章目录 前言一、Redisson介绍二、Redisson的使用1.1 引入依赖1.2 编写配置1.3 示例测试_011.4 示例测试_02 三、Redisson源码分析2.1 加锁源码2.2 看门狗机制 前言 分布式锁主要是解决分布式系统下数据一致性的问题。在单机的环境下&#xff0c;应用是在同一进程下的&#x…...

【机器学习】对比学习(contrastive learning)

对比学习是一种机器学习技术&#xff0c;算法学习区分相似和不相似的数据点。对比学习的目标是学习数据的表示&#xff0c;以捕捉不同数据点之间的基本结构和关系。 在对比学习中&#xff0c;算法被训练最大化相似数据点之间的相似度&#xff0c;并最小化不相似数据点之间的相似…...

开源和闭源的优劣势比较

开源与闭源软件之争一直是技术领域一个备受关注的话题&#xff0c;而在近期特斯拉CEO马斯克的表态中&#xff0c;关于开源的讨论更是引发了广泛的关注。以下是一些关于开源和闭源的优劣势以及对未来大模型发展的一些见解&#xff1a; 开源软件的优势&#xff1a; 创新与合作&a…...

html手势密码解锁插件(附源码)

文章目录 1.设计来源1.1 界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134534785 html手势密码解锁插件(附源码)&#xff0c;仿手机手势密码&#xff0c;拖动九…...

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)汇总

我所在的岗位是网络运维&#xff0c;路由与交换用的比较多&#xff0c;外网技术比较少。所以把经常用的写的比较详细。大家多多包涵。 理论部分 网络基础&#xff1a;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++进阶之路】第八篇:智能指针

文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1.什么是内存泄漏&#xff0c;内存泄漏的危害2.内存泄漏分类&#xff08;了解&#xff09;3.如何检测内存泄漏&#xff08;了解&#xff09;4.如何避免内存泄漏 三、智能指针的使用及原理1.RAII2.智能指针的原理3.std:…...

保护服务器免受攻击:解析攻击情境与解决之道

在数字化时代&#xff0c;服务器安全问题日益突出&#xff0c;因为它们是企业和个人网络活动的核心。服务器被攻击可能引发一系列问题&#xff0c;理解攻击的不同情境以及采取相应的解决方法变得至关重要。 DDoS 攻击&#xff08;分布式拒绝服务攻击&#xff09; 情境&#xff…...

Python 获取两个数组中各个坐标点对之间最短的欧氏距离

Python 获取两个数组中各个坐标点对之间最短的欧氏距离 代码如下: import numpy as np from scipy import spatialxy1 = np.array([[243, 3173],[525, 2997]]...

假ArrayList导致的线上事故......

假ArrayList导致的线上事故… 线上事故回顾 晚饭时&#xff0c;当我正沉迷于排骨煲肉质鲜嫩&#xff0c;汤汁浓郁时&#xff0c;产研沟通群内发出一条消息&#xff0c;显示用户存在可用劵&#xff0c;但进去劵列表却什么也没有&#xff0c;并附含了一个视频。于是我一边吃了排…...

K8S精进之路-控制器Deployment-(1)

在K8S中&#xff0c;最小运行单位为POD,它是一个逻辑概念&#xff0c;其实是一组共享了某些资源的容器组。POD是能运行多个容器的&#xff0c;Pod 里的所有容器&#xff0c;共享的是同一个 Network Namespace&#xff0c;并且可以声明共享同一个 Volume。在POD中能够hold住网络…...

flutter iOS 视频mov格式转MP4格式

flutter iOS 视频mov格式转MP4格式 前言一、使用video_compress压缩视频总结 前言 今天在写项目的时候&#xff0c;突然发现iOS 里面的有些视频格式是mov的格式&#xff0c;这就导致在视频播放组件无法播放的问题&#xff0c;期间试过替换视频格式&#xff0c;但是又不想存储文…...

datafilecopy header validation failure for file +DATA/orcl/datafile/file1.ora

环境 linux 6.8 oracle 11.2.0.4 rac 未打补丁 现象&#xff1a; 数据库日志中显示 datafilecopy header validation failure for file DATA/orcl/datafile/file1.ora原因 用rman的backup as copy 对数据文件进行了copy或者叫位置更改时候&#xff0c;在sqlplus中对文件名进行…...

[机缘参悟-119] :一个IT人的反思:反者道之动;弱者,道之用 VS 恒者恒强,弱者恒弱的马太效应

目录 前言&#xff1a; 一、道家的核心思想 二、恒者恒强&#xff0c;弱者恒弱的马太效应 三、马太效应与道家思想的统一 3.1 大多数的理解 3.2 个人的理解 四、矛盾的对立统一 前言&#xff1a; 马太效应和强弱互转的道家思想&#xff0c;都反应了自然规律和社会规律&…...

CentOS用nginx搭建文件下载服务器

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动。在工作中&#xff0c;我们经常会用到需要搭建文件服务器的情况&#xff0c;这里就以在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…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...