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. 【spring】事务底层的实现流程

    事务简单介绍 本文源码基于spring-framework-5.3.10. 事务是基于AOP的机制进行实现的! Spring事务基本执行原理 一个Bean在执行Bean的创建生命周期时,会经过Infr ...

  2. Java 将XML转为PDF

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性.通过将XML转换为PDF,能够便于文件传输及共享.本文,将介绍通过Java代码来实现该格式转换的方法. ...

  3. netty搭建rpc框架

    介绍 netty想必大家都不陌生,我就不废话介绍了...(主要是懒,网上资料很多的) 本文主要使用netty搭建rpc远程调用框架,实现了个注册中心微服务,整合了springboot例子... 开发内 ...

  4. 4. Java流程控制

    4.Java流程控制 4.1.用户交互Scanner 之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.java.util.Scann ...

  5. laravel 怎么获取public路径

    app_path()   app_path函数返回app目录的绝对路径: $path = app_path();   你还可以使用app_path函数为相对于app目录的给定文件生成绝对路径: $pa ...

  6. 华为交换机配置ACL详细步骤

    ACL 介绍 #2000-2999普通ACL,根据源IP过滤 #3000-3999高级ACL,根据源目的端口和源目的地址等过滤 #4000-4999二层ACL,根据源目的MAC等过滤 配置举例: 拒绝 ...

  7. ubuntu目录结构

    /:根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin:/usr/bin:可执行二进制文件的目录,如常用的命令ls. ...

  8. 微信小程序实现简单的2048

    这两天心血来潮,用微信小程序写了一个简单的2048,欢迎各位老铁围观,提出宝贵意见.这里我从0到1赘述一下个人实现流程: 首先去微信公平台(https://mp.weixin.qq.com/)注册一个 ...

  9. 2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇我们 ...

  10. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...