JWT与TOKEN
JWT(JSON Web Token)是一种基于 JSON 格式的轻量级安全令牌,通常用于在网络应用间安全地传递信息。而“token”一词则是一个更广泛的术语,用来指代任何形式的令牌,用于在计算机系统中进行身份验证或授权。JWT 是 token 的一种具体实现方式,提供了一种基于 JSON 结构的令牌标准,用于在客户端和服务器之间传递信息,并在许多网络应用中广泛使用。
1.简介
Json Web Token,通过数字签名的方式,以JSON对象为载体,不需中间服务器验证的情况下,允许在源和接收方之间可靠传输,确保信息的完整性和真实性
2.用处
授权认证,一旦用户登录,后续每个请求都包含有JWT,系统在每次处理请求之前,都先进行JWT安全校验。
3.组成
由3部分组成,用"."拼接
三部分分别是:
-
Header
-
token类型
-
加密算法名称
-
-
Payload 载荷,存放有效信息
-
标准中注册的声明 ---信息安全的分类
-
公共的声明
-
私有的声明
-
-
Signature 签名
-
将加密后的Header和加密后的Payload用点拼接,再将结果通过header中声明的加密算法进行加密
-
例子
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
package com.jwt;
import com.sun.javafx.binding.StringFormatter;
import io.jsonwebtoken.*;
import java.util.Date;
import java.util.UUID;
public class Test {
// 24h
private long time = 1000 * 60 * 60 * 24;
private String signature = "admin";
/**
* 测试JWT令牌的生成和配置。
* 使用JJWT库创建一个包含特定头部、载荷和签名的JWT令牌。
* 头部配置了令牌的类型和算法。
* 载荷包含了用户名、密码和主题等信息。
* 设置了令牌的过期时间和唯一标识。
* 使用HS256算法对令牌进行签名以确保完整性。
*/
@org.junit.Test
public void jwtTest() {
// 创建JWT令牌构建器
JwtBuilder jwtBuilder = Jwts.builder();
// 构建并配置JWT令牌
String jwtToken = jwtBuilder
// 设置头部参数,定义令牌类型和算法
// header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
// 设置载荷信息,包含用户名和密码
// payload
.claim("username", "admin")
.claim("password", "123456")
// 设置主题
.setSubject("admin-Test")
// 设置令牌过期时间
.setExpiration(new Date(System.currentTimeMillis() + time))
// 设置令牌的唯一标识
.setId(UUID.randomUUID().toString())
// 设置令牌的发行时间
.setIssuedAt(new Date())
// 使用HS256算法和签名密钥对令牌进行签名
// signature
.signWith(SignatureAlgorithm.HS256, signature)
// 将令牌紧凑化为最终的字符串表示形式
.compact();
System.out.println(jwtToken);
}
/**
* 解析JWT令牌。
* 该方法演示了如何使用JJWT库解析一个JWT令牌,并从中提取出声明信息。
* JWT令牌被设计为一种安全的数据传输方式,其中包含了用户信息或其他需要传递给服务端的信息。
* 在这个例子中,我们解析令牌以获取用户名、密码、令牌ID、主题和过期时间等信息。
*/
@org.junit.Test
public void parse(){
// 定义一个JWT令牌字符串
String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJzdWIiOiJhZG1pbi1UZXN0IiwiZXhwIjoxNzE5ODM1Mzc4LCJqdGkiOiJiOGI2M2QxYy1iODhiLTQ4MDAtOWEyYi0yOTVkY2Q3NDNjMTQiLCJpYXQiOjE3MTk3NDg5Nzh9.Espy5I1IjwuPmnkHx-6TTie_VUP2zLDnasxfNDilclI";
// 创建JWT解析器
JwtParser jwtParser = Jwts.parser();
// 设置解析器的签名密钥,并解析JWT令牌为Jws<Claims>对象
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature)
.parseClaimsJws(jwtToken);
// 提取声明信息
Claims claims = claimsJws.getBody();
// 打印提取的声明信息:用户名、密码、令牌ID、主题和过期时间
System.out.println(claims.get("username"));
System.out.println(claims.get("password"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
}