JWT是json web token的简写,意为json格式的token。(官网)
使用场景
常用于web项目的token校验,用户校验,权限校验等,也可以用于信息的加密传输。
由于http的无状态的,所以我们通常会使用session cookie来保存用户的状态,随着微服务的兴起,session cookie无法在分布式环境下达到保存用户状态的目的,所以我们需要寻找另外的途径来保存用户的状态
一、保存于数据库
我们可以将用户的uuid信息保存于数据库中,当用户登录的时候,我们通过校验用户登录信息的正确性来生成一个uuid,然后将这个uuid保存于数据库中,然后客户端与服务端就通过这个uuid来判断用户
二、使用JWT
使用统一的一个token生成策略,对用户的信息加密生成可加密的token,然后分布式环境下每个节点都使用同一种解密方式进行解密,就可以得到用户的信息
jwt是json结构,分为3段(head、Payload、Signature)
head
head的作用主要是表明Signature使用的加密算法和token的类型
常用写法{ “alg”: “HS256”, “typ”: “JWT”}
Payload
用于存放我们需要校验的信息,譬如(username:admin,password:admin)
Signature
Signature是签名,使用head的加密算法对payload的内容进行加密,目的是防止token的信息被篡改
jwt简单的使用教程
以java为例
首先引入jar,版本可以改,按具体的使用环境来定
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
private final static String SCRENT = "abc123";
private final static long TOKEN_EXPIRATION = 12*3600*1000L;
private static String userName = "test";
private static String password = "test123456";
/**
* 生成token
* @param username 用户名
* @param password 密码
* @param secret 密钥
* @return token
*/
private static String generateToken(String username,String password, String secret){
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
SecretKey secretKey = generalKey();
Date date = new Date(System.currentTimeMillis()+TOKEN_EXPIRATION);
JwtBuilder jwtBuilder = Jwts.builder()
.setHeaderParam("typ","JWT").setHeaderParam("alg","HS256")
.claim("username",username)
.claim("password",password)
.signWith(signatureAlgorithm,secretKey)
.setExpiration(date);
return jwtBuilder.compact();
}
private static SecretKey generalKey(){
byte[] encodeKey = Base64.getDecoder().decode(SCRENT);
SecretKey key = new SecretKeySpec(encodeKey,0,encodeKey.length,"AES");
return key;
}
/**
* 解密token 返回payload的信息主体对象claims
* @param jwtToken token
* @return Claims
*/
private static Claims validateJWT(String jwtToken){
Claims claims = Jwts.parser()
.setSigningKey(generalKey())
.parseClaimsJws(jwtToken).getBody();
return claims;
}
/**
* 从token中获取key的值
* @param jwtToken token
* @param key key
* @return value
*/
public static Object get(String jwtToken,String key){
Claims claims = validateJWT(jwtToken);
String value = claims.get(key,String.class);
return value;
}
下面是代码运行的效果