JWT 与 cookie 用于基于令牌的身份验证

作者:编程家 分类: js 时间:2025-11-23

JWT(JSON Web Token)和cookie是两种常用的基于令牌的身份验证方式。在本文中,我们将探讨这两种方式的特点和使用场景,并提供一些案例代码来说明它们的用法。

JWT(JSON Web Token)

JWT是一种用于跨域身份验证的开放标准,它使用JSON格式将信息进行编码和签名,以生成一个安全的令牌。JWT由三个部分组成:头部、负载和签名。头部包含算法和令牌类型的信息,负载包含用户的相关信息,签名用于验证令牌的完整性。

JWT的优点之一是无状态性,即服务器不需要存储任何会话信息。每次请求都包含了用户的身份验证信息,服务器只需对令牌进行验证和解析即可。这使得JWT非常适合于分布式系统和微服务架构。

使用JWT进行身份验证的流程如下:

1. 用户通过用户名和密码进行登录。

2. 服务器验证用户的登录信息,并生成一个JWT。

3. 服务器将JWT发送回客户端,并存储在客户端的本地存储或会话中。

4. 客户端在后续的请求中将JWT添加到请求的头部或参数中。

5. 服务器接收到请求后,解析JWT并验证其完整性和有效性。

6. 如果JWT验证通过,服务器允许用户访问受保护的资源。

下面是一个使用Node.js和jsonwebtoken库实现JWT身份验证的案例代码:

javascript

const jwt = require('jsonwebtoken');

// 生成JWT

const generateToken = (user) => {

const payload = {

id: user.id,

username: user.username,

role: user.role,

};

const secretKey = 'your-secret-key';

const options = {

expiresIn: '1h',

};

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

};

// 验证JWT

const verifyToken = (token) => {

const secretKey = 'your-secret-key';

try {

const decoded = jwt.verify(token, secretKey);

return decoded;

} catch (error) {

throw new Error('Invalid token');

}

};

Cookie

Cookie是一种在客户端存储数据的机制,它可以用于身份验证和会话管理。通过在HTTP响应头中设置Set-Cookie头部,服务器可以将一个包含用户信息的cookie发送给客户端。客户端在后续的请求中会将该cookie自动添加到请求头部中,以便服务器进行身份验证。

与JWT相比,cookie的一个优点是可以设置过期时间和域限制,使得身份验证更加灵活和安全。但与此同时,cookie也有一些限制,例如跨域请求时需要设置CORS(跨域资源共享)规则。

使用cookie进行身份验证的流程如下:

1. 用户通过用户名和密码进行登录。

2. 服务器验证用户的登录信息,并生成一个包含用户信息的cookie。

3. 服务器将cookie发送回客户端。

4. 客户端在后续的请求中将cookie自动添加到请求头部中。

5. 服务器接收到请求后,验证cookie的有效性和完整性。

6. 如果cookie验证通过,服务器允许用户访问受保护的资源。

下面是一个使用Express.js和cookie-parser库实现cookie身份验证的案例代码:

javascript

const express = require('express');

const cookieParser = require('cookie-parser');

const app = express();

app.use(cookieParser());

// 登录接口

app.post('/login', (req, res) => {

const { username, password } = req.body;

// 验证用户名和密码

if (username === 'admin' && password === '123456') {

// 生成cookie

const user = {

id: 1,

username: 'admin',

role: 'admin',

};

const options = {

maxAge: 3600000, // 过期时间为1小时

httpOnly: true, // 仅允许通过HTTP访问cookie

};

res.cookie('token', JSON.stringify(user), options);

res.sendStatus(200);

} else {

res.sendStatus(401);

}

});

// 验证接口

app.get('/profile', (req, res) => {

const token = req.cookies.token;

if (token) {

const user = JSON.parse(token);

res.json(user);

} else {

res.sendStatus(401);

}

});

app.listen(3000, () => {

console.log('Server is running on port 3000');

});

JWT和cookie都是常用的基于令牌的身份验证方式。JWT适用于无状态的分布式系统和微服务架构,而cookie适用于传统的Web应用程序。选择哪种方式取决于具体的应用场景和需求。无论使用哪种方式,身份验证的目标都是确保用户的安全和权限控制。