防弹JWT身份验证:生产应用程序的基本安全模式

JSON Web Tokens (JWT) 身份验证因其简单性和可扩展性而成为现代 Web 应用程序的基石。然而,安全地实施 JWT 需要遵守最佳实践。以下指南可帮助您有效地保护您的应用程序。

核心安全原则

**代币结构和验证**

使用强签名算法

  • 选择非对称算法(如 RS256)而不是对称算法(如 HS256),以增强安全性。
  • 实施严格的有效负载验证

    验证令牌中的每个声明以确保完整性。

    包括基本主张

  • 结合 iat(发行时间)、exp(到期时间)、aud(受众)、iss(发行人)和 sub(主题)等声明,以加强令牌的目的和有效性。
  • const token = jwt.sign(
      {
        sub: user.id,
        iss: 'your-app-name',
        aud: 'your-api',
        iat: Math.floor(Date.now() / 1000),
        exp: Math.floor(Date.now() / 1000) + (60 * 60), // 1 hour
      },
      privateKey,
      { algorithm: 'RS256' }
    );

    **存储和传输**

    使用 HttpOnly Cookies

  • 将令牌存储在 HttpOnly cookie 中,以防止客户端 JavaScript 访问,从而减轻 XSS 风险。
  • res.cookie('access_token', token, {
      httpOnly: true,
      secure: true,
      sameSite: 'strict',
      maxAge: 3600000, // 1 hour
    });

    启用安全标志。

  • 确保启用 secure 和 sameSite 属性,以减少令牌传输期间的暴露。
  • 应避免的常见陷阱

    **令牌失效**

    将被撤销的令牌列入黑名单。

  • 维护服务器端令牌黑名单,以有效地使受损的令牌无效。
  • 使用较短的到期时间。

  • 将短期访问令牌与刷新令牌配对,以更好地控制会话生命周期。
  • **XSS 和 CSRF 保护**

    避免将 JWT 存储在 LocalStorage 中。

  • LocalStorage 容易受到 XSS 攻击。首选 HttpOnly cookie。
  • 使用 CSRF 令牌。

  • 对于状态改变操作,实现 CSRF 令牌以防止跨站点请求伪造。
  • 启用内容安全策略 (CSP)

  • 设置 CSP 标头以阻止恶意脚本。
  • **秘密管理**

    使用非对称密钥。

  • 依靠公钥/私钥对来签名和验证令牌。
  • 定期轮换密钥。

  • 定期更新密钥,以在发生泄露时限制暴露。
  • 避免硬编码秘密。

  • 使用环境变量或秘密管理工具,并将敏感数据置于版本控制之外。
  • 生产最佳实践

    **Token验证中间件**

    实现中间件来验证令牌并安全地执行身份验证:

    const verifyToken = async (req, res, next) => {
      try {
        const token = req.cookies.access_token;
        const decoded = await jwt.verify(token, publicKey, {
          algorithms: ['RS256'],
          issuer: 'your-app-name',
          audience: 'your-api',
        });
    
        if (await isTokenBlacklisted(token)) {
          throw new Error('Token revoked');
        }
    
        req.user = decoded;
        next();
      } catch (err) {
        res.status(401).json({ error: 'Authentication failed' });
      }
    };

    **分层安全**

    JWT 身份验证只是强大安全策略的一个方面。补充以下内容:

    速率限制

  • 通过限制每个用户/IP 的请求数量来减轻暴力攻击。
  • 正确的错误处理

  • 避免在响应中暴露敏感的错误细节。
  • 定期安全审核

  • 进行定期审查和渗透测试以识别漏洞。
  • 通过遵循这些做法,您可以构建安全、可扩展且有弹性的 Web 身份验证系统。**请记住,安全是一个过程,而不是目的地。**