【jwt】JWT原理,JWT是用来解决什么问题的,如何自定义生成JWT数据,并且实现jwt数据的解码

news2024/9/28 15:19:57

JWT: JSON Web Token

1. jwt概述

用户登录成功后,服务端 如何知道客户端的每次请求对应的是哪个用户呢?怎么做:目前有两种方式实现.

1.1. 一是通过sessionId的方式,登录成功后服务端返回sessionId给客户端,然后浏览器将sessionId保存在Cookie中,这样每次浏览器请求的时候都带上sessionId,通过sessionId就能在服务端找到对应的session,就能知道是哪个用户。 (session里记录了用户的相关信息,登录时间等)

1.2. 二是用户登录成功后,服务端根本就不存用户的session信息,用户登录成功后,服务端将用户的信息返回给客户端,客户端自己保存用户信息,然后每次客户端请求的时候,将用户信息传给服务端,这就是jwt的原理。

2. JWT 的原理

JWT 的原理是,服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。


{
  "name": "jack",
  "role": "admin",
  "id": 123456
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

3. jwt数据结构

jwt是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

类似这样的:

 

3.1 Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。


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

上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT

最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。

3.2 Payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。


{
  "sub": "1234567890",
  "username": "John Doe",
  "userId": 123654
}

注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。

这个 JSON 对象也要使用 Base64URL 算法转成字符串。

3.3 Signature

Signature 部分是对前两部分的签名,防止数据篡改。

首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。


HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

3.4 Base64URL

前面提到,Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+/=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-/替换成_ 。这就是 Base64URL 算法。

4、 使用 jwt 

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

类似这样,这些数据传输:

Authorization: Bearer <token>

5、 自定义实现jwt 

说了这么多,结下来我们自己来实现定义一个jwt数据的生成,jwt数据的解码工作,通过目前市面上开源的java-jwt jar包,还是很方便的


import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.gfm.asset.base.exception.InteractException;
import lombok.SneakyThrows;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author xxx 
 */
public class JwtHelper {
    private static final Logger logger = LoggerFactory.getLogger(JwtHelper.class);


    /**
     * 密钥加密token
     */
    @SneakyThrows
    public static String generateToken(String userKey, String secretKey, int expire) {
        Algorithm algorithm = Algorithm.HMAC256(secretKey);
        String token = JWT.create()
                .withIssuer(userKey)
                .withIssuedAt(new Date())
                .withExpiresAt(DateTime.now().plusSeconds(expire).toDate())
                .sign(algorithm);
        logger.info("==> 生成jwtToken, userKey={},secretKey={},过期时间={}s,token={}", userKey, secretKey, expire, token);
        return token;
    }

    /**
     * 公钥解析token
     */
    public static String parserToken(String token, String secretKey) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(secretKey);
            DecodedJWT jwt = JWT.require(algorithm)
                    .build().verify(token);
            return jwt.getIssuer();
        } catch (TokenExpiredException e) {
            throw new InteractException("token has expired");
        } catch (Exception e) {
            e.printStackTrace();
            throw new InteractException("token is invalid");
        }
    }

    public static void main(String[] args) { 
        String userKey = "center_sys";
        String secretKey = "center_sys@#$";
        String token = generateToken(userKey, secretKey, 60 * 60 * 24 * 7);
        System.out.println(token);
//        String key = parserToken(token, secretKey);
//        System.out.println(key);
    }


}

pom.xml文件

  <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.19.1</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

参考:

JSON Web Token 入门教程 - 阮一峰的网络日志

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

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

相关文章

【机器学习6】数据预处理(三)——处理类别数据(有序数据和标称数据)

处理类别数据 &#x1f331;简要理解处理类别数据的重要性☘️类别数据的分类☘️方便研究——用pandas创建包含多种特征的数据集&#x1f340;映射有序特征&#x1f340;标称特征标签编码&#x1f340;标称特征的独热编码&#x1f331;独热编码的优缺点 &#x1f331;简要理解…

爬虫逆向实战(八)--猿人学第十五题

一、数据接口分析 主页地址&#xff1a;猿人学第十五题 1、抓包 通过抓包可以发现数据接口是api/match/15 2、判断是否有加密参数 请求参数是否加密&#xff1f; 查看“载荷”模块可以发现有一个m加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cook…

Cat(3):客户端集成—简单案例

接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

生信豆芽菜-oncoPredict预测药物的敏感性

网址&#xff1a;http://www.sxdyc.com/drugOncoPredict 1、数据准备 准备一个行为基因&#xff0c;列为样本的表达谱矩阵即可 2、选择训练集数据库&#xff0c;提交等待运行成功即可 3、结果 当然&#xff0c;如果不清楚数据是什么样的&#xff0c;可以选择下载我们的示…

无涯教程-Perl - tell函数

描述 此函数返回指定FILEHANDLE中读取指针的当前位置(以字节为单位)。如果省略FILEHANDLE,则它将返回上次访问的文件中的位置。 语法 以下是此函数的简单语法- tell FILEHANDLEtell返回值 此函数以字节为单位返回当前文件位置。 例 以下是显示其基本用法的示例代码,要检…

RTSP/Onvif视频服务器EasyNVR视频监控汇聚平台的实际应用介绍

一、方案背景 在新时代的背景下&#xff0c;公安情报指挥体系建设需要在情报指挥中心为基础&#xff0c;以实现“情报全面精准、指挥集成统一、勤务协同高效、舆情管控有力”的目标。通过建设情指勤舆一体化指挥调度平台&#xff0c;将情报指挥中心打造成社会治安防控体系的核…

2023国考(地市级)判断推理

题目 黑白块 例题 例题 例题 例题

数据库的事务隔离级别(脏读、不可重复读、幻读)

并发事务问题 read uncommitted&#xff0c;存在脏读、不可重复度、幻读 read committed&#xff0c;存在不可重复读、幻读 repeatable read(默认)&#xff0c;存在幻读 serializable&#xff08;串行化&#xff0c;序列化&#xff09;&#xff0c;都不存在 前提&#xff1…

Android内存泄漏总结和性能优化技巧

我们在开发安卓应用时&#xff0c;性能优化是非常重要的方面。一方面&#xff0c;优化可以提高应用的响应速度、降低卡顿率和提升应用流畅度&#xff0c;从而提升用户体验&#xff1b;另一方面&#xff0c;优化也可以减少应用的资源占用&#xff0c;提高应用的稳定性和安全性&a…

ExcelServer Excel服务器的使用

Excel服务器的搭建 见 一步搭建Excel服务器 1、以EXCEL文件作为模板 1.1 利用excel易于使用的方式创建模板&#xff0c;并设置编辑&#xff0c;只读&#xff0c;函数等恪。 2、利用设置模板的权限 2.1 设置角色权限,允许哪些角色可以编辑 3、查看汇总的数据

java 设置JTable 不可编辑,但可以选择行。chatGPT就蒙了,最大的问题是哪些是自己想的,哪些有依据的及依据是什么。

这是对的。 tableModel new DefaultTableModel(new Object[]{"ID", "Name", "Type"}, 0){public boolean isCellEditable(int row, int column){return false;}};; 看看GPT的回答&#xff1a; 看似这个回事&#xff0c;但不对。 这个直接用中…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-BiGRU-Attention多变量时间序列预测&#xff0c;KOA-…

PS实现多个图片转化GIF动画

PS实现多个图片转化为GIF动画步骤 一、导入图片素材1.打开PS软件&#xff0c;点击 [文件] --- [脚本] ---[将文件载入堆栈]2.选择图片3.导入成功 二、打开时间轴1.点击[窗口]---[时间轴]2.选择创建帧动画3.创建帧动画 三、创建动画1.复制帧。2.设置帧的内容。3.修改图片停留的时…

JRebel插件扩展-mac版

前言 上一篇分享了mac开发环境的搭建&#xff0c;但是欠了博友几个优化的债&#xff0c;今天先还一个&#xff0c;那就是idea里jRebel插件的扩展。 一、场景回眸 这个如果在win环境那扩展是分分钟&#xff0c;一个exe文件点点就行。现在在mac环境就没有这样的dmg可以执行的&…

如何用Apipost实现sign签名?

我们平常对外的接口都会用到sign签名&#xff0c;对不同的用户提供不同的apikey ,这样可以提高接口请求的安全性&#xff0c;避免被人抓包后乱请求。 如何用Apipost实现sign签名&#xff1f; 可以在Apipost中通过预执行脚本调用内置的JS库去实现预执行脚本是在发送请求之前自…

(JAVA)事件

ActionListener public class Test3 {public static void main(String[] args){JFrame jFrame new JFrame();//设置界面的宽高jFrame.setSize(603,680);//设置界面标题jFrame.setTitle("事件演示");//设置界面置顶jFrame.setAlwaysOnTop(true);//设置界面居中jFram…

java初级算法(杨辉三角)

java初级算法&#xff08;杨辉三角&#xff09; java初级算法&#xff08;杨辉三角&#xff09;内容&#xff1a;思路解法&#xff1a;代码实现 学习时间&#xff1a;2023/08/16 java初级算法&#xff08;杨辉三角&#xff09; 每日一算法&#xff1a;杨辉三角 内容&#xff1a…

跨境外贸必看|海外版小红书“Pinterest”如何推广引流?

Pinterest是一个海外图片社交分享网站&#xff0c;Pinterest与国内小红书的营销方式非常相似&#xff0c;它允许我们定位特定的人群、兴趣甚至位置&#xff0c;借助庞大的用户群体和针对特定受众的能力&#xff0c;它成为外贸与跨境电商的推广营销利器&#xff0c;越来越多的跨…

在项目中如何解除idea和Git的绑定

在项目中如何解除idea和Git的绑定 1、点击File--->Settings...(CtrlAltS)--->Version Control--->Directory Mappings--->点击取消Git的注册根路径&#xff1a; 2、回到idea界面就没有Git了&#xff1a; 3、给这个项目初始化 这样就可以重新绑定远程仓库了&#x…