Cookie和Session的区别?(node版)


前言

cookie和session的基本介绍

一、会话控制

所谓会话控制就是 对会话进行控制
HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端, 无法区分用户
而产品中又大量存在的这样的需求,所以我们需要通过 会话控制 来解决该问题
常见的会话控制技术有三种:

  • cookie: cookie是一种存储在客户端的小型文本文件,用于存储有关用户的信息。它由服务器发送给浏览器,并由浏览器存储在本地。在后续的请求中,浏览器会自动将Cookie携带到服务器,从而实现会话的跟踪和控制。但Cookie的安全性较低,对于敏感信息的存储需要特别注意。
  • session: session是一种用于在服务器端存储用户会话数据的机制。服务器会为每个客户端创建一个唯一的会话标识符(Session ID),并通过Cookie或URL参数发送给客户端。客户端在后续的请求中会携带这个Session ID,服务器则根据Session ID来找到对应的会话数据。Session相比Cookie更加安全,因为它将用户数据存储在服务器端。
  • token: token是一种用于身份验证和会话控制的机制,与Session有相似的功能但实现方式不同。Token通常是一个短字符串,由服务器生成并发送给客户端。在后续的请求中,客户端需要携带这个Token来进行身份验证和访问控制。Token的主要优点是无状态和可扩展性,服务器不需要在服务器端存储会话数据,每个请求都是独立的。

二、cookie

2.1 cookie 是什么?

cookie 是 HTTP 服务器发送到用户浏览器并保存在本地的一小块数据。
cookie 是保存在浏览器端的一小块数据。
cookie 是按照域名划分保存的。


2.2 cookie 的特点

浏览器向服务器发送请求时,会自动将 当前域名下 可用的 cookie 设置在请求头中,然后传递给服务器这个请求头的名字也叫 cookie ,所以将 cookie 理解为一个 HTTP 的请求头也是可以的


2.3cookie的运行流程 (仅供参考)

在这里插入图片描述


2.4 node中如何操作cookie

express 中可以使用 cookie-parser 进行处理
代码示例:

const express =require('express');
//1. 安装 cookie-parser npm i cookie-parser
//2. 引入 cookieParser 包
const cookieParser = require('cookie-parser');
const app = express();
//3. 设置 cookieParser 中间件
app.use(cookieParser());
//4-1 设置 cookie
app.get('/set-cookie', (request, response) => {
// 不带时效性
response.cookie('username','xiaolu');
// 带时效性
response.cookie('email','23123456@qq.com', {maxAge: 5*60*1000 });
//响应
response.send('Cookie的设置');
});
//4-2 读取 cookie
app.get('/get-cookie', (request, response) => {
//读取 cookie
console.log(request.cookies);
//响应体
response.send('Cookie的读取');
});

//4-3 删除cookie
app.get('/delete-cookie', (request, response) => {
//删除
response.clearCookie('username');
//响应
response.send('cookie 的清除');
});
//4. 启动服务
app.listen(3000, () => {
console.log('服务已经启动....');
});

三、seesion

3.1session是什么?

在Node.js中,Session是一种用于管理客户端和服务器之间会话的机制。与Cookie不同,Session数据是保存在服务器端的,而不是客户端。当用户首次访问服务器时,服务器会创建一个新的Session,并生成一个唯一的Session ID。这个Session ID随后会通过Cookie(或其他机制,如URL重写)发送给客户端,并在客户端的后续请求中携带回服务器。服务器通过Session ID来识别和恢复用户的会话状态。

3.2 session的作用

Session在Web开发中扮演着至关重要的角色,其主要作用包括:

  • 用户身份认证:通过Session可以跟踪用户的登录状态,确保只有经过认证的用户才能访问受保护的资源。
  • 状态管理:Session允许服务器在多个请求之间保持用户的会话状态,如购物车内容、用户偏好设置等。
  • 个性化服务:基于Session信息,服务器可以提供更加个性化的服务,如推荐系统、广告展示等。
  • 安全性增强:通过将敏感数据存储在服务器端,Session可以减少客户端泄露敏感信息的风险。

3.3session的运行流程 (仅供参考)

在这里插入图片描述

3.5 node中如何操作session

const express = require('express');
//1. 安装包 npm i express-session connect-mongo
//2. 引入 express-session connect-mongo
const session = require("express-session");
const MongoStore = require('connect-mongo');
const app = express();
//3. 设置 session 的中间件
app.use(session({
name: 'sid', //设置cookie的name,默认值是:connect.sid
secret: 'xiaolu', //参与加密的字符串(又称签名)
saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
resave: true, //是否在每次请求时重新保存session
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/project' //数据库的连接配置
}),
cookie: {
httpOnly: true, // 开启后前端无法通过 JS 操作
maxAge: 1000 * 300 // 这一条 是控制 sessionID 的过期时间的!!!
},
}))
//创建 session
app.get('/login', (req, res) => {
	//设置session
	req.session.username = 'zhangsan';
	req.session.email = 'zhangsan@qq.com'
	res.send('登录成功');
})
//获取 session
app.get('/home', (req, res) => {
console.log('session的信息');
console.log(req.session.username);
	if (req.session.username) {
		res.send(`你好 ${req.session.username}`);
	}else{
		res.send('登录 注册');
	}
})
//销毁 session
app.get('/logout', (req, res) => {
	//销毁session
	// res.send('设置session');
	req.session.destroy(() => {
	res.send('成功退出');
	});
});
app.listen(3000, () => {
	console.log('服务已经启动, 端口 ' + 3000 + ' 监听中...');
)};

四、cookie和session的区别?

  1. 定义与对象
    Cookie:是针对每个网站的信息,每个网站只能对应一个Cookie,该文件保存在客户端。Cookie文件的内容大致包括用户名、密码、设置等信息。
    Session:是针对每个用户的,只有客户端才能访问,程序为每个客户添加一个Session。Session中主要保存用户的登录信息、操作信息等。Session的概念需要包括特定的客户端、特定的服务器端以及不中断的操作时间。

  2. 存储位置
    Cookie:存储在用户浏览器中的一段小型文本文件。
    Session:数据存储在服务器端。Session信息可以通过服务器端的存储介质(如内存、数据库、Redis等)进行持久化或临时存储。

  3. 数据大小
    Cookie:单个Cookie的大小通常限制在4KB以内,但不同浏览器和服务器可能有所不同。
    Session:理论上,Session可以存储的数据大小只受服务器内存或存储介质的限制,可以存储任意大小的数据。

  4. 生命周期
    Cookie:Cookie的生命周期可以是持久的,即浏览器关闭后仍然存在(通过设置过期时间),也可以是会话级别的,浏览器关闭后即消失。
    Session:Session的生命周期是间隔的,从创建时开始计时。如果在设定的时间内(如30分钟)没有访问Session,那么Session生命周期就被销毁。此外,Session也可以由服务器设定超时时间,超时后自动销毁。

  5. 安全性
    Cookie:存储在客户端,因此可能被用户查看和修改,安全性相对较低。此外,如果Cookie被设置为HttpOnly,则无法通过JavaScript访问,从而提高了安全性。
    Session:由于数据存储在服务器端,不易被客户端查看和修改,因此相对更安全。但服务器需要确保存储介质的安全性,防止数据泄露。

  6. 传输
    Cookie:每次HTTP请求时,浏览器都会将Cookie发送到服务器,增加了网络流量。
    Session:服务器通过一个唯一标识(通常是Session ID)来识别不同的用户。这个标识通常存储在客户端的Cookie中(尽管Session数据本身不传输),或者通过URL重写的方式传递。Session ID的传输增加了用户身份认证的安全性。

  7. 性能影响
    Cookie:由于Cookie存储在客户端并随每个请求发送,因此对网络带宽和服务器性能的影响较小。
    Session:Session数据存储在服务器,当用户量大时,会占用服务器大量内存和存储资源,对服务器性能产生影响。因此,需要合理配置Session的存储方式和过期时间,以减轻服务器负担。

总结

综上所述,Session和Cookie各有优缺点,适用于不同的场景和需求。在实际应用中,可以根据具体情况选择使用或结合使用它们来跟踪用户状态和管理用户会话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值