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 {// 24hprivate long time = 1000 * 60 * 60 * 24;private String signature = "admin";/*** 测试JWT令牌的生成和配置。* 使用JJWT库创建一个包含特定头部、载荷和签名的JWT令牌。* 头部配置了令牌的类型和算法。* 载荷包含了用户名、密码和主题等信息。* 设置了令牌的过期时间和唯一标识。* 使用HS256算法对令牌进行签名以确保完整性。*/@org.junit.Testpublic 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.Testpublic 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());}}