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.mzph.cn/news/240662.shtml

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

相关文章

系列八、VMWare无法启动CentOS7问题排查 解决

一、VMWare无法启动CentOS7 1.1、问题描述 今天在测试代码的时候,需要用到Linux,然后就打开VMWare进行启动,但是启动的时候发现无法启动起来,报了一个如下的错误: 出现了问题那就要解决问题,然后想起来前几…

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者:索增增(小红书)、宋泽辉(小红书)、张佐玮(阿里云) 背景介绍 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,目前已经支持了 K8s…

【数据结构】线段树算法总结(单点修改)

知识概览 用作单点修改的线段树有4个操作: pushup:由子节点的信息计算父节点的信息build:初始化一棵树modify:修改一个区间query:查询一个区间 线段树用一维数组来存储: 编号是x的节点,它的父节…

Redis vs Memcached 哪一个更适合你的应用程序?

介绍 Redis和Memcached都是流行的内存缓存解决方案。它们都可以提高应用程序的性能,但它们之间有一些重要的区别。在本文中,我们将比较Redis和Memcached,并讨论哪一个更适合你的应用程序。 Redis Redis是一个开源的内存数据结构存储系统。…

hive中array相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址: hive官网函数大全地址 Return TypeNameDescriptionarrayarray(value1, value2, …)Creates an array with the given elements.booleanarray_contains(Array, value)Returns TRUE if the a…

【MySQL工具】pt-online-schema-change源码分析

通过阅读源码 更加深入了解原理,以及如何进行全量数据同步,如何使用触发器来同步变更期间的原表的数据更改。(^-^)V 目录 源码分析 Get configuration information. Connect to MySQL. Create --plugin. Setup la…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好,但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite + Vue3 + TS + ElementUI(plus) + .NET Framework 4.7.2…

166. 数独(DFS之剪枝与优化:位运算优化,优化搜索顺序,.可行性剪枝)

166. 数独 - AcWing题库 数独 是一种传统益智游戏,你需要把一个99 的数独补充完整,使得数独中每行、每列、每个 33 的九宫格内数字 1∼9 均恰好出现一次。 请编写一个程序填写数独。 输入格式 输入包含多组测试用例。 每个测试用例占一行&#xff0…

[管理者与领导者-129]:很多人对高情商的误解,工程师要扩展自己的情商吗?工程师如何扩展自己的情商?

目录 前言: 一、什么是高情商? 1.1 什么是高情商 1.2 情商的五大能力 1.3 高情商的层次 1.4 对高情商的误解? 二、工程师需要发展自己的高情商吗? 三、工程师如何扩展自己的情商? 四、什么样的“高情商”的管理者令人讨…

ZZ014城市轨道交通运营与维护赛题第7套

ZZ014城市轨道交通运营与维护赛题第7套 模块1赛题 模块序号 模块1 对应赛项编号 ZZ014 模块名称 城市轨道交通运营服务 子任务数量 12 竞赛时间 60分钟 任务描述 行车组织作业、票务设备故障处置以及突发事件应急处理 职业要素 R基本专业素养 R专业实践技能 R协…

.a库介绍和编译案例

.a库的介绍 库的名字一般是libxxxx.a,利用静态函数库编译成的文件比较大,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件,对应的链接方式为静态链接。静态库的代码在编译时链接到应用程序中,因…

基于Mybatis-Plus进行查询封装

基于Mybatis-Plus进行查询封装 package com.test.common.orm.builder;import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.cache.Cache; import org.apache.ibatis.cache.impl.PerpetualCach…

前端 JS 安全对抗原理与实践

作者:vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的,为了提高代码的破解成本、保证JS代码里的一些重要逻辑不被居心叵测的人利用,需要使用一些加密和混淆的防护手段。 一、概念解析 1.1 什么是接口加密 如今这个时代,…

高德地图逆地理编码踩坑日志

本人是一枚Java小白,公司项目中用到根据经纬度反查该地址中文信息的场景,因为一开始调用的经纬度是能反查出区域编码的,以为towncode都是String返回结果,如下图: 没想到当没有名字任何一个城市区域的时候,…

管理 Jenkins 详细指南

目录 系统配置 安全 状态信息 故障 排除 工具和操作 系统配置 系统,配置全局设置和路径,端口更改,下载地址等。 工具,配置工具、其位置和自动安装程序。 插件,添加、删除、禁用或启用可以扩展 Jenkins 功能的插…

华为OD机试 - 精准核酸检测(Java JS Python C)

题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹交叉。 现在给定一组确诊人员编号(X1,X2,X3,...,Xn),在所有人当中,找出哪些…

ssh远程管理服务

什么是ssh SSH是一种加密的网络协议,用于在不安全的网络中安全地传输数据。它允许用户通过一个安全的通道连接到远程计算机,并在该通道上执行各种网络服务,例如远程登录和文件传输。 SSH使用公钥加密技术来验证远程计算机的身份,并…

初识Stable Diffusion

界面选项解读 这是在趋动云上部署的Stable Diffusion txt2img prompt (1)分割符号:使用逗号 , 用于分割词缀,且有一定权重排序功能,逗号前权重高,逗号后权重低 (2)建议的通用范式…

【C++11特性篇】玩转C++11中的包装器(function&bind)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.为什么需要包装器function&#xff…

【Earth Engine】协同Sentinel-1/2使用随机森林回归实现高分辨率相对财富(贫困)制图

目录 1 简介与摘要2 思路3 效果预览4 代码思路5 完整代码6 后记 1 简介与摘要 最近在做一些课题,需要使用Sentinel-1/2进行机器学习制图。 然后想着总结一下相关数据和方法,就花半小时写了个代码。 然后再花半小时写下这篇博客记录一下。 因为基于多次拍…