当前位置:网站首页>【项目实训】jwt

【项目实训】jwt

2022-06-12 01:13:00 par_ser

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

上述是jwt的官网的介绍,简单来说,使用jwt,可以安全地传输信息,jwt可以被验证。在我们的系统里,jwt主要用于授权。

jwt结构

JWT由三部分组成,分别是Header、Payload、Signature,中间使用点进行分隔。

JWT第一部分是头部分,它是一个描述JWT元数据的Json对象,通常如下所示。

{
    "alg": "HS256",
    "typ": "JWT"
}

alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT。

最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。

JWT第二部分是Payload,也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择。

分别是,iss:发行人、exp:到期时间、sub:主题、aud:用户、nbf:在此之前不可用、iat:发布时间、jti:JWT ID用于标识该JWT。

JWT第三部分是签名。是这样生成的,首先需要指定一个secret,该secret仅仅保存在服务器中,保证不能让其他用户知道。然后使用Header指定的算法对Header和Payload进行计算,然后就得出一个签名哈希。也就是Signature。

jwt优势

谈起jwt,我们经常会跟传统的session方案做比较,jwt的一个显而易见的优势是无状态,通俗地来讲,就是服务器不需要针对每一个”登录“用户来存储额外的信息做用户授权。发出去的jwt你不需要知道是什么,而只需要按照既定的解析方法去解析即可。(但无状态并不如想象的那般美好,它也会带来不少问题,例如在不引入额外措施的情况下,让一个jwt失效恐怕很困难,这意味着,哪怕用户登出了,如果jwt没到过期时间,你接着用它依然能正常访问接口)

此外,jwt的优势还有:从根本上防止了CSRF攻击(jwt对前端不像cookie那样透明,你可以将jwt放在header中携带发送出去),适合移动端应用(不依赖cookie..),容易实现单点登录等。

添加依赖

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

创建工具类

进一步地,为了让我们更便捷地创建jwt,可以定义一个工具类(可类似如下来定义方法)

    public static String createJWT(String subject, Long ttlMillis,String decodeKey) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID(),decodeKey);// 设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid, String decodeKey) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey(decodeKey);
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("wodeqianming")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);     //过期时间
    }

原网站

版权声明
本文为[par_ser]所创,转载请带上原文链接,感谢
https://blog.csdn.net/par_ser/article/details/125138770