面试题:jwt 是什么?java-jwt 呢?
文章目录
- JWT的核心机制是什么?
- 在线生成过程是怎样的?
- 它由哪几部分组成?各部分起什么作用?
- 支持哪些编程语言?有哪些优势?
- 如何访问JWT官方文档?
- 推荐的Java-JWT库有哪些?
- 如何生成一个加密Token?请详细说明步骤。
- 如何解密Token以获取负载信息?请详细说明验证Token有效性的过程。
JWT概念
JWT , 全写JSON Web Token, 是开放的行业标准RFC7591,用来实现端到端安全验证.
简单来说, 就是通过一些算法对加密字符串和JSON对象之间进行加解密。
JSON格式编码后的JWT信息被存储于客户端端侧,并且该机制避免了服务端需要存储会话信息的需求。这种设计模式适用于前后端解耦的用户认证场景。通过后端进行加密处理生成tokens字符串,并将该tokens字符串附加至前端请求中完成身份验证流程。
JWT流程:

JWT的构成
JWT字符串:一段加密的JSON字符串。
包含了三类信息
- Header头部:Token种类与加密机制。主要采用MD5、SHA与HMAC(Hash Message Authentication Code)作为常用的加密算法。
- PayLoad负载:存储重要数据,并包含开发者使用的术语。这些内容类似于编程语言中的关键字。
issuser - 发行人
sub subject - 目标受众
audience - 接收方
expiration time - 过期时间戳
nbf - 不得早于, 开始生效时间戳
iat(Issued at) 签发时间
jti(JWT ID): 唯一标识符
公共的声明:一般添加业务相关的必要信息,因为可解密,不建议敏感信息。
私有的声明即为提供者与消费者共同制定的定义;Base64对称解密即为此方案中采用的技术;建议避免处理涉及敏感信息的内容。
Signature签证
签证信息包括三部分:
Base64加密的header
Base64加密的payload
采用header中定义的加密算法对Header及payload的连接字符串施加盐并进行秘密组合加密。该密钥存于服务端,在此位置上所述服务端能够基于该密钥执行解密验证过程。
JWT与开发语言
一种广泛采用的标准...可以由多种过时的开发语言实现...包括Java...Node.js...Python等。同一个编程语言中存在多个实现库...例如,在Java编程语言中就提供了java-jwt、?jose4j、nimbus-jose-jwt和jjwt等多种库。
JWT官网
This website offers an online tool that utilizes various algorithms for converting strings and JSON objects, alongside a collection of implementation libraries in multiple languages.
java-jwt
java-jwt是Java语言中推荐的JWT实现库,使用Maven导入如下:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
产生加密Token
String token = JWT.create()
.withExpiresAt(newDate(System.currentTimeMillis())) //设置过期时间
.withAudience("user1") //设置接受方信息,一般时登录用户
.sign(Algorithm.HMAC256("111111")); //使用HMAC算法,111111作为密钥加密
解密Token获取负载信息并验证Token是否有效
String userId = JWT.decode(token).getAudience().get(0);
Assertions.assertEquals("user1", userId);
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("111111")).build();
jwtVerifier.verify(token);
