JsonWebToken. 定义了一种紧凑,自包含的方式,用于在各方之间以JSON对象安全的传输对象
此信息可以验证和信任,它是有数字签名的,可以使用各种算法进行签名
通过JSON的形式作为Web应用的令牌,用于在各方面之间安全的将信息作为JSON对象进行传输,在传输过程中还可以完成数据加密,签名等相关处理
核心作用
授权
一旦用户登陆,后续所有请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源,单点登录是如今广泛使用JWT的一项功能,他的开销很小并且可以在不同的域内使用
信息交换
JSON WEB TOKEN 可以在各方之间安全的传输信息,可以对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中包含的用户信息进行逻辑操作,返回相应结果
优点
令牌组成
头信息(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);
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 星期六
原文:https://www.cnblogs.com/airou/p/14672384.html