JWT简介

JWT概念

直观地来说,**JWT** 是一段用于标识用户身份的 **字符串**。

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间以JSON对象的形式安全地传输信息。它通常用于在用户身份验证后,在客户端和服务端之间安全地传递信息,以实现无状态的身份验证机制。

JWT格式

JWT 字符串由三部分组成,它们之间用英文句点(.)分隔,格式:”Header.Payload.Signature“。例子

1
2
3
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VybmFtZSI6Ind3dy5iZWpzb24uY29tIiwic3ViIjoiZGVtbyIsImlhdCI6MTc0NTEyNzEwOCwibmJmIjoxNzQ1MTI3MTA4LCJleHAiOjE3NDUyMTM1MDh9.
vsptj95ICeZoP8zVtYiXRaDbiS31wuGmdsMdNcxwU-E
  • Header(头部) 包含令牌的类型(JWT)和使用的签名算法(如 HMAC SHA256RSA)。

    1
    2
    3
    4
    {
    "alg": "HS256",
    "typ": "JWT"
    }
  • Payload(载荷) 包含声明(claims),即要传递的具体信息。

    1
    2
    3
    4
    {
    "username": "John Doe",
    "admin": true
    }
  • Signature(签名) 用于验证消息的发送者以及消息在传输过程中没有被修改。

Nodejs实现

生成JWT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const crypto = require('crypto');

// 签名函数
function sign(info, key) {
const hmac = crypto.createHmac('sha256', key);
hmac.update(info);
return hmac.digest('hex');
}

// JWT函数
function jwt(info, key) {
// 头部
const header = {
alg: 'HS256',
typ: 'JWT'
};
// 有效载荷
const payload = {
info: info,
exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1小时过期
};
// 编码
const base64Header = Buffer.from(JSON.stringify(header)).toString('base64url');
const base64Payload = Buffer.from(JSON.stringify(payload)).toString('base64url');
// 签名
const signature = sign(`${base64Header}.${base64Payload}`, key);
// 返回JWT
return `${base64Header}.${base64Payload}.${signature}`;
}

测试JWT

1
2
3
4
5
// 测试
const secret = 'mysecretkey';
const info = { username: 'admin' };
const token = jwt(info, secret);
console.log('生成的JWT:', token);

解码JWT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25


// 验证函数
function verify(token, key) {
const parts = token.split('.');
if (parts.length !== 3) {
return false;
}
const [header, payload, signature] = parts;
// 验证签名
const validSignature = sign(`${header}.${payload}`, key);
if (validSignature !== signature) {
return false;
}
// 解码有效载荷
const decodedPayload = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
// 检查过期时间
if (decodedPayload.exp < Math.floor(Date.now() / 1000)) {
return false;
}
return decodedPayload.info;
}

const verifiedInfo = verify(token, secret);
console.log('验证后的信息:', verifiedInfo);

JWT简介
https://jacksiongt.github.io/2025/04/20/JWT/
作者
Jacksion
发布于
2025年4月20日
许可协议