JWT 重点讲解

JWT 重点讲解

文章目录

  • JWT 重点讲解
    • 1. JWT 是什么
    • 2. JWT 的组成
      • 2.1 第一部分 HEADER
      • 2.2 第二部分 PAYLOAD
      • 2.3 第三部分 SIGNATURE
    • 3. JWT 在线生成与解析
    • 4. JWT 的特点
      • 4.1 无状态
      • 4.2 可自定义
      • 4.3 扩展性强
      • 4.4 调试性好
      • 4.5 安全性取决于密钥管理
      • 4.6 无法撤销
      • 4.7 需要缓存到客户端(需要传输给客户端)
      • 4.8 载荷大小有限制
    • 5. JWT 的优缺点
      • 5.1 优点
      • 5.2 缺点
    • 6. JWT 实践
      • 6.1 一次性验证
      • 6.2 JWT 令牌登录
      • 6.3 JWT 工具类
    • 7. JWT 避坑指南
      • 7.1 Redis 校验实现令牌泄露保护(Redis 处理泄露的 JWT )
      • 7.2 临检 JWT 限制敏感操作
      • 7.3 异常 JWT 监控判断:超频识别与限制
      • 7.4 地域检查判断 JWT 泄露
      • 7.5 客户端检查判断 JWT 泄露
      • 7.6 JWT 令牌泄露预防:限时、限数、限频
    • 8. JWT 常见面试题
      • 8.1 什么是 JWT ?解释一下它的结构
      • 8.2 JWT 优点有哪些?它与传统的 session-based 身份验证相比有什么优缺点?
      • 8.3 在 JWT 的结构中,分别有哪些部分?每个部分的作用是什么?
      • 8.4 JWT 如何工作?从开始到验证过程的完整流程是怎样的?
      • 8.5 什么是 JWT 的签名?为什么需要对 JWT 进行签名?如何验证 JWT 的签名?
      • 8.6 什么是 JWT 的令牌刷新?为什么需要这个功能?
      • 8.7 JWT 是否加密?如果是,加密的部分是哪些?如果不是,那么它如何保证数据安全性?
      • 8.8 在 JWT 中,如何处理 Token 过期的问题?有哪些方法可以处理?
      • 8.9 JWT 和 OAuth2.0 有什么关系?它们之间有什么区别?
      • 8.10 JWT 在什么场景下使用较为合适?它的局限性是什么?
      • 8.8 在 JWT 中,如何处理 Token 过期的问题?有哪些方法可以处理?
      • 8.9 JWT 和 OAuth2.0 有什么关系?它们之间有什么区别?
      • 8.10 JWT 在什么场景下使用较为合适?它的局限性是什么?

1. JWT 是什么

官网:JSON Web Tokens - jwt.io

  • JSON Web Token Introduction - jwt.io

JSON Web Token,简称 JWT,读音是 [d3pt] (jot 的发音),是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式。其作用是 JWT 是一种加密后数据载体,可在各应用之间进行数据传输。

而传递的数据在“加密之前”,就是 JSON 字符串,自然也就可以传递“对象”

你也可以理解为,“一段 JSON 字符串”,浓缩后的数据

压缩饼干 的图像结果

推荐学习视频:JWT_哔哩哔哩_bilibili

在这里插入图片描述

这是一个常见的登录逻辑,原本我们传统的 Cookie-Session 机制,用户登录成功后,之后携带 Cookie 中的 JSESSIONID 去访问服务器的会话记录,而 JWT 机制的话,则是登录成功后,返回一个 JWT 字符串,之后携带这个 JWT 就可以去访问其他接口了。

JWT 和 JSESSIONID 都可以说是访问令牌 Token,但 JSESSIONID 是访问会话记录,而 JWT 则本身就是数据!

但这也是对 JWT 的粗浅认知,接下来才是重头戏~

2. JWT 的组成

在这里插入图片描述

例子:

eyJhbGciOiJIUzI1NiJ9
.eyJqdGkiOiI0YWU1MDA2ZjAxNzU0NmM4ODE1NGNlNWZhMmQ4ODMwNCIsInN1YiI6IntcbiAgICBcImlkXCI6IDVcbn0iLCJpc3MiOiJzZyIsImlhdCI6MTcwODQxNzI4OSwiZXhwIjoxNzA4NTAzNjg5fQ
.EJXUxVDBcTHCBLrvrS_B40vgttlwZK2s1lB87FEjKNI

这就是一个 JWT

2.1 第一部分 HEADER

eyJhbGciOiJIUzI1NiJ9

是两个信息:

  1. alg:类型(JWT)
  2. typ:加密算法(HS256)

一般很固定就是这俩(除非设置为其他的)

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

使用 Base64 加密,构成 JWT 第一部分:HEADER

eyJhbGciOiJIUzI1NiJ9

2.2 第二部分 PAYLOAD

即载荷(也是 JSON 格式),有两种:

  1. 标准载荷(建议使用)

    在这里插入图片描述

  2. 自定义载荷

    可以是任何信息(一个键值对集合,Java 中就是个 Map,只不过这个 Map 要以某种特殊的形式存在于 JWT中),可以添加用户的相关消息等等~

    可以理解为(标准载荷的一个属性是自定义载荷):

    {
        "data": [
            {"k1": v1},
            {"k2": v2}
        ],
        "exp": 1777777777,
        "iss": "macaku"
        // ...
    }
    

我的习惯是,将业务数据,转化为 JSON 作为 sub 的值,然后获取 sub 的值就行了~

  • 机制就在这,爱咋玩咋玩

但是这也与我的另一个习惯相关,就是 JWT 存的一般是 ID 之类的不带具体信息的数据,说是“SubObject”也没问题,这样我感觉用法可以跟灵活,也防止敏感信息泄露,之后总结再来看这个会更清楚!

使用 Base64 加密,构成 JWT 第二部分:PAYLOAD

eyJqdGkiOiI0YWU1MDA2ZjAxNzU0NmM4ODE1NGNlNWZhMmQ4ODMwNCIsInN1YiI6IntcbiAgICBcImlkXCI6IDVcbn0iLCJpc3MiOiJzZyIsImlhdCI6MTcwODQxNzI4OSwiZXhwIjoxNzA4NTAzNjg5fQ

2.3 第三部分 SIGNATURE

即签名,算法如下:

signature = HMACSHA256(header.payload, secret)

其中

  • HMACSHA256

    • 就是 HEADER 里的那个加密算法
  • header.payload 就是前两个部分

    • eyJhbGciOiJIUzI1NiJ9
      .eyJqdGkiOiI0YWU1MDA2ZjAxNzU0NmM4ODE1NGNlNWZhMmQ4ODMwNCIsInN1YiI6IntcbiAgICBcImlkXCI6IDVcbn0iLCJpc3MiOiJzZyIsImlhdCI6MTcwODQxNzI4OSwiZXhwIjoxNzA4NTAzNjg5fQ
  • secret

    • 是服务器必须自行保存好的密钥

有 secret 不代表,解密不了,因为主要数据是 payload,有没有 secret 压根就不影响信息暴露。

其作用就是配合 signature

  • 如果 header.payloadsecret 加密后得到 signature,则说明这个 JWT 是值得信赖的,是服务器颁布的,避免伪造 JWT~
  • ”是我颁布的“ 并且没有过期,则校验通过~

算出来的字符串用 Base 64 加密后构成第三部分:SIGNATURE

EJXUxVDBcTHCBLrvrS_B40vgttlwZK2s1lB87FEjKNI

3. JWT 在线生成与解析

JWT Token在线编码生成 - ToolTT在线工具箱

在这里插入图片描述

JWT Token在线解析解码 - ToolTT在线工具箱

  • 不到 secret 也能解析

在这里插入图片描述

{
    "data": [
        {
            "tooltt": "https://tooltt.com"
        },
        {
            "username": "mms"
        },
        {
            "gender": "boy"
        }
    ],
    "iat": 1708450751,
    "exp": 1709135999,
    "aud": "all",
    "iss": "mms",
    "sub": "{\"id\":1}"
}

4. JWT 的特点

4.1 无状态

JWT 一旦生成就是固定的,本身就是数据,并且无需在服务器存储

这让我想起《斗罗大陆》,“武魂殿会发给非武魂殿所属,但是被武魂殿认可的强者1块“教皇令”,见到此令就如同见到教皇亲临,拥有长老的权力,可见其效力之大。”

🤣🤣🤣

谁拿着 JWT ,只要这个 JWT 是我通过鉴定是我颁布的,那我就认定这个人。

这并不会在服务器保存什么”登录状态“之类的会话,来证明 JWT 是什么或者有效

  • 有缓存也只是为了提高效率罢了

”时效性“不代表状态,是 JWT 提供的机制罢了,其实照样能解析,但是这个的存在,给 JWT 提供了有效期的特点

因为是固定的,那么是一定能解析出来的,并且解析出来的东西也是固定的,而不是因为某个状态,不能用啦,比如 Cookie-Session 机制,要是服务器把会话删了,Cookie 连根毛都不能兑换。

当然,也可以”打破无状态性“,自定义业务场景咯,例如 JWT 黑名单等等…

  • 但是 JWT 仍然可以解析,只不过对令牌的校验逻辑不仅仅是 ”是我颁布的就行“

4.2 可自定义

JWT 的载荷是可以自定义的,灵活度提高

4.3 扩展性强

JWT 有一套标准规范,因此容易在不同平台和语言之间共享和解析

  • (例如如果第三方登录,可以把平台 A 的 JWT 给平台 B,解析后校验,用户则在平台 B 登录,生成平台 B 的 JWT)
  • 微服务架构,少不了多语言开发同个项目

4.4 调试性好

由于 JWT 的内容是以 Base64 编码后的字符串形式存在的,因此非常容易进行调试和分析(结构明了,解密简单)

4.5 安全性取决于密钥管理

密钥丢了,别人就可以伪造 JWT,威胁安全性

JWT 的安全性取决于密钥的管理。如果密钥被泄露或者被不当管理,那么 JWT 将会受到攻击。因此,在使用 JWT 时,一定要注意密钥的管理,包括生成、存储、更新、分发等等。

4.6 无法撤销

一旦生成,就是固定的字符串,要刷新也是换个新的,而不是让这个字符串转为另一个状态对应另一份数据!

4.7 需要缓存到客户端(需要传输给客户端)

JWT 包含用户信息和权限信息,一般需要在客户端缓存,要防止被窃取。

时间太久,很容易被别人拿到 JWT,从而干坏事,所以 JWT 引入时效性~

4.8 载荷大小有限制

由于 JWT 需要进行网络传输,对载荷大小有限制,不建议超过 1KB,会很影响性能

前面提到的 JWT 存 ID 之类的不带具体信息的数据,

载荷大小有限制 也是 一部分原因,

避免暴露敏感信息也是 一个,

无状态性和无法撤销 也是一个,如果用户信息有变动,JWT 的无状态性也代表这个消息可能更新不及时,且无法更新,只能刷新令牌了,还要让前端接下来请求换个 JWT,还不如存个不变的 ID,然后查服务器的缓存和数据库~

  • 没有打破无状态性,因为这里还是以”是我颁布的“为 JWT 的校验逻辑

5. JWT 的优缺点

5.1 优点

  1. 无状态:
    • JWT 本身不需要存储在服务器上,因此可以实现无状态的身份验证和授权
  2. 可扩展性
    • JWT 的载荷可以自定义,因此可以根据需求添加任意信息
  3. 可靠性:
    • JWT 使用数字签名来保证安全性,因此具有可靠性
  4. 跨平台性:
    • JWT 支持多种编程语言和操作系统,因此具有跨平台性
  5. 高效性
    • 由于 JWT 不需要查询数据库,因此具有高效性

5.2 缺点

  1. 安全性取决于密钥管理:
    • JWT 的安全性取决于密钥的管理,如果密钥被泄露或者被不当管理,那么 JWT 将会受到攻击。
  2. 无法撤销令牌:
    • 由于 JWT 是无状态的,一旦JT被签发,就无法撤销。
  3. 需要传输到客户端:
    • 由于 JWT 包含了用户信息和授权信息,因此 JWT 需要传输到客户端,这意味着 JWT 有被攻击者窃取的风险。
  4. 载荷大小有限制:
    • 由于 JWT 需要传输到客户端,因此载荷大小也有限制,差不多就十个左右的键值对。

6. JWT 实践

JSON Web Token Libraries - jwt.io

  • 大部分的业务逻辑去遵守 JWT 规范,用 JWT 官方提供的接口方便开发

在这里插入图片描述

找个库去用即可,我选择的是:

<!--jjwt-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.64</version>
</dependency>

6.1 一次性验证

用户注册成功后发一份激活邮件或者其他业务需要邮箱激活操作,都是可以使用 JWT。

原因:

  • JWT 时效性:
    • 让该链接具有时效性(比如约定2小时内激活)
  • JWT 不可篡改性(signature的保证):
    • 防止篡改以激活其他账户

6.2 JWT 令牌登录

就是前面说的,见到这个令牌就相当于见到用户~

也是JWT被诟病最多的地方,因为]WT令牌存在各种不安全。

  1. JWT令牌存储与客户端,容易泄露并被伪造身份搞破坏。
  2. JWT 被签发,就无法撤销,当破坏在进行时,后端无法马上禁止。

上面问题可通过监控异常 JWT 访问,设置黑名单+强制下线等方式尽量避免损失。

6.3 JWT 工具类

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>

据实际进行代码调整~

/**
 * JWT工具类
 */
@Slf4j
public class JwtUtil {

    public static final String JWT_HEADER = "Token";

    //设置秘钥明文
    private static final String JWT_KEY = SpringUtil.getProperty("key.jwt");

    private static final String applicationName = SpringUtil.getProperty("spring.application.name");

    public static final Long JWT_TTL = 1L; // 一天有效期

    public static final Long JWT_MAP_TTL = 6L; // 六小时

    public static final TimeUnit JWT_TTL_UNIT = TimeUnit.DAYS;

    public  static final TimeUnit JWT_MAP_TTL_UNIT = TimeUnit.HOURS;

    public static final String JWT_LOGIN_WX_USER = "jwtLoginWxUser:";

    public static final String JWT_LOGIN_EMAIL_USER = "jwtLoginEmailUser:";

    public static final String JWT_RAW_DATA_MAP = "jwtRawDataMap:";

    public static String getUUID(){
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }

    /**
     * 生成jwt
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject) {
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID(), null);// 设置过期时间
        return builder.compact();
    }
 
    /**
     * 生成jwt
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis, TimeUnit timeUnit) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID(), timeUnit);// 设置过期时间
        return builder.compact();
    }
 
    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid, TimeUnit timeUnit) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if (Objects.isNull(ttlMillis) || Objects.isNull(timeUnit)) { // 只有其中一个也等于没有
            ttlMillis = JWT_TTL_UNIT.toMillis(JwtUtil.JWT_TTL);
        } else {
            ttlMillis = timeUnit.toMillis(ttlMillis);
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
//                .setClaims() // 设置自定义载荷
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer(applicationName)     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate); // 失效时间
    }
 
    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis, TimeUnit timeUnit) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id, timeUnit);// 设置过期时间
        return builder.compact();
    }
 
    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody(); // 获得载荷
    }
    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static String parseJWTRawData(String jwt) {
        return parseJWT(jwt).getSubject();
    }

    public static <T> T getJwtKeyValue(String jwt, String key, Class<T> clazz) {
        return parseJWT(jwt).get(key, clazz);
    }

    public static Date getExpiredDate(String jwt) {
        Date result = null;
        try {
            result = parseJWT(jwt).getExpiration();
        } catch (ExpiredJwtException e) {
            result = e.getClaims().getExpiration();
        }
        return result;
    }

    public static String refreshToken(String jwt) {
        return createJWT(parseJWTRawData(jwt));
    }

    // 过期的话 parseJWT(jwt)会抛异常,也就是 “没抛异常能解析成功就是校验成功”,但是异常 ExpiredJwtException 的 getClaims 方法能获取到 payload
    public static boolean isTokenExpired(String jwt) {
        return getExpiredDate(jwt).before(new Date());
    }

    public static boolean validateToken(String jwt) {
        try {
            parseJWT(jwt);
        } catch (ExpiredJwtException e) {
            return false;
        }
        return true;
    }

}

7. JWT 避坑指南

JWT 无非就是泄露问题~

  • 毕竟它是无状态的,见到令牌就是见到用户

7.1 Redis 校验实现令牌泄露保护(Redis 处理泄露的 JWT )

因为 JWT 是无状态的,当 JWT 令牌颁发后,在有效时间内,是无法进行销毁,所以就存在很大隐患:令牌泄露

避坑:

  • 颁发 JWT 令牌时,在 Redis 中也缓存一份,当判定某个 JWT 泄露了,立即移除 Redis 中的 JWT
  • 当接口发起请求时,强制用户重新进行身份验证,直至验证成功。

7.2 临检 JWT 限制敏感操作

因为 JWT 是无状态的,泄露可能性大,进行一些敏感操作时需要进行临检操作。

避坑:

  • 强制重新检查用户身份,生成一个新的短时的 JWT 去进行敏感操作(当然,这个短时 JWT 与登录用户的 JWT 应该不同!并且登录用户的 JWT 不能用于进行敏感操作),判断操作者是用户本人

7.3 异常 JWT 监控判断:超频识别与限制

当 JWT 令牌被盗取,一般会出现高频次的系统访问。针对这种情况,监控用户端在单位时间内的请求次数,当单位时间内的请求次数超出预定阈值值,则判定该用户 JWT 令牌异常。

避坑:

  • 当判断 JWT 令牌异常,直接进行限制(比如:IP限流,JWT黑名单等)。

7.4 地域检查判断 JWT 泄露

一般用户活动范围是固定,意味着 JWT 客户端访问 IP 相对固定,JWT 泄露之后,可能会先异地登录的情况。

避坑:

  • 对 JWT 进行异地访问检查,有效时间内,IP 频繁变动或地域变动范围很大可判断为 JWT 泄露。

7.5 客户端检查判断 JWT 泄露

如果在很多设备上登录(请求携带不同设备机械码),很有可能,这个 JWT 泄露了

避坑:

  • 在 JWT 中保存生效的机器码可以是哪些(范围限制)
  • 在服务器保存这个 JWT 绑定的机械码(范围限制)
  • 限制 JWT 只能在 n 个不同设备上登录(次数限制)

7.6 JWT 令牌泄露预防:限时、限数、限频

JWT令牌泄露是无法避免,但是我们可以进行泄露识别,做好泄露后补救保证系统安全

避坑:

  • 对客户端进行合理限制,比如限制每个客户端的 JWT 令牌数量、访问频率、JWT令牌时效等,以降低 JWT令牌泄露的风险。
  • 减少JWT令牌时效也可以减少滥用时间~

8. JWT 常见面试题

8.1 什么是 JWT ?解释一下它的结构

JWT 是一种开放标准,用于在网络上安全地传输信息。它由三部分组成:头部、载荷和签名。头部包含令牌的元数据,载荷包含实际的信息(例如用户ID、角色等),签名用于验证令牌是否被篡改。

8.2 JWT 优点有哪些?它与传统的 session-based 身份验证相比有什么优缺点?

JWT 的优点包括无状态、可扩展、跨语言、易于实现和良好的安全性。相比之下,传统的 session-based 身份验证需要在服务端维护会话状态,使得服务端的负载更高,并且不适用于分布式系统

JWT 还不会出现 CSRF 漏洞

  • CSRF 攻击和防御 - Web 安全常识_哔哩哔哩_bilibili
  • 主要是,进入攻击者的页面是没有携带指定 JWT 令牌,并且一般 JWT 会习惯设置在请求头上~

8.3 在 JWT 的结构中,分别有哪些部分?每个部分的作用是什么?

JWT 的结构由三部分组成:头部、载荷和签名。头部包含令牌类型和算法,载荷包含实际的信息,签名由头部、载荷和密钥生成。

8.4 JWT 如何工作?从开始到验证过程的完整流程是怎样的?

JWT的工作流程分为三个步骤:生成令牌、发送令牌、验证令牌。在生成令牌时,服务端使用密钥对头部和载荷进行签名。在发送令牌时,将令牌发送给客户端。在验证令牌时,客户端从令牌中解析出头部和载荷,并使用相同的密钥验证签名。

可能包含第四个步骤:刷新令牌,当发觉令牌快过期了,生成新的令牌,发送新的令牌给客户端,之后客户端发的是新的令牌,验证令牌(由于无状态性,旧令牌依旧有效,除非自定义业务使其有了状态)

8.5 什么是 JWT 的签名?为什么需要对 JWT 进行签名?如何验证 JWT 的签名?

JWT 的签名是由头部、载荷和密钥生成的,用于验证令牌是否被篡改。签名使用HMAC算法或RSA算法生成。在验证JWT的签名时,客户端使用相同的密钥和算法生成签名,并将生成的签名与令牌中的签名进行比较。

8.6 什么是 JWT 的令牌刷新?为什么需要这个功能?

令牌刷新是一种机制,用于解决 JWT 过期后需要重新登录的问题。在令牌刷新中,服务端生成新的 JWT,并将其发送给客户端。客户端使用新的 JWT 替换旧的 JWT,从而延长令牌的有效期。

8.7 JWT 是否加密?如果是,加密的部分是哪些?如果不是,那么它如何保证数据安全性?

JWT 本身并不加密(虽然说 Base64 加密,但那只不过是浓缩罢了,一点都不秘密),而是使用签名来保证数据的完整性和认证信息的可靠性(通过 header 提供的加密算法,计算 signature 就涉及加密)

但可以在载荷中包含敏感信息,为了保护这些信息,可以使用 JWE (SON Web Encryption)对载荷进行加密。如果不加密,则需要在生成 JWT 时确保不在载荷中包含敏感信息。

8.8 在 JWT 中,如何处理 Token 过期的问题?有哪些方法可以处理?

JWT 过期后,客户端需要重新获取新的 JWT 。(过期也能获得payload的,通过抛出的异常 ExpiredJwtException 的 getClaims 方法能获取到 payload)

自定义refresh token机制来解决快要过期的问题。

8.9 JWT 和 OAuth2.0 有什么关系?它们之间有什么区别?

JWT 和 OAuth2.0 都是用于身份验证和授权的开放标准。JWT 是一种身份验证机制,而 OAuth2.0 是一种授权机制。JWT 用于在不同的系统中安全地传输信息,OAuth2.0 用于授权第三方应用程序访问受保护的资源。

8.10 JWT 在什么场景下使用较为合适?它的局限性是什么?

JWT 在单体应用或微服务架构中的使用比较合适。它的局限性包括无法撤销、令牌较大、无法处理并发等问题。

性和认证信息的可靠性(通过 header 提供的加密算法,计算 signature 就涉及加密)

但可以在载荷中包含敏感信息,为了保护这些信息,可以使用 JWE (SON Web Encryption)对载荷进行加密。如果不加密,则需要在生成 JWT 时确保不在载荷中包含敏感信息。

8.8 在 JWT 中,如何处理 Token 过期的问题?有哪些方法可以处理?

JWT 过期后,客户端需要重新获取新的 JWT 。(过期也能获得payload的,通过抛出的异常 ExpiredJwtException 的 getClaims 方法能获取到 payload)

自定义refresh token机制来解决快要过期的问题。

8.9 JWT 和 OAuth2.0 有什么关系?它们之间有什么区别?

JWT 和 OAuth2.0 都是用于身份验证和授权的开放标准。JWT 是一种身份验证机制,而 OAuth2.0 是一种授权机制。JWT 用于在不同的系统中安全地传输信息,OAuth2.0 用于授权第三方应用程序访问受保护的资源。

8.10 JWT 在什么场景下使用较为合适?它的局限性是什么?

JWT 在单体应用或微服务架构中的使用比较合适。它的局限性包括无法撤销、令牌较大、无法处理并发等问题。

适合去做“一次性验证”与“登录令牌”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、pyttsx3的preprocess_text函数文本预处理基本用法示例代码二、实现更复杂的文本预处理逻辑示例代码三、去除停用词、词干提取示例代码四、词形还原、拼写纠正示例代码五、…

19-k8s的附加组件-coreDNS组件

一、概念 coreDNS组件&#xff1a;就是将svc资源的名称解析成ClusterIP&#xff1b; kubeadm部署的k8s集群自带coreDNS组件&#xff0c;二进制部署需要自己手动部署&#xff1b; [rootk8s231 ~]# kubectl get pods -o wide -A k8s系统中安装了coreDNS组件后&#xff0c;会有一个…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

国际章真厉害,离婚后仍带汪峰继女小苹果赴日滑雪。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在如今这个纷繁复杂的社会中&#xff0c;家庭关系和亲子关系的…

K8S | 全面解读CKA认证的重要性!

K8S认证工程师&#xff08;CKA&#xff09;备考与学习指南https://blog.csdn.net/XMWS_IT/article/details/133697915?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170849020616800182129977%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2…

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net&#xff0c;选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源&#xff0c;建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…

学习并理解SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

【RN】为项目使用React Navigation中的navigator

简言 移动应用基本不会只由一个页面组成。管理多个页面的呈现、跳转的组件就是我们通常所说的导航器&#xff08;navigator&#xff09;。 React Navigation 提供了简单易用的跨平台导航方案&#xff0c;在 iOS 和 Android 上都可以进行翻页式、tab 选项卡式和抽屉式的导航布局…

防御第六次作业-防火墙综合实验(av、url过滤、dns过滤)

目录 拓扑图&#xff1a; 要求&#xff1a; 8 9 10 11 拓扑图 要求 前7个要求在上一篇博客&#xff1b; 8.分公司内部的客户端可以通过域名访问到内部的服务器 9.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要…

安装unget包 sqlsugar时报错,完整的报错解决

前置 .net6的开发环境 问题 ? 打开unget官网&#xff0c;搜索报错的依赖Oracle.ManagedDataAccess.Core unget官网 通过unget搜索Oracle.ManagedDataAccess.Core查看该依赖的依赖 发现应该是需要的依赖Oracle.ManagedDataAccess.Core(>3.21.100)不支持.net6的环境 解…

加载arcgis切片服务网络请求有大量404错误

需求&#xff1a; 前端访问arcgis切片服务时&#xff0c;在网络请求中出现大量404&#xff08;Not Found&#xff09;错误&#xff0c;切片时设置了感兴趣区域&#xff0c;在感兴趣范围内请求切片时能够正常返回切片。 问题分析&#xff1a; 设置感兴趣区域切片的目的是减少站…

基于Mapbox展示GDAL处理的3D行政区划展示实践

目录 前言 一、Gdal数据处理 1、数据展示 2、Java数据转换 二、Mapbox可视化 1、定义Mapbox地图 2、地图初始化 3、创建地图 三、界面优化 1、区域颜色设置 2、高度自适应和边界区分 3、中文标注 总结 前言 最近有遇到一个需求&#xff0c;用户想在地图上把行政区划…

IP地理位置查询定位:技术原理与实际应用

在互联网时代&#xff0c;IP地址是连接世界的桥梁&#xff0c;而了解IP地址的地理位置对于网络管理、个性化服务以及安全监控都至关重要。IP数据云将深入探讨IP地理位置查询定位的技术原理、实际应用场景以及相关的隐私保护问题&#xff0c;旨在为读者提供全面了解和应用该技术…

海外媒体发稿:提高用户留存率的7个链游媒体宣发推广策略-华媒舍

在当今数字化时代&#xff0c;移动链游已经成为人们生活中不可或缺的一部分。随着链游市场日益竞争激烈&#xff0c;如何提高用户留存率成为了游戏开发者和媒体宣发人员需要面对的重要问题。本文将为您介绍7个有效的链游媒体宣发推广策略&#xff0c;帮助您提高用户留存率。 1.…

Unity编辑器扩展之Text组件中字体替换工具

想要批量化替换项目预制体资源中Text组件引用的Font字体文件&#xff0c;可以采用以下步骤。 1、在项目的Editor文件中&#xff0c;新建一个名为FontToolEditor的C#脚本文件&#xff0c;然后把以下代码复制粘贴到新建的FontToolEditor的C#脚本文件中。 using System.Collect…

哪款护眼台灯适合孩子用?五大爆款选购指南分享

护眼台灯凭借各种好处让很多家长都为孩子选择。但是许多想要选择护眼台灯的家长们&#xff0c;各种台灯不能盲目入手&#xff0c;因为市面上存在各种生产实力不足&#xff0c;做工差&#xff0c;以及选材廉价等问题的劣质产品。那么护眼台灯要怎么选&#xff1f;关于这个问题&a…

2024牛客寒假算法基础集训营4(视频讲解题目)

2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; 视频链接ABCDEFG、H&#xff08;下面是hard版本的代码两个都可以过&#xff09; 视频链接 2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; A #include<bits/stdc.h> #define en…

在Win系统部署WampServer并实现公网访问本地服务【内网穿透】

目录 推荐 前言 1.WampServer下载安装 2.WampServer启动 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0…

Windows系统安全策略设置之本地NTLM重放提权

经安全部门研究分析&#xff0c;近期利用NTLM重放机制入侵Windows 系统事件增多&#xff0c;入侵者主要通过Potato程序攻击拥有SYSTEM权限的端口伪造网络身份认证过程&#xff0c;利用NTLM重放机制骗取SYSTEM身份令牌&#xff0c;最终取得系统权限&#xff0c;该安全风险微软并…