当前位置:网站首页>JWT的基础介绍
JWT的基础介绍
2022-07-07 02:34:00 【小朋友哈哈】
前言
JWT主要是用于用户登录鉴权,传统的方法就是session认证。
http是无状态的协议,当有用户向系统使用账户名称和密码进行用户认证之后,下一次请求还要再一次用户认证才行。因为我们不能通过http协议知道是哪个用户发出的请求,所以如果要知道是哪个用户发出的请求,那就需要在服务器保存一份用户信息(保存至session),然后在认证成功后返回cookie值传递给浏览器,那么用户在下一次请求时就可以带上cookie值,服务器就可以识别是哪个用户发送的请求,是否已认证,是否登录过期等等。
session认证的缺点其实很明显,由于session是保存在服务器里,所以如果分布式部署应用的话,会出现session不能共享的问题,很难扩展。
JWT的介绍
JWT:Json Web Token 它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
流程:
- 用户使用账号、密码登录应用,登录的请求发送到Authentication Server。
- Authentication Server进行用户验证,然后创建JWT字符串返回给客户端。
- 客户端请求接口时,在请求头带上JWT。
- Application Server验证JWT合法性,如果合法则继续调用应用接口返回结果
用户信息是保存在客户端,关键在于生成JWT和解析JWT。
JWT的数据结构
JWT一般是这样的字符串,分为三个部分,以"."隔开。
xxxxx.yyyyy.zzzzz
Header:第一部分是头部分,描述JWT元数据的Json对象
{
"alg": "HS256",
"typ": "JWT"
}
alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
Payload:第二部分是Payload,也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择。
分别是,iss:发行人、exp:到期时间、sub:主题、aud:用户、nbf:在此之前不可用、iat:发布时间、jti:JWT ID用于标识该JWT。
如果自定义字段,可以这样定义:
{
//默认字段
"sub":"主题123",
//自定义字段
"name":"java技术爱好者",
"isAdmin":"true",
"loginTime":"2021-12-05 12:00:03"
}
JSON对象也使用Base64 URL算法转换为字符串保存。
Signature:第三部分是签名。是这样生成的,首先需要指定一个secret,该secret仅仅保存在服务器中,保证不能让其他用户知道。然后使用Header指定的算法对Header和Payload进行计算,然后就得出一个签名哈希。
JWT的优点:
- json格式的通用性,所以JWT可以跨语言支持,比如Java、JavaScript、PHP、Node等等。
- 可以利用Payload存储一些非敏感的信息。
- 便于传输,JWT结构简单,字节占用小。
- 不需要在服务端保存会话信息,易于应用的扩展。
使用JWT
导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建工具类,用于创建jwt字符串和解析jwt
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import java.util.Date;
/**
*
* @description JWT:令牌token生成
*/
public class TokenUtil {
// token有效期
private static final long EXPIRATION = 86400L;//1day = 86400L
/**
*
* @description 创建token工具方法
*/
public static String createToken(User user) {
JwtBuilder builder = Jwts.builder();
builder.setAudience(user.getUserCode()) // 这个user.getUserCode()是我后续需要的参数
.setIssuer("xxx")
.claim("userId", user.getId()) // userId 是我自己后续需要的参数,这个根据自己的需求进行设置
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000));
String accessToken = builder.compact();
return accessToken;
}
/**
*
* @description 验证token返回用户code
*/
public static String validateToken(String token) {
Claims claims = Jwts.parserBuilder().build().parseClaimsJwt(token).getBody();
String userCode = claims.getAudience();
return userCode;
}
/**
*
* @description 验证token返回用户ID
*/
public static String getUserIdFromToken(String token) {
Claims claims = Jwts.parserBuilder().build().parseClaimsJwt(token).getBody();
String userId = claims.get("userId", String.class);
return userId;
}
}
有些微修改,我这里没有使用到第三部分。
链接:https://www.zhihu.com/question/485758060/answer/2257869896
边栏推荐
- 港科大&MSRA新研究:关于图像到图像转换,Fine-tuning is all you need
- How to install swoole under window
- C language interview to write a function to find the first public string in two strings
- 从零到一,教你搭建「CLIP 以文搜图」搜索服务(二):5 分钟实现原型
- 2022/07/04学习记录
- LM11丨重构K线构建择时交易策略
- Stack and queue-p79-9
- MySQL installation
- MySQL的安装
- 力扣62 不同路径(从矩阵左上到右下的所有路径数量) (动态规划)
猜你喜欢
面试中有哪些经典的数据库问题?
Abnova 体外转录 mRNA工作流程和加帽方法介绍
Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
Which foreign language periodicals are famous in geology?
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
Several key steps of software testing, you need to know
SVN version management in use replacement release and connection reset
JWT certification
化工园区危化品企业安全风险智能化管控平台建设四大目标
Apache ab 压力测试
随机推荐
HKUST & MsrA new research: on image to image conversion, fine tuning is all you need
FlexRay通信协议概述
Crudini profile editing tool
字符串常量与字符串对象分配内存时的区别
MYSQL binlog相关命令
【luogu P1971】兔兔与蛋蛋游戏(二分图博弈)
健身房如何提高竞争力?
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
Leetcode T1165: 日志分析
JVM in-depth
JVM 全面深入
Redis(一)——初识Redis
A program lets you understand what static inner classes, local inner classes, and anonymous inner classes are
2022/07/04学习记录
How to solve sqlstate[hy000]: General error: 1364 field 'xxxxx' doesn't have a default value error
哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!
[GNN] graphic gnn:a gender Introduction (including video)
网络基础 —— 报头、封装和解包
Pinduoduo lost the lawsuit: "bargain for free" infringed the right to know but did not constitute fraud, and was sentenced to pay 400 yuan
二十岁的我4面拿到字节跳动offer,至今不敢相信