node会话管理详解(cookie、session、token)

在Node.js中,cookie、session和token都是用于会话管理的机制,但它们各自有不同的使用场景和特性。

一、cookie

命令:npm install cookie-parser -save

-save 参数表示将这个模块添加到项目的 package.json 文件的 dependencies 部分,这样在其他人克隆你的项目或者在不同的机器上设置项目时,可以通过运行 npm install 命令来自动安装所有必要的依赖。它可以用到任意命令上

cookie-parser是一个常用的中间件,用于解析请求头中的cookie字段,并将其转换为可在Express应用中使用的对象。

(1)概念与原理:

Cookie是一种服务器保存在浏览器端的文本信息,通过HTTP请求自动传递给服务器,用于识别用户身份和维持会话状态。它通常用于跟踪用户的会话状态或保存用户偏好。

(2)优缺点:

优点:实现简单,无需在服务器端存储状态信息,适用于轻量级的状态维护。

缺点:大小受限(通常是4KB)。 安全风险,如跨站脚本攻击(XSS)。 敏感信息不应存储在cookie中。

(3)代码示例(使用Express框架):

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {// 设置cookieres.cookie('username', 'JohnDoe');res.send('Cookie has been set');
});
app.get('/check', (req, res) => {// 读取cookieconst username = req.cookies.username;res.send(Welcome back, ${username}!);
});
app.listen(3000, () => {console.log('Server is running on port 3000');
});

二、session

命令:npm install express-session -save

express-session是另一个流行的中间件,用于在Express应用中处理会话。它会自动管理会话数据的存储、会话ID的生成以及与客户端的通信(通常是通过cookie)。

(1)概念与原理:

Session是基于服务器的会话管理机制。服务器为每个会话创建一个唯一的ID,并将其发送给客户端(通常通过cookie)。客户端在后续的请求中携带这个ID,以便服务器识别用户的会话。

(2)优缺点:

优点:可以在服务器端存储任意大小的数据。安全性较Cookie高,因为敏感信息存储在服务端

缺点:需要服务端支持,增加服务器的存储和管理开销;如果用户量大,可能会对服务器性能产生影响。

(3)代码示例(使用Express和express-session中间件):

const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({*secret: 'your-secret-key', //用于签名session ID的密钥,可以随意设置,但需要保密。resave: false, //强制将未修改的session保存到存储中。如果设置为true,即使session没有改变,也会被强制保存saveUninitialized: true, //强制将未初始化的session保存到存储中。如果设置为true,即使session是新的(未被修改过),也会被强制保存cookie: { // cookie用于配置与会话相关的cookie属性secure: false  //指定是否仅通过HTTPS连接发送cookie,生产环境中应设置为true*maxAge:1000*60*10 //十分钟。定义cookie的最大存活时间,以毫秒为单位。在这个例子中,maxAge被设置为十分钟,即10分钟后cookie将过期。......}
}));
app.get('/', (req, res) => {// 设置session数据req.session.username = 'JohnDoe';res.send('Session has been set');
});
app.get('/check', (req, res) => {// 读取session数据const username = req.session.username;res.send(Welcome back, ${username}!);
});
app.listen(3000, () => {console.log('Server is running on port 3000');
});

(4)session属性:

req.session.id // 保存唯一的会话id值,不可修改
req.session.cookie // 以键值对的形式保存cookie的原始数据
req.session.cookie.maxAge // 以毫秒的形式返回剩余存活时间
req.sessionID // 保存唯一的会话id,只读
req.session.键名  //保存或获取键名下保存的数据

(5)session方法:

req.session.regenerate(function(err) {// 调用这个方法重新生成一个新的会话,完成后触发
})
req.session.destroy(function(err) {// 删除这个会话,完成后触发。常用。
})
req.session.reload(function(err) {// 从新加载session数据,完成后触发回调
})
req.session.save(function(err) {// 使用当前内存中的数据保存到储存器中// 默认在会话结束的时候就会自动调用这个方法
})

三、token

命令:npm install jsonwebtoken -save

jsonwebtoken是一个库,用于生成和验证JWT。你可以使用它来在客户端和服务器之间安全地传递信息,而无需使用session。

(1)概念与原理:

Token是基于令牌的身份验证方法,通常用于无状态的身份验证和授权。用户通过用户名和密码登录后,服务器生成一个Token返回给客户端,客户端后续请求时带上这个Token以验证用户身份。

(2)优缺点:

优点:无状态:服务器不需要存储会话数据,因此可以更容易地扩展和部署。 安全性高:使用加密算法保护令牌内容。可以设置过期时间等

缺点:令牌管理和验证逻辑可能比较复杂。 若Token泄露,可能导致安全问题。

(3)代码示例(使用JSON Web Tokens):

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 假设有一个验证用户凭据的函数
const authenticateUser = (username, password) => {// 在这里实现你的验证逻辑...return username === 'JohnDoe' && password === 'password123';
};
app.post('/login', (req, res) => {const { username, password } = req.body;if (authenticateUser(username, password)) {// 生成JWT令牌const token = jwt.sign({ username }, 'your-secret-key', { expiresIn: '1h' });res.json({ token });} else {res.status(401).send('Invalid credentials');}
});
app.get('/protected', verifyToken, (req, res) => {// 验证令牌后,访问受保护的资源res.send('Protected resource');
});
// 令牌验证中间件
const verifyToken = (req, res, next) => {const token = req.headers['authorization'];if (!token) return res.status

四、应用场景

如果是简单的Web应用,可能使用Cookie就足够了;若是大型或分布式系统,可能需要考虑Session或Token。

安全要求:评估不同方案的安全性,选择符合安全标准的方法。

性能需求:考虑服务器的负载能力和用户的并发访问量,选择对服务器影响较小的方案。

开发成本:不同的方案实现难度和维护成本不同,需要综合考虑。 总的来说,对于Node.js项目,建议优先考虑使用Session进行会话管理,因为它既保证了安全性又相对容易实现。同时,结合实际情况考虑使用Token或Cookie作为补充。在选择会话管理机制时,需要综合考量安全性、可扩展性、性能及开发成本等因素,以确保项目的顺利实施和长期维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言| 输出菱形*

C语言| 输出*三角形-CSDN博客 输出菱形。 【分析思路】 学会输出*的三角形之后输出菱形就很简单了。我们分析一下,菱形是由两个对称的三角形组成的,也因为是对称的,所以输出的菱形的行数肯定是一个奇数。 1 我们在编程的时候,要…

基于卷积-小波神经网络的SAR图像海冰变化检测方法(MATLAB R2018A)

海冰是冰冻圈的重要组成部分,海冰的变化信息对航行安全和自然资源开采等非常重要,许多船舶没有加固防冰设备,因此,必须避开所有的冰区。尤其当冰压很高时,即使破冰船也很难在冰层中前行。为了安全航行,获取…

leetCode.89. 格雷编码

leetCode.89. 格雷编码 题目思路 代码 class Solution { public:vector<int> grayCode(int n) {vector<int> res(1,0); // n 0时&#xff0c;之后一位0while (n--) {// 想要实现对象超下来&#xff0c;就从末尾开始&#xff0c;让vector里面 加 元素for (int i …

Stable Diffusion Webui--安装与使用

最近进行的课程汇报&#xff0c;学习了2023年的CVPR文章《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》&#xff0c;因此尝试使用了几种方法对这篇文章的工作进行了一定的复现。本文主要介绍Stable Diffusion Web UI(webui)的安装…

【因果推断python】10_分组和虚拟变量回归1

目录 分组数据回归 分组数据回归 并非所有数据点都是一样的。 如果我们再次查看我们的 ENEM 数据集&#xff0c;相比小规模学校的分数&#xff0c;我们更相信规模较大的学校的分数。 这并不是说大型学校更好或什么&#xff0c; 而只是因为它们的较大规模意味着更小的方差。 i…

bootstrap5-学习笔记1-容器+布局+按钮+工具

参考&#xff1a; Bootstrap5 教程 | 菜鸟教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Spacing Bootstrap v5 中文文档 v5.3 | Bootstrap 中文网 https://v5.bootcss.com/docs/utilities/spacing/ 之前用bootstrap2和3比较多&#xff0c;最近用到了5&a…

SRE视角下的DevOps构建之道

引言&#xff1a; 随着数字化时代的飞速发展&#xff0c;软件成为了企业竞争力的核心。为了更高效地交付高质量的软件&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;作为一种文化、实践和工具集的集合&#xff0c;逐渐成为了行业内的热门话题。然而…

OpenFHE 使用样例

参考文献&#xff1a; 编译 OpenFHEOpenFHE 源码解析&#xff1a;PKE 部分[ABB22] Al Badawi A, Bates J, Bergamaschi F, et al. Openfhe: Open-source fully homomorphic encryption library[C]//Proceedings of the 10th Workshop on Encrypted Computing & Applied Ho…

渲染100为什么是高性价比网渲平台?渲染100邀请码1a12

市面上主流的网渲平台有很多&#xff0c;如渲染100、瑞云、炫云、渲云等&#xff0c;这些平台各有特色和优势&#xff0c;也都声称自己性价比高&#xff0c;以渲染100为例&#xff0c;我们来介绍下它的优势有哪些。 1、渲染100对新用户很友好&#xff0c;注册填邀请码1a12有3…

【CTF MISC】XCTF GFSJ0008 low Writeup(LSB隐写+QR Code识别)

low 暂无 解法 用 StegSolve 打开&#xff0c;Green plane 1 中疑似隐藏有二维码。 使用大佬写的代码&#xff1a; from PIL import Imageimg Image.open("./low.bmp") img_tmp img.copy() pix img_tmp.load() width, height img_tmp.size for w in range(wid…

每日一题——Python实现PAT甲级1046 Shortest Distance(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 优点 改进建议 时间复杂度分析 空间复杂度分析 总结 我要更…

Python模块导入的写法

关于Python模块导入的写法有 相对路径导入 和 绝对路径导入 两种不同的导入路径的写法。 文章目录 相对路径导入绝对路径导入总结 相对路径导入 from .utils import upblock2d, crossattn_upblock2d使用了相对导入&#xff0c;以&#xff08;“.”&#xff09;开头这种导入方…

HCIP-Datacom-ARST自选题库__MAC【14道题】

一、单选题 1.缺省情况下&#xff0c;以下哪种安全MAC地址类型在设备重启后表项会丢失? 黑洞MAC地址 Sticky MAC地址 安全动态MAC地址 安全静态MAC地址 2.华为交换机MAC地址表中的动态sticky MAC地址的默认老化时间是多少秒? 300 不会老化 400 500 3.华为交换机MA…

【BeyondCompare官方免费版下载链接】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、BeyondCompare官方免费版下载链接 前言 该软件用于比较两个文本或文件夹之间的不同之处&#xff0c;查看代码修改时非常好用。 一、BeyondCompare官方免费…

Polar Web【简单】login

Polar Web【简单】login 本文旨在记录此题的探索和解决过程。 Contents Polar Web【简单】login探索&思路EXP (python)结果&总结 探索&思路 查看源码&#xff0c;发现存在用户信息泄露。尝试用获取信息登录&#xff0c;显示成功&#xff0c;但其后没有可做的操作。…

有损线、上升边退化与材料特性(七)

有损线的不良影响 当信号沿着实际有损线传输时&#xff0c;高频分量的幅度减小&#xff0c;而低频分量的幅度保持不变。由于这个种选择性的衰减&#xff0c;信号的带宽降低&#xff0c;信号的上升边会增长。如果上升边的退化与单位间隔比很小&#xff0c;同位模式将比较稳定与…

Django视图与路由:打造你的网络帝国

Hello&#xff0c;我是阿佑&#xff0c;上期给大家讲了 Django ORM魔法&#xff1a;用Python代码召唤数据库之灵&#xff01; 今天将带大家深入探讨了视图的工作原理、如何编写高效的函数视图和类视图&#xff0c;以及如何巧妙地利用URL路由来提升应用的用户体验和可维护性。通…

最新h5st(4.7.2)参数分析与纯算法还原(含算法源码)

文章目录 1. 写在前面2. 加密分析3. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

操作系统 实验29 同步与互斥

1、并发线程同步与互斥 源程序&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <string.h> int num30,count10; pthread_mutex_t mylockPTHREAD_MUTEX_INITIALIZER; void *sub1(voi…

图解 Python 编程(10) | 错误与异常处理

&#x1f31e;欢迎来到Python的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年6月2日&…