js jwt认证的工作原理

js jwt认证的工作原理

js jwt认证的工作原理

什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传输信息的可靠、自包含的方式。它由三部分组成,分别是 Header(头部)、Payload(负载)和 Signature(签名)。

JWT的结构

Header(头部)

头部通常由两部分组成:令牌的类型(即 JWT)和所使用的签名算法。通常,头部会使用 Base64 编码。

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

Payload(负载)

负载是 JWT 的第二部分,包含一些声明(claim)的注册信息和其他需要传递的数据。声明可以是标准声明(如iss(签发者),exp(过期时间)等),也可以是自定义的声明。负载也是以 Base64 编码的形式出现。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature(签名)

签名部分使用了HeaderPayload和一个秘钥进行加密,防止数据篡改。签名值的生成需要使用指定的算法。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret
)

最终的 JWT 是将编码后的 Header、Payload 和 Signature 三部分用点号连接起来的字符串。

JWT的工作流程

  1. 用户使用用户名和密码进行身份验证,服务端验证用户名和密码的正确性。

  2. 服务端生成 JWT,并将 JWT 返回给用户。

  3. 用户将 JWT 存储在客户端,一般存储在 Local Storage 或者 Session Storage 中。

  4. 用户在每次请求时将 JWT 添加到请求头的 Authorization 字段中。

Authorization: Bearer <token>
  1. 服务端解析 JWT 中的数据,并进行有效性验证,返回相应的数据。

JWT的优点和缺点

优点

  • 无状态:JWT 实现了无状态的认证和授权机制,服务端不需要记录任何会话信息。

  • 跨域支持:由于 JWT 是由服务端生成的,可以在跨域的情况下安全地使用。

  • 可拓展性:负载中可以加入自定义的声明,方便进行用户认证和其他业务扩展。

缺点

  • 无法废止:当 JWT 发行后,无法废止,只能依靠 token 过期时间和刷新机制来保证安全性。

  • 数据量较大:由于 JWT 包含了很多信息,所以相对于其他认证方式(如 Session),数据量较大。

  • 无法废止:当 JWT 发行后,无法废止,只能依靠 token 过期时间和刷新机制来保证安全性。

使用Node.js实现JWT

以下是使用 Node.js 实现 JWT 认证的示例代码:

const jwt = require('jsonwebtoken');
const secretKey = 'mySecretKey';

// 生成JWT
const generateJWT = () => {
  const payload = {
    sub: '1234567890',
    name: 'John Doe',
    admin: true
  };

  const options = {
    expiresIn: '1h'
  };

  return jwt.sign(payload, secretKey, options);
};

// 解析JWT
const verifyJWT = (token) => {
  return jwt.verify(token, secretKey, (err, decoded) => {
    if (err) {
      console.log('JWT verification failed.');
      return false;
    }

    console.log('JWT verified successfully.');
    console.log(decoded);
    return true;
  });
};

// 测试生成和验证JWT
const token = generateJWT();
verifyJWT(token);

下面是代码的运行结果:

JWT verified successfully.
{
  sub: '1234567890',
  name: 'John Doe',
  admin: true,
  iat: 1625126321,
  exp: 1625130121
}

总结

JWT 是一种在网络应用间传输信息的可靠、自包含的方式。它由 Header、Payload 和 Signature 三个部分组成,通过使用密钥对其进行加密和验证。JWT具有无状态、跨域支持和可拓展性等优点,但也存在无法废止和数据量较大等缺点。在 Node.js 中,可以使用jsonwebtoken库来方便地生成和验证JWT。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程