不使用Express,Node.js HTTP中用JWT设置Cookie及跨请求获取方法
一、设置带JWT的Cookie
要在原生HTTP模块中设置包含JWT的Cookie,核心是通过res.writeHead()或res.setHeader()添加Set-Cookie响应头,将生成的JWT作为Cookie值传入。同时建议添加安全属性提升Cookie的安全性。
步骤1:安装JWT依赖
首先需要jsonwebtoken包生成和验证JWT:
npm install jsonwebtoken
步骤2:生成JWT并设置Cookie
示例代码:
const http = require('http'); const jwt = require('jsonwebtoken'); // 建议将密钥存到环境变量,不要硬编码 const JWT_SECRET = process.env.JWT_SECRET || 'your-strong-secret-key'; const server = http.createServer((req, res) => { // 模拟登录接口,生成JWT并设置Cookie if (req.url === '/login' && req.method === 'POST') { // 此处省略用户验证逻辑,直接生成JWT const payload = { userId: 1001, username: 'demo-user' }; const token = jwt.sign(payload, JWT_SECRET, { expiresIn: '1h' }); // 设置Cookie,添加安全属性 res.writeHead(200, { 'Set-Cookie': `access-token=${token}; HttpOnly; MaxAge=3600000; Path=/; SameSite=Lax`, 'Content-Type': 'application/json' }); res.end(JSON.stringify({ msg: '登录成功' })); } }); server.listen(3000, () => console.log('Server running on http://localhost:3000'));
关键Cookie属性说明:
HttpOnly:禁止前端JavaScript读取Cookie,防范XSS攻击MaxAge:Cookie有效期(单位毫秒),这里设置为1小时Path=/:Cookie在全站路径下生效SameSite=Lax:减少CSRF攻击风险
二、获取并验证Cookie中的JWT
原生HTTP请求的Cookie会携带在req.headers.cookie中,这是一个分号分隔的字符串,需要先解析成键值对,再提取目标Cookie值。
步骤1:编写Cookie解析函数
function parseCookies(req) { const cookieStr = req.headers.cookie; if (!cookieStr) return {}; return cookieStr.split(';').reduce((cookies, item) => { const [key, value] = item.trim().split('='); cookies[key] = value; return cookies; }, {}); }
步骤2:获取Cookie并验证JWT
示例代码:
const server = http.createServer((req, res) => { // 模拟需要授权的接口 if (req.url === '/profile' && req.method === 'GET') { const cookies = parseCookies(req); const accessToken = cookies['access-token']; // 检查Token是否存在 if (!accessToken) { res.writeHead(401, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify({ msg: '未授权,请先登录' })); } // 验证JWT有效性 try { const decoded = jwt.verify(accessToken, JWT_SECRET); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ user: decoded })); } catch (err) { res.writeHead(403, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ msg: 'Token无效或已过期' })); } } });
针对你提供的Set-Cookie写法的获取方式
如果你只是通过以下代码设置Cookie(未添加额外属性):
res.writeHead(200, { 'Set-Cookie': `access-token=${token}` })
获取方式完全一致,使用上述parseCookies函数即可提取access-token对应的值,因为Cookie的核心键值对格式没有变化。
内容的提问来源于stack exchange,提问作者Mohammadjavad mahmoudabadi
相关产品推荐
相关产品推荐

