如何使用 JWT 进行用户认证?

JWT 是一种开放标准,用于安全的用户身份验证。本文介绍了 JWT 的基本原理和在用户认证中的使用流程以及注意事项。

前端安全 中等 JWT 认证 安全

JWT 是一种开放标准(RFC 7519),用于安全的用户认证。以下是分步介绍其使用方法,结合实际最佳实践。

1. 理解 JWT 基本原理

JWT 由三部分组成,以点(.)分隔:

  • Header(头部):定义令牌类型和签名算法(如 HS256 或 RS256)。
  • Payload(负载):包含声明数据,如用户 ID、权限、过期时间(exp),不含敏感信息。
  • Signature(签名):用服务器密钥对 Header + "." + Payload 加密的结果,防止篡改。 整体形式: Header.Payload.Signature

2. 用户认证流程

  1. 用户登录:客户端发送用户名和密码到登录 API(示例代码:)
    fetch('/api/login', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify({ username: 'user', password: 'pass' })
    });
    
  2. 服务器生成 JWT:验证凭证通过后,服务器创建并签名 JWT。使用密钥如 HS256:
    // Spring Boot 示例伪代码
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    
    public String generateToken(User user) {
      return Jwts.builder()
          .setSubject(user.getId())
          .signWith(SignatureAlgorithm.HS256, "secretKey")
          .compact();
    }
    
  3. 客户端存储 JWT:服务器将 JWT 返回客户端。建议存入 localStoragesessionStorage,或在 Cookie 中添加 Authorization: Bearer token 头。避免使用 Cookie 以避免跨域问题。
  4. 后续请求验证:客户端在需要认证的请求中添加 Authorization 头:
    fetch('/api/protected', {
      headers: {
        'Authorization': 'Bearer ' + token // token 为 JWT 值
      }
    });
    
  5. 服务器验证 JWT:服务器通过解密签名并与密钥重新生成的结果比对来验证合法性和过期时间:
    public boolean validateToken(String token) {
      try {
        Jwts.parser().setSigningKey("secretKey").parseClaimsJws(token);
        return true; // 合法则处理请求
      } catch (Exception e) {
        return false; // 无效则拒绝访问
      }
    }
    

    3. 安全注意事项

    • 传输方式:务必通过 HTTPS 防止拦截。
    • 敏感数据:不在 Payload 中暴露密码或敏感值。
    • 签名密钥:使用强密钥并保存在服务器端。
    • 跨域优势:利用 Stateless(无状态)特性适用于分布式系统。

此实现能安全管理用户认证。