JWT(Token)
JWT
什么是JWT
JsonWebToken. 定义了一种紧凑,自包含的方式,用于在各方之间以JSON对象安全的传输对象
此信息可以验证和信任,它是有数字签名的,可以使用各种算法进行签名
通过JSON的形式作为Web应用的令牌,用于在各方面之间安全的将信息作为JSON对象进行传输,在传输过程中还可以完成数据加密,签名等相关处理
核心作用
- 信息交换
- 安全校验
JWT能做什么
-
授权
一旦用户登陆,后续所有请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源,单点登录是如今广泛使用JWT的一项功能,他的开销很小并且可以在不同的域内使用
-
信息交换
JSON WEB TOKEN 可以在各方之间安全的传输信息,可以对JWT进行签名(公钥和私钥),确保发件人是正确的人,签名是使用标头和有效负载计算的,还可以验证内容是否被篡改
为什么使用JWT
解决授权问题
Session 认证

返回cookie中加入SessionId 来实现保存用户信息
session都保存在内存中,随着认证用户的增多,服务器开销会明显增大
用户认证后,服务端保存在内存中,用户的下一次请求必须还要在这台服务器上,限制了拓展性
同时cookie保存,容易被伪造攻击
JWT认证
1. 用户将账号密码发送到后端接口
2. 服务器验证后,将用户的其他信息作为JWT PayLoad,将其头部分别进行Base64 编码拼接后签名,形成Token
3. 后端JWT字符串作为登陆成功的返回结果返回给前端,前端保存在localStorage ,退出登录时删除JWT即可
4. 前端每次请求时将JWT放在Http Header 的Authorization位置
5. 后端检验是否存在,验证JWT的有效行,检查Token是否过期
6. 通过后端使用的JWT中包含的用户信息进行逻辑操作,返回相应结果
优点
- 简洁
- 自包含。可以保存用户所需要的信息
- Token是通过加密的形式保存在客户端的,所有不怕被篡改
- 不需要在服务端保存会话信息,特别适合分布式微服务
JWT的结构
-
令牌组成
- 1.标头(Header)
- 2.有效荷载(Payload)
- 3.签名(Signature)
-
头信息(Header)
-
头信息一般由两部分组成,令牌的类型和使用的签名算法
-
他会使用Base64 编码组成JWT结构的第一部分
-
Base64 是一种编码,可以被翻译为原来的样子
-
{ "alg":"HS256", "typ":"JWT" }
-
-
有效载荷(Payload)
-
包含其声明
-
声明是有关实体和其他数据的声明
-
同样会使用Base64 来组成JWT结构的第二部分
-
{ "name":"airou", "id":"1", "qq":"2023034904" }
-
-
签名(Signature)
-
使用编码后的Header和Payload 以及提供的密钥,使用header中指定的签名算法进行签名
-
签名的作用保证JWT没有被篡改
-
HMACSHA256(base64UrlEncode(header)+'.'+base64UrlEncode(payload),secret);
-
第一个JWT程序
pom依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.14.0</version>
</dependency>
加密
void TestGetToken() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MINUTE,3);
String Token = JWT.create()
.withClaim("name","airou")
.withClaim("id",1)
.withExpiresAt(calendar.getTime())
.sign(Algorithm.HMAC256("airou123"));
System.out.println(Token);
}
解码
void TestReadToken(){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("airou123")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(Token);
System.out.println(decodedJWT.getClaim("name").asString());
System.out.println(decodedJWT.getClaim("id").asInt());
}
write_time :
2021-04-17 22:31:11 星期六
浙公网安备 33010602011771号