华为一面:谈谈你对JWT的理解?

开发 前端
JWT 提供了一种有效的方法来处理用户身份验证和信息交换的问题,也是目前主流的用户登录验证机制,但同时也需要注意上述提到的一些潜在风险和限制,它更适用于分布式大型项目的用户信息传输和登录权限判断。

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。其核心特点是通过紧凑且自包含的 JSON 对象传递数据,无需服务端存储会话状态。

1.为什么需要JWT?

开发中需要 JWT 的主要原因是为了解决传统基于 Session 的身份验证方法中存在的问题,比如跨域认证不便、扩展性差等问题。而 JWT 允许我们设计无状态的、分布式的 Web 应用,通过在每个请求中传递 Token 来验证用户身份,从而实现更加灵活和可扩展的架构。

2.执行流程

JWT 执行流程如下:

它的主要执行流程如下:

  • 用户登录成功后,服务器根据用户信息生成一个 JWT 的 Token 令牌。
  • 服务器将此 Token 返回给客户端,客户端通常存储在 Cookie 或 LocalStorage 中。
  • 之后客户端在访问服务器端时会携带这个 Token,一般放在 HTTP 头中。
  • 服务器接收到请求后,解析 JWT,验证其签名有效性以及是否过期。
  • 如果验证成功,则处理相应的请求;否则,返回错误信息(重新登录)。

3.JWT组成

JWT 是由三部分组成的:

  • Header(头部):通常由以下两部分组成:

a.Token 类型:通常是 JWT。

b.加密算法:例如 HS256(HMAC SHA-256)、RS256(RSA SHA-256)等。

  • Payload(载荷) :JWT 的主体部分,通常为以下三类:
  • 标准声明(Registered Claims):预定义的字段,如 iss(发行者)、exp (过期时间)、sub(主题)等。
  • 公共声明(Public Claims):用户自定义的字段,例如用户 ID、用户名、角色等。
  • 私有声明(Private Claims):在特定场景下使用的字段,通常用于内部系统。
  • Signature(签名):用于验证 Token 的完整性和防止篡改。

它们之间用点“.”分隔,形成一个字符串(Token)。

4.JWT核心实现代码

在 Spring Boot 项目中,首先要引入 JWT 工具依赖,之后通过以下核心代码可以生成 Token,以及验证 Token:

// 生成 JWT(示例)|SECRET_KEY 为服务保存的密钥。
public String generateToken(UserDetails user) {
    return Jwts.builder()
        .setSubject(user.getUsername())
        .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
        .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
        .compact();
}

// 验证 JWT(示例)
public boolean validateToken(String token) {
    try {
        Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
        return true;
    } catch (Exception e) {
        return false;
    }
}

注意事项

  • 密钥安全:签名密钥需妥善保管,并定期修改,避免泄露。
  • 无状态性:JWT 无需服务端存储会话信息,适合分布式系统。

5.JWT VS Session

JWT 和 Session 主要区别如下:

  • 存储位置不同:Session 通常将用户会话信息存储在服务器端,而 JWT 则将信息存储在客户端。
  • 状态管理不同:Session 是基于服务端的状态机制,需要服务器保存会话状态;JWT 是无状态的,所有的信息都包含在 Token 中,服务端无需保存任何状态。
  • 隐私性不同:由于 JWT 的信息直接暴露给用户,因此敏感信息不应该存储在 JWT 中。Session 因为只在服务端维护,隐私性相对更好一些。
  • 扩展性和性能不同:JWT 非常适合分布式系统,因为它不依赖于服务端的状态。对于大型分布式系统,JWT 可以显著减少服务器资源的消耗,提高系统的响应速度。

6.JWT存在的问题

尽管 JWT 有很多优点,但也存在一些挑战:

  • 大小限制:由于 JWT 是以 HTTP 头部的形式发送的,所以它的大小受到限制。如果 JWT 中包含过多的数据,可能会导致请求头过长的问题。解决办法是尽量保持 JWT 简洁,仅包含必要的信息。
  • 令牌撤销问题:一旦 JWT 被签发,除非过期,否则无法轻易撤销。
  • 安全性考虑:虽然 JWT 本身支持签名和加密,但如果密钥泄露,将会导致严重的安全隐患。因此,确保密钥的安全管理和定期更新是非常重要的。

小结

JWT 提供了一种有效的方法来处理用户身份验证和信息交换的问题,也是目前主流的用户登录验证机制,但同时也需要注意上述提到的一些潜在风险和限制,它更适用于分布式大型项目的用户信息传输和登录权限判断。

责任编辑:武晓燕 来源: 磊哥和Java
相关推荐

2023-11-28 12:25:02

多线程安全

2022-06-30 09:10:33

NoSQLHBaseRedis

2022-09-19 07:57:59

云服务互联网基础设施

2024-09-11 16:49:55

2024-09-20 05:46:00

2022-08-14 07:14:50

Kafka零拷贝

2022-10-09 15:18:31

SwaggerOpenAPI工具

2022-09-09 10:15:06

OAuthJava

2022-08-26 00:21:44

IO模型线程

2024-10-24 16:14:43

数据传输CPU零拷贝

2022-03-21 09:05:18

volatileCPUJava

2022-09-23 11:00:27

KafkaZookeeper机制

2024-12-06 14:34:00

Spring过滤器

2025-02-21 15:25:54

虚拟线程轻量级

2022-09-06 11:13:16

接口PipelineHandler

2024-09-27 15:43:52

零拷贝DMAIO

2022-07-26 07:51:40

ThreadRunnableFuture

2022-06-10 11:51:49

MySQL事务隔离

2022-08-26 00:02:03

RocketMQ单体架构MQ

2024-08-27 12:36:33

点赞
收藏

51CTO技术栈公众号