JWT(JSON Web Token)是一种开放标准(RFC 7519),用于安全地在各方之间传递信息。JWT 是经过编码的 JSON 对象,包含三部分:头部(Header)、载荷(Payload)和签名(Signature)。由于信息是以 JSON 格式传递,JWT 在Web应用程序中尤其常用,常用于身份验证和信息交换。

JWT的基本结构

一个完整的JWT由三部分组成,分别用“.”分隔:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
  1. Header:头部通常包含两个部分:令牌的类型(即JWT)以及所使用的签名算法(例如HMAC SHA256或RSA)。

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

  2. Payload:载荷部分包含所要传递的声明(claims)。声明可以分为三类:

  3. 注册声明(Registered claims):一组预定义的声明,如iss(发行者)、exp(过期时间)、sub(主题)等。
  4. 公共声明(Public claims):自定义的声明,必须避免碰撞。
  5. 私有声明(Private claims):双方同意使用的声明。

    示例:

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

  6. Signature:签名部分由头部和载荷生成,需要一个密钥。用于验证发送者的身份,以及确保消息在传输过程中未被篡改。

    shell HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret)

JWT的使用场景

JWT最常见的用途是身份验证。在用户登录后,服务器生成一个JWT并将其返回给用户,用户在后续的请求中携带该JWT,服务器通过验证JWT来识别用户身份。

代码示例(Node.js)

以下是一个简单的Node.js示例,演示了如何生成和验证JWT:

const jwt = require('jsonwebtoken');

// 定义密钥
const secretKey = 'my_secret_key';

// 生成JWT
function generateToken(user) {
    const token = jwt.sign({ id: user.id, name: user.name }, secretKey, { expiresIn: '1h' });
    return token;
}

// 验证JWT
function verifyToken(token) {
    try {
        const decoded = jwt.verify(token, secretKey);
        return decoded;
    } catch (error) {
        return null; // 验证失败
    }
}

// 示例用户
const user = { id: 1, name: 'John Doe' };

// 生成token
const token = generateToken(user);
console.log('Generated JWT:', token);

// 验证token
const decoded = verifyToken(token);
if (decoded) {
    console.log('Decoded JWT:', decoded);
} else {
    console.log('Token is invalid');
}

总结

JWT 是一种高效、安全的信息交换方式。它的自包含特性使得在多种环境(如移动应用和微服务架构)中都可以使用。通过加密和签名,JWT 可以有效地防止数据篡改和伪造。在实际应用中,开发者需要仔细设计用于敏感数据的JWT,并确保使用安全的密钥和算法,以最大程度地保护用户信息和应用的安全。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部