网络安全实验室后端开发程序员

JWT

2017-12-14  本文已影响44人  聪明的奇瑞

概述

构成

总结

优点:
    ■ 因 JSON 通用性,所以 JWT 可跨语言支持
    ■ payload 可存储业务逻辑信息(非敏感性)
    ■ 便于传输,字节占用很小
    ■ 不需要存储在服务端,易于扩展
安全相关:
    ■ 不应该在 JWT 的 payload 存储敏感信息,该部分是可以解密的
    ■ 保护好 secret 私钥,该私钥非常重要
    ■ 如果可以采用 HTTPS 协议   

与 Session 区别

JWT 为什么能保证信息可靠性?

eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTg0ODIxNTQsInN1YiI6InF1ZGluZyIsInVzZXJJZCI6IjEwMzc5NDAxIiwicm9sZSI6ImFkbWluIn0.-YFTYJ6FLlIQqD4G3hYcWvYlYE8H9eAA2369WEcJFVY

{
    "alg": "HS256"
}
{
    "exp": 1498482154,
    "sub": "linyuan",
    "userId": "123456",
    "role": "admin"
}
Sign ��6蒥!ୡaůbV��^땄pU

JJWT使用

  1. 通过Maven引入JJWT库:
   <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.7.0</version>
</dependency>
  1. 签发 JWT
public static String createJWT() {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
    JwtBuilder builder = Jwts.builder()
            .setId(id)          // JWT_ID
            .setAudience("")    // 接受者
        .setClaims(null)   // 自定义属性
            .setSubject("")     // 主题
        .setIssuer("")     // 签发者
            .setIssuedAt(new Date())    // 签发时间
        .setNotBefore(new Date())  // 失效时间
            .setExpiration(long)      // 过期时间
        .signWith(signatureAlgorithm, secretKey);// 签名算法以及密匙
            return builder.compact();
}
  1. 验证 JWT
public static Claims parseJWT(String jwt) throws Exception {
    SecretKey secretKey = generalKey();
            return Jwts.parser()
            .setSigningKey(secretKey)
            .parseClaimsJws(jwt)
            .getBody();
}
  1. 当 JWT验证失败时会抛出异常,常见异常有:
    • SignatureException:签名错误异常
    • MalformedJwtException:JWT格式错误异常
    • ExpiredJwtException:JWT过期异常
    • UnsupportedJwtException:不支持的JWT异常
上一篇 下一篇

猜你喜欢

热点阅读