欢迎来到我的博客来阅读我写的文章,希望我写的文章能帮助到大家!
看到错误什么的欢迎指出来,有不足请补充!

JWT

JWT介绍

JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。它是一种用于双方之间传递安全信息的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法,从而使通信双方实现以JSON对象的形式安全的传递信息。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源
服务器获取资源。比如用在用户登录上JWT最重要的作用就是对 token信息的防伪作用。

JWT原理

一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行base64编码得到JWT。
JWT原理图

(1) 公共部分

  • 主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。

(2) 私有部分

  • 用户自定义的内容,根据实际需要真正要封装的信息。userInfo{用户的Id,用户的昵称nickName}

(3) 签名部分

  • SaltiP: 当前服务器的Ip地址!{linux 中配置代理服务器的ip}主要用户对JWT生成字符串的时候,进行加密{盐值}base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息。

Tokken格式

  • 一个长Token一共三部分,每部分都用点. 来分割
    Token格式

服务整合JWT要添加的依赖

(1) 再maven中添加依赖

1
2
3
4
5
6
7
<dependencies>
<!-- 再maven中添加JWT依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
</dependencies>

(2) 再添加JWT工具类

  • 生成token 和 根据token反向获取userId , userName
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class JwtHelper {
    //token字符串有效时间
    private static long tokenExpiration = 24*60*60*1000;

    //加密编码秘钥
    private static String tokenSignKey = "BingXin";

    //根据userid 和 username 生成token字符串
    public static String createToken(Long userId, String userName) {
    String token = Jwts.builder()
    //设置token分类
    .setSubject("GGKT-USER")
    //token字符串有效时长
    .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
    //私有部分(用户信息)
    .claim("userId", userId)
    .claim("userName", userName)
    //根据秘钥使用加密编码方式进行加密,对字符串压缩
    .signWith(SignatureAlgorithm.HS512, tokenSignKey)
    .compressWith(CompressionCodecs.GZIP)
    .compact();
    return token;
    }

    //从token字符串获取userid
    public static Long getUserId(String token) {
    if(StringUtils.isEmpty(token)) return null;
    Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
    Claims claims = claimsJws.getBody();
    Integer userId = (Integer)claims.get("userId");
    return userId.longValue();
    }

    //从token字符串获取getUserName
    public static String getUserName(String token) {
    if(StringUtils.isEmpty(token)) return null;
    Jws<Claims> claimsJws
    = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
    Claims claims = claimsJws.getBody();
    return (String)claims.get("userName");
    }
    }
  • 测试代码
    1
    2
    3
    4
    5
    6
    public static void main(String[] args) {
    String token = JwtHelper.createToken(1L, "lucy");
    System.out.println(token);
    System.out.println(JwtHelper.getUserId(token));
    System.out.println(JwtHelper.getUserName(token));
    }

JWT优缺点

优点:

  • 紧凑:JWT的构成非常简单,字节占用很小,可以通过 GET、POST 等放在 HTTP 的 header 中,非常便于传输。
  • 紧凑:JWT的构成非常简单,字节占用很小,可以通过 GET、POST 等放在 HTTP 的 header 中,非常便于传输。
  • 通用:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。

缺点:

  • jwt一旦生成后期无法修改。
  • 无法更新jwt有效期,无法销毁一个jwt。