首页 前端知识 【权限管理】JWT(JSON Web Token)详细教程和说明

【权限管理】JWT(JSON Web Token)详细教程和说明

2025-02-27 11:02:29 前端知识 前端哥 230 927 我要收藏

JWT(JSON Web Token)是一种基于 JSON 的开放标准(RFC 7519),用于安全地在用户和服务器之间传递信息。JWT 被广泛用于认证和信息交换,尤其是在单点登录(SSO)和微服务架构中。它主要由三部分组成:Header(头部)Payload(负载)Signature(签名)

1. JWT 结构

JWT 由三部分组成,每部分使用 Base64 编码,并通过 "." 分隔:

  1. Header(头部)

    • 通常由两部分组成:
      • alg:指定签名算法(如 HMAC SHA256 或 RSA)。
      • typ:表示令牌的类型,通常为 JWT

    头部示例:

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

  2. Payload(负载)

    • 包含声明(Claims)。声明是一组键值对,通常用于存储用户信息、权限、令牌的过期时间等。
    • 声明分为三种类型:
      • 注册声明(Registered Claims):预定义的标准字段,例如 iss(发行者),exp(过期时间),sub(主题),aud(受众)等。
      • 公共声明(Public Claims):可以自定义的字段,避免冲突的标准做法是使用 URI(如 example.com)。
      • 私有声明(Private Claims):自定义的声明,只有发送者和接收者理解。

    示例:

    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    

  3. Signature(签名)

    • 用于验证 JWT 数据的完整性和来源。签名是通过将 HeaderPayload 的 Base64Url 编码后的结果拼接在一起,然后使用指定的算法(如 HMAC SHA256)和一个密钥进行加密生成的。
    • 签名的作用是确保传输过程中,HeaderPayload 未被篡改。

    生成签名的公式:

    Signature = HMACSHA256(
      base64UrlEncode(Header) + "." + base64UrlEncode(Payload),
      secret)
    

最终生成的 JWT 结构如下:

<Header>.<Payload>.<Signature>

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2. JWT 工作原理

JWT 通常用于 用户认证(Authentication)和 信息交换(Information Exchange)。

认证(Authentication)
  1. 用户通过登录界面输入用户名和密码。
  2. 服务器验证用户的凭证后,生成一个 JWT,并将其返回给用户(通常是在响应头中或响应体内)。
  3. 用户将该 JWT 存储在客户端(如 LocalStorage 或 Cookie 中)。
  4. 用户在后续的请求中,通过将 JWT 附加在 HTTP 请求头的 Authorization 字段中发送给服务器:
    Authorization: Bearer <JWT>
    

  5. 服务器接收到请求后,解码 JWT 并验证其签名,确保请求未被篡改。验证通过后,服务器会根据 JWT 中的信息识别用户并提供资源。
信息交换(Information Exchange)

由于 JWT 的负载部分可以存储任何信息,因此它非常适合用于安全的信息交换。在使用 JWT 进行信息交换时,可以加密 JWT 内容来确保信息的安全性。

3. JWT 的声明类型

JWT 中的声明分为三种类型:

  1. 注册声明(Registered Claims): 这些是 JWT 中预定义的标准字段,广泛用于验证 JWT 的有效性。

    • iss(Issuer):发行者,JWT 的发布者。
    • sub(Subject):主题,JWT 的主体,通常是用户ID或会话ID。
    • aud(Audience):受众,表示该 JWT 的目标用户。
    • exp(Expiration):过期时间,指定 JWT 的有效期。
    • nbf(Not Before):生效时间,指定 JWT 从何时开始有效。
    • iat(Issued At):发行时间,表示 JWT 的创建时间。
    • jti(JWT ID):JWT 的唯一标识符。
  2. 公共声明(Public Claims): 这些声明由用户自定义,可以存储任意信息,如用户角色等。为了避免冲突,推荐使用 URL 作为命名空间。

  3. 私有声明(Private Claims): 这些声明是自定义的,并且只有发送者和接收者能理解。它们用于满足特定应用场景的需求。

4. JWT 使用流程

1. 用户登录并获取 JWT:

  • 用户提交用户名和密码给服务器。
  • 服务器验证凭证,如果有效,则生成 JWT 返回给客户端。

2. 客户端使用 JWT 进行认证:

  • 客户端将 JWT 存储(通常在浏览器的 localStorage 或 cookie 中)。
  • 每次发起请求时,将 JWT 附加在请求头中。
  • 服务器接收请求后验证 JWT 的签名和有效期,确保请求有效。

3. 服务器验证 JWT:

  • 服务器通过解码 JWT,并验证签名,确保该 JWT 未被篡改。
  • 如果验证通过,服务器会根据 JWT 中的信息,识别用户身份并处理请求。

5. JWT 在 Java 中的实现

在 Java 中,使用 jjwtjava-jwt 等库来生成和解析 JWT。

使用 jjwt 创建 JWT
  1. 添加 Maven 依赖

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

  2. 生成 JWT

    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import java.util.Date;
    
    public class JwtExample {
        public static void main(String[] args) {
            String jwt = Jwts.builder()
                    .setSubject("1234567890")
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60)) // 1小时有效期
                    .signWith(SignatureAlgorithm.HS256, "secretkey") // 使用密钥加密
                    .compact();
    
            System.out.println("Generated JWT: " + jwt);
        }
    }
    

  3. 解析 JWT

    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.Claims;
    
    public class JwtParserExample {
        public static void main(String[] args) {
            String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
            Claims claims = Jwts.parser()
                    .setSigningKey("secretkey")
                    .parseClaimsJws(jwt)
                    .getBody();
    
            System.out.println("Subject: " + claims.getSubject());
            System.out.println("Name: " + claims.get("name"));
        }
    }
    

6. JWT 的优缺点

优点
  • 无状态:服务器无需存储会话信息,每个请求都包含完整的身份信息。
  • 跨平台支持:JWT 是 JSON 格式的,可以在不同平台和服务间轻松传输。
  • 安全性:JWT 的签名确保数据完整性和防篡改。
缺点
  • 暴露令牌:JWT 一旦泄露,攻击者可以用它进行伪造请求。
  • 无法撤销:一旦 JWT 被颁发,它的有效性只能通过过期时间控制,不能像 Session 一样方便地被撤销。
  • 存储问题:JWT 通常会存储在浏览器的 LocalStorage 或 Cookie 中,如果存储不当可能面临 XSS 或 CSRF 攻击。

7. 总结

JWT 是一种轻量级且安全的信息传递机制,广泛应用于现代 Web 开发中。它为 Web 应用程序提供了灵活、无状态的认证和授权方式,尤其适用于分布式系统、单点登录(SSO)和微服务架构等场景。然而,正确的安全措施(如密钥管理、加密和令牌有效期控制)是确保 JWT 安全的关键。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/21666.html
标签
评论
发布的文章

Opencv [去除水印]

2025-02-27 11:02:42

0基础学前端-----CSS DAY13

2025-02-27 11:02:41

蓝桥杯之日期题

2025-02-27 11:02:39

模拟算法.

2025-02-27 11:02:39

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!