JWT-JSON WEB TOKEN

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

JWT组成

一个JWT由head,payload,signature三部分组成,使用.进行分隔。

例如:ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==.2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7

header

header(头部)一般有两个部分:分别是typ和alg。

  • typ:表示json的类型,即用来干什么的,在JWT中默认为"JWT"
  • alg:表示加密的算法,如HS256。

一个标准的jwt header的json文本如下:

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

通过BASE64进行加密获得一个字符串:ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9

payload

payload(负载)用来保存需要传递的信息的一个json文本。不用来存储敏感信息。

一个自定义的payload:

{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}

通过BASE64进行加密获得一个字符串:ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==

signature

signature(签名)用来校验当前的jwt是否经过篡改,用来校验其有效性的。

signature是通过header和payload获得的两个BASE64加密后的字符串拼接后进行摘要后得到的一个字符串。

String secret = "secret"; //盐,也就是保存在服务器的私钥,用于校验
String encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
String signature = HMACSHA256(encodedString, secret);

这样我们就得到一个signature字符串:

2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7

将这三者进行拼接,使用.拼接即可得到JWT。

ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==.2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7

JWT校验

使用SHA256算法将header.payload进行盐值摘要,得到一个字符串signature。

如果和jwt中的signature相同的话,那么表示当前的JWT是由我们下发的。这时,我们就可以根据BASE64进行解密获取其中的数据来进行业务操作。

如果不同的话,那么表示该JWT不是我们下发的,停止之后的操作即可。

JWT获取信息

对于前台获取数据,我们可以直接将payload进行BASE64解密,因为我们相信该JWT来源,就算是被篡改的,也会被服务端进行校验。

JJWT(java jwt api)使用

JJWT是一个供生成和解析jwt的java端工具。官方网址

导入依赖

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>

测试代码

User user = new User();
user.setId(1L);
user.setLogin("user");
user.setPassword("user");
user.setRole("ROLE_USER"); String secretKey = "MDk5ZmU2YzdhZWE5NWRhZTU0MjgzMTVmMTkxYTI5ZGJmODc3NWU2ZDc5OWI1YWMxZTE5NWYxZWVhY2VmZGYwMWQ1NmExNjI4M2M2OWUzOGM0Nzg1ZGU2YzgxNWVjYzNhODg4YzE0ODhlZDA0YjZlYTgzYzk3MGE4NWFkMmJmOGI=";
byte[] keyBytes = Decoders.BASE64.decode(secretKey);// 私钥必须使用BASE64来获取bytes
Key key = Keys.hmacShaKeyFor(keyBytes);// 创建自定义私钥
String jws = Jwts.builder().setSubject("Joe").signWith(key).compact();// 官方示例
System.out.println(jws);
String compact = Jwts.builder()
.setSubject(user.getLogin())
.signWith(key,SignatureAlgorithm.HS512) // 默认使用HS256加密算法
.setExpiration(new Date(new Date().getTime() + 10000))
.compact();
System.out.println(compact); //需要同时进行测试,否则会报解析异常。
Claims body = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(compact).getBody();
System.out.println(body);
String subject = body.getSubject();
System.out.println(subject);

得到结果:

eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.Y3dJ9pJiIoq3Py4xe445ud6Mk02v-N0rBFa8v3zlwZycjoVXOObRGSuyyMw4vhbhwuGIEj4fdIbe9P68Y8tXaA
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoxNjA2ODA2OTcxfQ.GAw3fSU3r6qq7tcPrjqlj4tVh0tGK-GqWGLfPUQfeVIAvRF2_1GEQySYgoRvVc24fw-AcjFO4UIcuWcrvZO_Rg
{sub=user, exp=1606806971}
user

其中headerbody可以直接BASE64解密获得数据。

JWT介绍及使用的更多相关文章

  1. oAuth2.0及jwt介绍

    oAuth2.0流程示意如下: 关于jwt介绍: 说明: 关于jwt简单说明一下,jwt即为json web token,是用来和服务端建立加密通信所使用的的一种“约定”,主要组成见上图即可.服务端一 ...

  2. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_11-SpringSecurityOauth2研究-JWT研究-JWT介绍

    3.6 JWT研究 3.6.1 JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法,如下图: 问题: 传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性 ...

  3. day4(JWT介绍)

    1.JWT介绍 1.1jwt原理 最简单理解:jwt本质就是, 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户 { "Use ...

  4. Python JWT 介绍

    Python JWT 介绍 目录 Python JWT 介绍 1. JWT 介绍 2. JWT 创建 token 2.1 JWT 生成原理 2.2 JWT 校验 token 原理 3. 代码实现 4. ...

  5. rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式

    今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...

  6. JWT 介绍 - Step by Step

    翻译自 Mohamad Lawand 2021年3月11日的文章 <Intro to JWT - Step by Step> [1] 在本文中,我将向您介绍 JWT[2]. 我们今天要讲的 ...

  7. jwt介绍

    jwt原理 最简单理解:jwt本质就是, 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户 { "UserName" ...

  8. JWT 在前后端分离中的应用与实践

    关于前后端分离 前后端分离是一个很有趣的议题,它不仅仅是指前后端工程师之间的相互独立的合作分工方式,更是前后端之间开发模式与交互模式的模块化.解耦化.计算机世界的经验告诉我们,对于复杂的事物,模块化总 ...

  9. 深入浅出JWT(JSON Web Token )

    1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行 ...

随机推荐

  1. 极速体验|使用 Erda 微服务观测接入 Jaeger Trace

    在大型网站系统设计中,随着分布式架构,特别是微服务架构的流行,我们将系统解耦成更小的单元,通过不断的添加新的.小的模块或者重用已经有的模块来构建复杂的系统.随着模块的不断增多,一次请求可能会涉及到十几 ...

  2. laravel8安装步骤

    网址: https://learnku.com/docs/laravel/8.x/installation/9354 安装: # 安装laravel composer create-project - ...

  3. php将一个字符串转变成键值对数组的效率问题

    有这样一种需求,将形式为"TranAbbr=IPER|AcqSsn=000000073601|MercDtTm=20090615144037"的字符串转换成如下格式的数组: Arr ...

  4. Jira8.0.2安装及破解

    最近开发部总监需要部署JIRA管理项目,就安装了一个JIRA8.5.7版安装并破解后,有天断电重启了,发现启动不了提示连接不上数据库.后来我又换了台机器重新安装后又进行了重启发现此破解版本存在问题.并 ...

  5. C#+SQL Server的数据库管理系统常用的代码

    数据库管理系统 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立.使用和维护数据库,简称DBMS.它对数据库进行统一的管理和控制,以保证 ...

  6. java垃圾处理机制

    java文件通过编译器(javac命令)生成class文件(字节码文件),其通过java命令启动虚拟机将字节码文件转换成平台能够理解的方式运行. 类存在于源文件里面,方法存在于类中,语句存在与方法中. ...

  7. 不带头结点的单链表(基于c语言)

    本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h& ...

  8. nexus3上传第三方jar包

    1.新建第三方仓库,名字叫3rd_part 2.添加到maven-public组中 3.修改maven的setting.xml 4.执行命令 mvn deploy:deploy-file -Dgrou ...

  9. Mybatis中的基本对象的生命周期和作用域

    不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题 SqlSessionFactoryBuilder 这个类可以被实例化.使用和丢弃,一旦创建了 SqlSessionFact ...

  10. ssh-ssl编译安装

    升级前准备 #下载所需依赖包#yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-d ...