Node.js - Cookie与Session详解

server/2025/1/21 20:08:48/

1. cookie

1.1 Cookie与cookie-parser

Cookie 是由 网页服务器 在用户浏览网页时存储在 浏览器 中的一小段文本数据,主要用于在客户端和服务器之间传递信息。它在用户访问网站时记录和跟踪用户的状态和行为。

在Node.js中,开发者通常使用cookie-parser处理cookie。cookie-parser 是一个流行的中间件,用于处理和解析 HTTP 请求中的 Cookie,通常用于 Express 应用中

npm i cookie-parser //node.js安装cookie-parser
const cookieParser = require("cookie-parser");
app.use(cookieParser());

1.2 cookie设置

设置未签名cookie

设置cookie是在request请求中自带,不需要依赖其他包进行设置

//语法
res.cookie(name,value,options)
app.get('/set-cookie',(req,res)=>{//res.cookie('name','Ricardo') //浏览器关闭之后就会销毁res.cookie('name','ricardo',{maxAge:60*1000}) //长时间保存 1000为1sres.cookie('age':'12')res.send('home')
})

设置签名cookie

签名密钥:密钥(secret)与不同的值(value)结合时会生成不同的签名。这是密钥签名机制的核心原理。如果在客户端篡改cookie值,与原有密钥会生成不同的请求签名,发送请求时,会携带原始签名,服务端计算cookie值与密钥生成判断签名,验证携带来的原始签名与判断签名判断客户端是否修改cookie

app.use(cookieParser("my-secret-key"));// 设置签名 Cookie
app.get("/set-signed-cookie", (req, res) => {res.cookie("userId", "12345", { signed: true });res.send("Signed Cookie has been set!");
})

如果客户端篡改了 Cookie 值,req.signedCookies 不会返回该字段。

设置Cookie相关参数:通过对象类型传递

maxAgeCookie的有效时长
httpOnly禁止客户端通过JavaScript访问此cookie,默认为false
secure仅在HTTPS环境中传输,默认为false
signed启用签名验证(需要设置签名密钥)

1.3 获取cookie

如果没有使用 cookie-parser中间件req.cookies 是未定义的,服务器端无法直接解析请求中的 Cookie 数据。如果没有使用cookie-parser,则需要手动从 req.headers.cookie 中解析这些数据

//获取cookies
app.get('/get-cookie',(req,res)=>{//获取cookieconsole.log(req.cookies)const signedCookies = req.signedCookies; //获取签名cookiesres.send("获取cookie")
})

1.4 清除cookie

使用clearCookie方法清除cookie 

//删除cookie
app.get('/remove-cookie',(req,res)=>{res.clearCookie('Cookie-name')res.send('删除成功')
})

2. session

2.1 什么是session

实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息

填写账号和密码校验身份,校验通过后创建session信息,然后将session_id的值通过响应头返回给浏览器

通俗来讲,session就是cookie的索引机制,服务端通过 Session ID 自动匹配和判断 Session 是否属于当前客户端。这是 Session 机制的核心工作原理,服务器通过cookie中的session_id的值确认用户的身份

2.2 session配置

在Node.js中,使用express-session进行配置与管理session

npm i express-session //安装

配置session中间件: 

const session = require(// 配置 session 中间件
app.use(session({secret: "my-secret-key", // 用于加密 session ID 的密钥resave: false,           // 每次请求是否强制保存 sessionsaveUninitialized: true, // 是否为未初始化的 session 保存数据cookie: { maxAge: 60000 } // 设置 cookie 的过期时间(毫秒)
}));"express-session");

session配置项:

secret必填项,指定一个用于加密 Session ID 的字符串
resave是否在每次请求时强制重新保存 Session,即使它没有被修改,通常为false提高性能
saveUninitialized是否为未初始化的 Session(未存储数据)分配存储空间
cookie用于配置 Session 的 Cookie 属性,例如过期时间、是否仅在 HTTPS 下传输
storesession存储在服务器中的位置

默认情况下,Session 是存储在服务器内存中的。但对于大规模应用,可能会导致性能问题

常见存储在MongoDB中:

npm install connect-mongo
const MongoStore = require("connect-mongo");
app.use(session({secret: "my-secret-key",store: MongoStore.create({ mongoUrl: "mongodb://localhost:27017/session-db",collectionName:"sessions", }), //自定义存储session的集合名称resave: false,saveUninitialized: true
}));

2.3 session操作 

以下示例演示如何设置、获取和销毁 Session:

app.get("/set-session", (req, res) => {req.session.username = "Alice";res.send("Session data has been saved.");
});app.get("/get-session", (req, res) => {if (req.session.username) {res.send(`Hello, ${req.session.username}`);} else {res.send("No session data found.");}
});app.get("/destroy-session", (req, res) => {req.session.destroy((err) => {if (err) {return res.status(500).send("Unable to destroy session.");}res.send("Session has been destroyed.");});
});

其中设置cookie为键值对为username:Alice

总结:session与cookie的区别

区别cookiesession
存放位置浏览器端服务端
安全性明文存放,安全性较低存放服务器,安全性较好
网络传输量增大体积,影响效率通过cookie传递id,不影响效率
存储限制单个cookie存储数据不超过4k存储在服务器中,无限制


http://www.ppmy.cn/server/160270.html

相关文章

事务处理系统 (Transaction Processing System, TPS)

事务处理系统 (Transaction Processing System, TPS) 是一种专门用于自动化日常业务事务处理的计算机系统。这类系统通常处理大量的结构化数据,如订单处理、支付结算、库存管理等,以支持企业日常的运营和管理。TPS 的核心任务是确保高效、准确地记录和管理大量重复性的事务,…

内网渗透测试工具及渗透测试安全审计方法总结

1. 内网安全检查/渗透介绍 1.1 攻击思路 有2种思路: 攻击外网服务器,获取外网服务器的权限,接着利用入侵成功的外网服务器作为跳板,攻击内网其他服务器,最后获得敏感数据,并将数据传递到攻击者&#xff0…

如何解决 Apache Shutdown Unexpectedly 错误 ?

遇到 “Apache shutdown unexpectedly”错误可能会令人沮丧。当 Apache 由于冲突或配置问题而无法启动时,通常会发生此错误。此错误经常出现在像 XAMPP 控制面板这样的开发工具中。 Step 1: 检查端口冲突 Identify Port Usage Apache 通常在端口 80(H…

二十三种设计模式-装饰器模式

一、定义与核心思想 装饰器模式是一种结构型设计模式,其核心思想是动态地给一个对象添加一些额外的职责。通过这种方式,可以在不改变原有对象结构的基础上,灵活地增加新的功能,使得对象的行为可以得到扩展,同时又保持…

【C++动态规划】1547. 切棍子的最小成本|2116

本文涉及知识点 C动态规划 LeetCode1547. 切棍子的最小成本 有一根长度为 n 个单位的木棍,棍上从 0 到 n 标记了若干位置。例如,长度为 6 的棍子可以标记如下: 给你一个整数数组 cuts ,其中 cuts[i] 表示你需要将棍子切开的位…

K8S 容器重启策略

今天我们来实验容器重启策略。官网描述如下: Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。 Pod 的重启策略(restartPolicy)应用于 Pod 中的 应用容器(也…

Python实现windows自动关机

python <shut.py> import ntplib from datetime import datetime, timezoneimport time import osimport easygui# net time def get_network_time():time.sleep(3)"""从网络时间服务器获取时间"""client ntplib.NTPClient()response c…

【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…