JWT是什么?它有什么用?

1. 什么是 JWT?

JWT是 JSON Web Token 的缩写,通过数字签名的方式,以 JSON 对象为载体,在不同的服务器终端之间安全传输的信息。

2. JWT 有什么用?

JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含 JWT,系统在每次处理用户请求之前,都先进行 JWT 安全效验,通过之后再进行处理。
JWT 就像是一个令牌,当我们去到一个公司,这个公司先回效验你的身份,效验成功后就会给你发一个身份卡,以后再见面,看见你的身份卡就知道你是这个公司的人了,就不需要再对你的身份进行认证了,上方的例子就是对 JWT 的简单解释。

3. JWT 的组成形式

JWT 主要是由三大部分组成:

3.1 Header

第一部分是头部分,一个是类型,一个是算法的名称;再通过 base64 编码进行编排

{'typ': 'JWT','alg': 'HS256'
}

3.2 Payload

第二部分是载荷,这里存储的就是有效信息的地方,这个部分又分为三个区域
1.标准中注册的声明

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

在这里插入图片描述

2.公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密
3.私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64 是对称解密的,意味着该部分信息可以归类为明文信息。

3.3 Signature

这个签名是:

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var = signature = HMACSH256(encodedString,'secret';)

下面就是 JWT 的三部分
xxxxx.yyyyy.zzzz
x部分:由 Header 进行 base64编码生成
y部分:由 Payload base64编码生成
z部分:由 base64编码 Header + '.' + base64编码 Payload,再将前面的字符串使用 header 头中的算法加密生成。

4. 代码实现

4.1 生成 JWT 代码:

在创建 JwtBuilder 时,我们可以选择不创建头,当它判断 header 为空时,它会设置一个默认头,调用compact()方法的作用就是,他会将 JWT 的三部分拼接起来,拼接成xxxx.yyyy.zzzz 的形式

//有效期为public static final Long JWT_TTL = 24*60 * 60 *1000L;// 60 * 60 *1000  一个小时//设置秘钥明文public static final String JWT_KEY = "sangeng";/*** 生成jtw* @param subject token中要存放的数据(json格式)* @param ttlMillis token超时时间* @return*/public static String createJWT(String subject, Long ttlMillis) {JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间return builder.compact();}private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;SecretKey secretKey = generalKey();long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);if(ttlMillis==null){ttlMillis=JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis);return Jwts.builder().setId(uuid)              //唯一的ID.setSubject(subject)   // 主题  可以是JSON数据.setIssuer("zzq")     // 签发者.setIssuedAt(now)      // 签发时间.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥.setExpiration(expDate);}/*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}

4.2解析

我们解析出来的 Claims 对象就是之前 存入的值,我再调用对象的getSubject()方法就可以得到我们原来所存储的值了。

    /*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}/*** 解析** @param jwt* @return* @throws Exception*/public static Claims parseJWT(String jwt) throws Exception {SecretKey secretKey = generalKey();return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}

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

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

相关文章

[已解决] Ubuntu远程桌面闪退+登录显示“远程桌面由于数据加密错误 , 这个会话将结束“

两个月前,由于跑代码在Ubuntu配置环境,乱七八糟的下载了很多东西,导致了一系列问题..... 问题1 Ubuntu远程桌面闪退 实验室有两台服务器,IP后三位分别为141和142,其中141在输入密码后立即闪退,142可以正常…

【Vue新手必看】ElementUI表单实战教程,轻松掌握!

ElementUI表单 el的表单官网内容很多&#xff0c;看了一眼觉得心累了。但实际上它使用起来非常的方便,el为我们封装了各种组件&#xff0c;样式也大众。 一个简单的案例 代码如下&#xff08;使用时确保引入了相关的组件&#xff09; <template> <el-form ref"…

麒麟信安日志轮询分割操作说明

1、背景介绍 由于模块上面硬盘容量有限&#xff0c;需要定时清理系统日志。为了方便用户使用&#xff0c;在系统中设定自动日志轮询操作&#xff0c;让日志占用容量由操作系统自动管理&#xff0c;用户无需担心日志太多把硬盘容量占满。 2、操作说明 新建需要分割的日志logr…

2024应届大学生,为云计算高薪岗位做好准备了吗?

云计算正处于快速发展阶段&#xff0c;对于企业和个人来说&#xff0c;云计算提供了方便、灵活和智能的解决方案&#xff0c;对各行各业都有着重要的影响和推动作用。 随着云计算新市场、新业务、新应用的不断出现&#xff0c;人力需求迅猛。国家相继出台一系列政策大力扶持云…

UG通过曲线组

通过曲线组&#xff08;放样&#xff09; 通过至少两个截面之间放样生产实体或曲面 截面可以是开放或封闭的曲线或体的边 放样规则&#xff1a; 1、截面顺序不能颠倒 2、截面方向必须一致&#xff0c;注意鼠标选择的位置 3、截面节点必须对应&#xff0c;必要时打断图形 …

HackTheBox - Medium - Linux - Jupiter

Jupiter Jupiter 是一台中等难度的 Linux 机器&#xff0c;它有一个使用 PostgreSQL 数据库的 Grafana 实例&#xff0c;该数据库在权限上过度扩展&#xff0c;容易受到 SQL 注入的影响&#xff0c;因此容易受到远程代码执行的影响。一旦站稳脚跟&#xff0c;就会注意到一个名…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation&#xff08;收费的虚拟机&#xff09; 下载vbox 网址&#xff1a;Oracle VM VirtualBox&#xff08;免费的虚拟机&#xff09; 以下选择一个下载即可&#xff0c;建议下载vbox&#xff0c;因为是免费的。安装的时候默认下一步即可&#xff08;路径最好…

【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)

深度解析OAuth2.0协议的原理和流程框架实现指南 背景介绍OAuth1.0协议访问令牌案例分析 OAuth2.0OAuth2.0与OAuth1.0 OAuth2.0协议体系的Roles角色OAuth定义了四个角色资源所有者资源服务器客户端授权服务器 传统的客户机-服务器身份验证模型的问题协议流程 认证授权类型授权码…

14 Vue3中使用v-model绑定输入框

概述 v-model用于实现双向数据绑定&#xff0c;使用v-model绑定输入框是Vue3中最常见的用法之一。 比如&#xff0c;在制作登录界面的时候&#xff0c;我们会使用v-model绑定用户名和密码&#xff0c;这里的用户名和密码都是输入框。 基本用法 我们创建src/components/Demo…

80x86汇编—指令系统

文章目录 MOV非法传送 XCHGXLAT堆栈指令 push 和 pop标志寄存器指令运算指令控制转移类指令&#xff08;重点&#xff09;条件转移指令 顺序是按照我们老师教的顺序&#xff0c;仅仅作为复习笔记。 汇编入门真的简单&#xff0c;深入难&#xff0c;毕竟学过计组CPU都只寄组的难…

华为安防监控摄像头

华为政企42 华为政企 目录 上一篇华为政企城市一张网研究报告下一篇华为全屋wifi6蜂鸟套装标准

电商数据之巅:挖掘无限价值的蓝海

在数字时代的大潮中&#xff0c;数据已成为新的黄金和石油&#xff0c;尤其在电商领域。电商平台每天都在产生海量的数据&#xff0c;这些数据不仅是对消费者行为的记录&#xff0c;更是隐藏着无限的商机和价值。本文将带你走进电商数据的神奇世界&#xff0c;探寻其无尽可能的…