You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用Express,Node.js HTTP中用JWT设置Cookie及跨请求获取方法

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:39:35