答案:Node.js中操作Cookie需借助Express等框架及cookie-parser中间件,通过res.cookie()设置、req.cookies读取、res.clearCookie()清除,并需配置httpOnly、secure、sameSite等安全属性以防范XSS和CSRF攻击。

在Node.js中操作Cookie,本质上是围绕HTTP请求与响应头进行。我们不会像在浏览器里那样直接去“读写”一个全局的
document.cookie
cookie-parser
要在Node.js应用中高效且安全地操作Cookie,我们通常会选择一个成熟的Web框架。以Express.js为例,它提供了一套非常直观的API。
首先,你需要安装
express
cookie-parser
npm install express cookie-parser
然后,在你的应用中引入并使用它们:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
const port = 3000;
// 使用cookie-parser中间件。
// 如果你想对Cookie进行签名,可以在这里传入一个秘密字符串(secret)。
// 例如:app.use(cookieParser('your-secret-key'));
app.use(cookieParser());
// 设置Cookie的路由
app.get('/set-cookie', (req, res) => {
// 设置一个简单的Cookie
res.cookie('myCookie', 'helloWorld', { maxAge: 900000, httpOnly: true });
// 设置一个带有更多选项的Cookie
res.cookie('userSession', 'someUserId123', {
expires: new Date(Date.now() + 24 * 3600 * 1000), // 24小时后过期
httpOnly: true, // 重要的安全选项,防止客户端脚本访问
secure: process.env.NODE_ENV === 'production', // 仅在HTTPS连接下发送
sameSite: 'Lax', // 重要的安全选项,防止CSRF攻击
path: '/', // Cookie对所有路径都可用
// domain: '.example.com' // 如果需要跨子域共享
});
res.send('Cookie已设置!');
});
// 获取Cookie的路由
app.get('/get-cookie', (req, res) => {
// cookie-parser会将所有Cookie解析到req.cookies对象上
const myCookie = req.cookies.myCookie;
const userSession = req.cookies.userSession;
if (myCookie) {
res.send(`获取到的myCookie是: ${myCookie},userSession是: ${userSession || '未设置'}`);
} else {
res.send('未找到myCookie。');
}
});
// 清除Cookie的路由
app.get('/clear-cookie', (req, res) => {
// 清除Cookie需要指定其名称和设置时的路径(如果非默认)
res.clearCookie('myCookie');
res.clearCookie('userSession'); // 清除时也要注意path和domain是否匹配
res.send('Cookie已清除!');
});
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});在这个例子中,
res.cookie()
httpOnly
secure
sameSite
req.cookies
cookie-parser
res.clearCookie()
Set-Cookie
在Node.js应用中处理Cookie,安全性绝不是一个可以忽视的环节。我个人觉得,很多开发者,包括我自己在初学时,很容易只关注功能实现而忽略了这些至关重要的安全属性。这些属性的存在,是为了保护用户数据和应用程序免受常见的Web攻击。
httpOnly
httpOnly: true
document.cookie
httpOnly
secure
secure: true
sameSite
Lax
GET
<img>
<iframe>
Lax
Strict
None
secure: true
过期时间 (expires
maxAge
Cookie签名 (signed
cookie-parser
cookie-parser
路径 (path
domain
path
/admin
/admin
domain
这些安全考量,我个人认为,是构建健壮Web应用的基础。理解它们并正确应用,远比仅仅知道如何设置和获取Cookie来得重要。
当然,Node.js的生态非常丰富,处理Cookie的方式也多种多样。虽然Express.js搭配
cookie-parser
Koa.js: Koa是另一个流行的Node.js Web框架,它以其“洋葱圈”模型和基于
async/await
koa-session
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
// 设置Cookie
ctx.cookies.set('koaCookie', 'helloKoa', {
maxAge: 900000,
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'Lax'
});
// 获取Cookie
const myKoaCookie = ctx.cookies.get('koaCookie');
if (myKoaCookie) {
ctx.body = `获取到的koaCookie是: ${myKoaCookie}`;
} else {
ctx.body = '未找到koaCookie。';
}
// 清除Cookie
// ctx.cookies.set('koaCookie', null); // 另一种清除方式,将值设为null
// ctx.cookies.set('koaCookie', '', { expires: new Date(0) }); // 或者设置过期时间为过去
await next();
});
app.listen(3000, () => {
console.log('Koa server running on port 3000');
});Koa的API设计非常简洁,通过
ctx.cookies.set()
ctx.cookies.get()
Hapi.js: Hapi是另一个企业级的Node.js框架,它以其严格的配置和插件系统而著称。Hapi也提供了内置的Cookie处理机制,通常通过其
state
const Hapi = require('@hapi/hapi');
const init = async () => {
const server = Hapi.server({
port: 3000,
host: 'localhost'
});
// 配置Cookie state
server.state('session', {
ttl: 24 * 60 * 60 * 1000, // 1 day
isSecure: process.env.NODE_ENV === 'production',
isHttpOnly: true,
encoding: 'base64json', // 可以对Cookie值进行编码
clearInvalid: false, // 是否清除无效Cookie
strictHeader: true, // 严格的header解析
path: '/',
sameSite: 'Lax'
});
server.route({
method: 'GET',
path: '/set-cookie',
handler: (request, h) => {
return h.response('Cookie set!').state('session', { userId: 'hapiUser123' });
}
});
server.route({
method: 'GET',
path: '/get-cookie',
handler: (request, h) => {
const session = request.state.session;
if (session && session.userId) {
return `User ID from session cookie: ${session.userId}`;
}
return 'No session cookie found.';
}
});
server.route({
method: 'GET',
path: '/clear-cookie',
handler: (request, h) => {
return h.response('Cookie cleared!').unstate('session');
}
});
await server.start();
console.log('Hapi Server running on %s', server.info.uri);
};
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();Hapi通过
server.state()
h.response().state()
request.state
纯Node.js (不使用框架): 如果你选择不使用任何框架,直接使用Node.js的
http
Cookie
Set-Cookie
const http = require('http');
http.createServer((req, res) => {
if (req.url === '/set-cookie') {
// 手动设置Set-Cookie头
res.setHeader('Set-Cookie', [
'pureNodeCookie=helloPureNode; Max-Age=900; HttpOnly; Path=/',
'anotherCookie=value2; Expires=' + new Date(Date.now() + 3600000).toUTCString() + '; Path=/; Secure; SameSite=Lax'
]);
res.end('Cookie set by pure Node.js!');
} else if (req.url === '/get-cookie') {
// 手动解析Cookie头
const cookieHeader = req.headers.cookie;
let cookies = {};
if (cookieHeader) {
cookieHeader.split(';').forEach(cookie => {
const parts = cookie.split('=');
cookies[parts[0].trim()] = parts[1];
});
}
res.end(`Cookies from pure Node.js: ${JSON.stringify(cookies)}`);
} else {
res.end('Hello from pure Node.js!');
}
}).listen(3000, () => {
console.log('Pure Node.js server running on port 3000');
});这种方式虽然提供了最大的灵活性,但正如你所见,需要处理大量的细节,包括Cookie值的编码、解析,以及各种属性的正确格式化。我个人觉得,除非有非常特殊的需求,否则通常不建议直接采用这种方式。
总的来说,选择哪个库或框架来处理Cookie,很大程度上取决于你项目的整体技术栈。Express和Koa都是非常优秀的选项,它们都提供了强大且易用的Cookie管理功能。
在我看来,Cookie和Session的关系,就像是“门票”和“衣帽间凭证”的关系。Cookie是客户端(浏览器)存储的一小段信息,而Session是服务器端存储的用户会话数据。它们通常是协同工作的,Cookie往往被用来承载Session的标识符,而不是Session本身的数据。
核心思想是这样的:
在Node.js应用中,实现这种协同工作最常见的方式是使用
express-session
const express = require('express');
const session = require('express-session'); // 注意这里是express-session,不是cookie-parser
const app = express();
const port = 3000;
// 配置session中间件
app.use(session({
secret: 'mySuperSecretKeyForSigningSessionCookie', // 必须提供一个秘密字符串来签名Session ID Cookie
resave: false, // 强制session保存到session store中,即使在请求中没有被修改
saveUninitialized: false, // 强制未初始化的session保存到session store中
cookie: {
maxAge: 1000 * 60 * 60 * 24, // Session Cookie的有效期,例如24小时
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'Lax',
}
// store: new RedisStore({ client: redisClient }) // 如果需要将session存储到外部数据库,如Redis
}));
// 登录路由,设置session
app.get('/login', (req, res) => {
req.session.userId = 'user123';
req.session.username = 'Alice';
req.session.loggedIn = true;
res.send('登录成功,Session已设置!');
});
// 获取session数据的路由
app.get('/profile', (req, res) => {
if (req.session.loggedIn) {
res.send(`欢迎回来,${req.session.username}!你的ID是:${req.session.userId}`);
} else {
res.status(401).send('请先登录。');
}
});
// 登出路由,销毁session
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) {
return res.status(500).send('登出失败。');
}
res.send('登出成功,Session已销毁!');
});
});
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});在这个例子中:
express-session
req.session
secret
Cookie
maxAge
httpOnly
secure
sameSite
为什么Session比直接在Cookie中存储所有数据更安全? 我个人认为,Session的优势在于它将大部分敏感数据保留在服务器端。如果直接把所有用户数据都塞进Cookie,不仅有大小限制,而且如果Cookie没有加密或签名不当,客户端就可能篡改或窃取这些数据。Session ID只是一个不包含实际信息的随机字符串,即使它被窃取,攻击者也只能通过它访问服务器上存储的数据,而无法直接从Cookie中获取敏感信息。
Session的权衡: 虽然Session提供了更好的安全性,但它也有其代价。
express-session
store
总而言之,Cookie和Session是Web应用中管理用户状态的两种互补机制。Cookie负责在客户端和服务器之间传递一个标识符,而Session则在服务器端维护这个标识符所代表的完整用户状态。理解它们各自的职责和协同方式,对于构建安全、可扩展的Node.js应用至关重要。
以上就是怎样使用Node.js操作Cookie?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号