你真的了解 Cookie 和 Session 吗?

文章目录

  • Cookie 和 Session
  • 总结

Cookie 和 Session

cookie

HTTP cookie(web cookie、browser cookie)是服务器发送给用户 web 浏览器的一小段数据。浏览器可能会存储 cookie,并在以后的请求中将其发送回同一台服务器。通常,HTTP cookie 用于判断两个请求是否来自同一个浏览器 - 例如,保持用户登录。它为无状态 HTTP 协议记住有状态信息。

cookie 主要用于三个目的:

  • 会话管理:登录、购物车、游戏分数或其它服务器需要保存的数据。
  • 个性化:用户首选项、主体和其它设置。
  • 跟踪:记录和分析用户行为。

示例:当你登录一次哔哩哔哩软件时,使用完成之后关闭掉该网站,下次开启电脑再次访问该网站时,你的账号依然是已经登录的状态。这实际上就是使用 cookie 实现的,如下所示,点击浏览器地址栏左侧的锁标志,你就可以看到对于网站的各种 cookie 数据了。

在这里插入图片描述

用户在通过身份验证并且服务器成功设置了 cookie 之后,服务器会将该 cookie 作为 HTTP 响应的一部分发送给浏览器。浏览器收到响应后会自动解析 cookie 的值,并将其保存在浏览器的 cookie 存储中。这样,用户的身份信息就会以加密的形式是保存在浏览器的 cookie 文件中。

当用户在之后的请i去中访问同一网站时,浏览器会自动将响应的 cookie 信息加到请求中的 cookie 标头中,并发送给服务器。服务器可以通过这些 cookie 信息来识别用户并提供个性化的服务,例如保持用户的登录状态。

在这里插入图片描述

浏览器会自动管理 cookie 的生命周期和安全性。如果你删除该网站对应的 cookie 信息,那么下次再访问时,就需要重新进行账号登录了。

注意:要查看存储的 cookie(以及网页可以使用的其它存储),你可以开启开发人员哦工具中的存储检测器并从存储树中选择 cookie。

cookie 被盗取

如果你存储在浏览器中的 cookie 信息被未经授权的用户盗取,那么该用户就可以使用你的 cookie 信息以你的身份来访问你之前访问过的网站。(例如:QQ被盗,身份泄密等)这种情况都称为 cookie 被盗取。

恶意链接是一种常见的网络攻击方式,黑客可以通过欺骗用户点击恶意链接来窃取其Cookie。以下是一个示例:假设您收到一封看似来自银行的电子邮件,邮件内容称您的账户存在异常,需要您点击链接以确认身份。然而,该链接实际上是一个恶意链接,当您点击时,黑客将会收到您的 Cookie 信息。一旦黑客获取了您的 Cookie,他们可以使用它来伪装成您,访问您的账户,进行各种恶意活动,如盗取个人信息、进行非法转账等。

什么是 Session

  • Session 代表了服务器和客户端之间的一次会话过程。在 Web 应用程序中,当用户与服务器建立会话时,服务器会为该用户创建一个唯一的 Session 对象。该 Session 对象用于存储特定用户会话所需的属性和配置信息。
  • 在整个用户会话中,当用户在应用程序的不同 Web 页面之间跳转时,存储在 Session 对象中的变量和数据不会丢失,而是持续存在。这使得应用程序能够跟踪和管理用户的状态和数据,以提供个性化的服务和功能。
  • 当客户端关闭会话(例如关闭浏览器)或者 Session 超时失效时,会话结束,Session 对象中的数据也随之销毁。会话超时时间通常由应用程序的配置决定,以平衡用户体验和服务器资源的利用。
  • 通过使用 Session,应用程序可以在用户会话期间保持持久性数据,并确保用户的状态和信息不会再页面跳转或重新加载时丢失。这对于实现登录认证、购物车功能、个性化设置都非常有用。

Cookie 和 Session 之间有什么不同?

  • 存储位置:Cookie 保存在客户端(浏览器)中,而 Session 保存在服务器端。
  • 存储内容:Cookie 只能保存 ASCII 字符,而 Session 可以存储任意数据类。通常情况下,我们可以在 Session 中保存一些常用的变量信息,如用户ID 等。
  • 有效期:Cookie 可以设置长时间保持,比如经常使用的默认登录功能。Session 的有效时间相对较短,通常在客户端关闭或 Session 超时后会失效。
  • 隐私策略:由于 Cookie 存储在客户端,相对容易收到非法获取的风险。在早期,有些网站将个人信息存储在 Cookie 中,导致信息被盗取。而 Session 数据存储在服务器中,相对来说安全性更高。
  • 存储大小:单个 Cookie 的存储容量有限,一般不超过 4KB。而 Session 可以存储的数据量远远超过 Cookie 的限制,因为它存储在服务器的内存或数据库中。

为什么需要 cookie 和 session 配合使用,它们之间的关联。

为什么需要使用 Cookie,这就要从浏览器说起,我们知道浏览器是没有状态的(HTTP 协议无状态),这意味着浏览器无法记住用户信息,这时就需要使用一个机制来告诉服务器,本次操作用户是否登录以及是哪一个用户等。而仅仅使用 Cookie 来存储用户数据存在安全风险,一旦 Cookie 文件泄漏,用户的隐私数据也会泄漏。因此,为了增加安全性,那这套机制的实现就需要 Cookie 和 Session 的配合。

在这里插入图片描述

在用户首次请求服务器时,服务器会根据用户提交的相关信息生成一个对应的 Session,并将 Session 的唯一标识信息(SessionID)返回给浏览器,浏览器收到 SessionID 之后,会将其存储在 Cookie 中并记录此 SessionID 属于哪个域名。

当用户再次访问服务器时,浏览器会自动判断此域名是否存在 Cookie 信息,并在请求中自动发送 Cookie 信息给服务器。服务器会从 Cookie 中获取 SessionID,并根据 SessionID 查找对应的 Session 信息。如果没有找到 Session,说明用户没有登录或登录失效;如果找到了 Session,就标识用户已登录,服务器可以根据 Session 中的信息执行后续的操作。

无论使用哪一种方案,安全都是相对的。

安全是相对的,没有绝对的安全性。无论是使用账号密码直接发送到网络中,还是使用 SessionID 进行身份认证,都存在一定的风险。即使使用加密等安全措施,也无法完全消除所有的潜在威胁。

安全性评估通常会考虑破解成本与收益之间的关系。如果破解某个信息的成本非常高,远远大于攻击获取信息带来的收益,那么这个信息就是相对安全的。因此,在设计安全系统时,我们尽量提高攻击者获取有价值信息的成本,以增加安全性。

对于使用 Session 的方式,尽管 SessionID 可能会被盗取,但相比直接在每次请求中发送账号和密码信息,它降低了账号密码被泄漏的风险。

HTTP 响应中设置 Cookie 字段

当浏览器访问服务器时,若服务器给浏览器的 HTTP 响应中包含 Set-Cookie 字段,那么浏览器再次访问该服务器时就会携带上该 Cookie 字段。

如下所示,当浏览器访问服务器时,我们给响应的报头中添加上一个 Set-Cookie 字段,测试当浏览器第二次访问该服务器时会不会携带上该 Cookie 字段。

#define CRLF "\r\n"
#define SPACE " "
#define SPACE_LEN strlen(SPACE)
#define HOME_PAGE "index.html"
#define ROOT_PATH "wwwroot"string getPath(string http_request)
{size_t pos = http_request.find(CRLF);if (pos == string::npos)return "";string request_line = http_request.substr(0, pos);// GET /a/b/c http/1.1size_t first = request_line.find(SPACE);if (first == string::npos)return "";size_t second = request_line.rfind(SPACE);if (second == string::npos)return "";string path = request_line.substr(first + SPACE_LEN, second - (first + SPACE_LEN));if (path.size() == 1 && path[0] == '/')path += HOME_PAGE;return path;
}string readFile(const string &recource)
{ifstream in(recource, std::ifstream::binary);if (!in.is_open())return "404";string content;string line;while (getline(in, line))content += line;in.close();return content;
}void handlerHttpRequest(int sock)
{cout << "---------------------------------------------------" << endl;char buffer[10240];ssize_t s = read(sock, buffer, sizeof buffer);if (s > 0)cout << buffer;string path = getPath(buffer);std::string recource = ROOT_PATH;recource += path;string html = readFile(recource);size_t pos = recource.rfind(".");string suffix = recource.substr(pos);// 开始响应std::string response;response = "HTTP/1.0 200 OK\r\n";if (suffix == ".jpg")response += "Content-Type: image/jpeg\r\n";elseresponse += "Content-Type: text/html\r\n";response += ("Content-Length: " + to_string(html.size()) + "\r\n");response += "Set-Cookie: This is my cookie content;\r\n";response += "\r\n";response += html;send(sock, response.c_str(), response.size(), 0);
}class ServerTcp
{
public:ServerTcp(uint16_t port, const std::string &ip = ""): port_(port), ip_(ip), listenSock_(-1){quit_ = false;}~ServerTcp(){if (listenSock_ >= 0)close(listenSock_);}public:void init(){// 1. 创建socketlistenSock_ = socket(PF_INET, SOCK_STREAM, 0);if (listenSock_ < 0){exit(1);}// 2. bind// 2.1 填充服务器信息struct sockaddr_in local; // 用户栈memset(&local, 0, sizeof local);local.sin_family = PF_INET;local.sin_port = htons(port_);ip_.empty() ? (local.sin_addr.s_addr = INADDR_ANY) : (inet_aton(ip_.c_str(), &local.sin_addr));// 2.2 本地socket信息,写入sock_对应的内核区域if (bind(listenSock_, (const struct sockaddr *)&local, sizeof local) < 0){exit(2);}// 3. 监听socket,为何要监听呢?tcp是面向连接的!if (listen(listenSock_, 5) < 0){exit(3);}}void loop(){signal(SIGCHLD, SIG_IGN);while (!quit_){struct sockaddr_in peer;socklen_t len = sizeof(peer);// 4. 获取连接,accept的返回值是一个新的socket fdint serviceSock = accept(listenSock_, (struct sockaddr *)&peer, &len);if (quit_)break;if (serviceSock < 0){cerr << "accept error..." << endl;// 获取连接失败,继续获取continue;}// 4.1 获取客户端基本信息uint16_t peerPort = ntohs(peer.sin_port);std::string peerIp = inet_ntoa(peer.sin_addr);pid_t id = fork();assert(id != -1);if (id == 0){close(listenSock_); // 建议if (fork() > 0)exit(0);handlerHttpRequest(serviceSock);exit(0);}close(serviceSock);wait();}}bool quitServer(){quit_ = true;return true;}private:int listenSock_;uint16_t port_;std::string ip_;bool quit_; // 安全退出
};

运行服务器并使用浏览器访问,此时我们通过 Fiddler 可以看到服务器给浏览器的 HTTP 响应报头中共包含了 Set-Cookie 字段。

在这里插入图片描述

总结

Cookie 和 Session 是 Web 开发中常用的数据存储和传递技术。Cookie 将数据存储在客户端浏览器,通过 HTTP 请求自动发送给服务器;而 Session 将数据信息存储在服务器中,通过 Cookie 或 URL 重写将 SessionID 发送给客户端。它们存储位置、数据容量、安全性、传输方式、生命周期和应用场景等方面都具有明显差异。

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

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

相关文章

【OpenGauss源码学习 —— 列存储(ColumnTableSample)】

执行算子&#xff08;ColumnTableSample&#xff09; 概述ColumnTableSample 类ColumnTableSample::ColumnTableSample 构造函数ColumnTableSample::~ColumnTableSample 析构函数ExecCStoreScan 函数ColumnTableSample::scanVecSample 函数ColumnTableSample::getMaxOffset 函数…

pikachu靶场-暴力破解攻略

pikachu暴力破解 基于表单的暴力破解 抓包发送到intruder 添加两个变量 下图攻击模式需要选择cluster bomb 用户名处添加几个常见的用户名 密码处则添加密码字典 如图可见有一条密码已经爆出 登录成功 验证码绕过(on server) 输入验证码后提交 抓包 然后发送到repeater先…

vue中data属性为什么是一个函数?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-data属性 目录 为什么data属性是一个函数而不是一个对象&#xff1f; 一、实例和组件定义dat…

解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率

动态共享内存是AntDB数据库通信的重要手段&#xff0c;本文主要阐述AntDB-T数据库动态共享内存的实现原理、实现方式与使用方法。 AntDB-T数据库是一款企业级通用分布式关系型数据库&#xff0c;其数据库内核是基于进程模型实现的&#xff0c;因此进程间通信&#xff08;IPC&am…

Appium移动自动化测试—如何安装Appium

前言 Appium 自动化测试是很早之前就想学习和研究的技术了&#xff0c;可是一直抽不出一块完整的时间来做这件事儿。现在终于有了。 反观各种互联网的招聘移动测试成了主流&#xff0c;如果再不去学习移动自动化测试技术将会被淘汰。 web自动化测试的路线是这样的&#xff1…

基于单片机的公共场所马桶设计(论文+源码)

1.系统设计 本课题为公共场所的马桶设计&#xff0c;其整个系统架构如图2.1所示&#xff0c;其采用STC89C52单片机为核心控制器&#xff0c;结合HC-SR04人体检测模块&#xff0c;压力传感器&#xff0c;LCD1602液晶&#xff0c;蜂鸣器&#xff0c;L298驱动电路等构成整个系统&…

1445 雉兔同笼

Tint(input()) for i in range(T):s input().split()head int(s[0])foot int(s[1])rabbitfoot/2-headchicken2*head-foot/2if rabbit>0 and chicken>0 and rabbit.is_integer():print(int(chicken),int(rabbit))else:print(-1)

多协议数据库管理软件 Navicat Premium 16 mac中文版功能

Navicat Premium 16 mac是一款跨平台数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等等。它提供了丰富的数据库管理功能和工具&#xff0c;可以帮助开发人员和数据库管理员快速地创建、管理和维护数据库。 Navicat P…

比赛倒计时4天,快来做做2023年小学生古诗文大会复赛在线模拟题

2023年第八届上海小学生古诗文大会复选&#xff08;复赛&#xff09;定于11月25日上午举办&#xff08;即本周六&#xff09;&#xff0c;具体安排和操作手册、注意事项请看我之前发布的文章&#xff1a;2023年11月25日小学生古诗文大会复选&#xff08;复赛&#xff09;答题操…

中石油勘探院张弢:从业务到架构全面探讨中国石油的数字化转型之路

引言&#xff1a;OSDU论坛的诞生与壮大&#xff0c;对油气行业的数字化有极大的推动力&#xff0c;国内油气行业正在紧锣密鼓地开展数字化转型、智能化发展。当前油气上游业务数字化转型正在轰轰烈烈的开展&#xff0c;一些明星油田的数字化率无限接近100%&#xff0c;基于业务…

ITIL® 4 Foundation​,即将开课~想了解点击查看

ITIL 4 Foundation 即将开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 2 0 23 年 培训地点&#xff1a; 远程直播&#xff1a;线上平台学习 开课时间&#xff1a; 周末班&#xff1a;11月25日、26日&#xff1b; 什么是ITIL&#xff1f; 信息技…

磐舟CI-Web前端项目

整体介绍 磐舟作为一个devops产品&#xff0c;它具备基础的CI流水线功能。同时磐舟的流水线是完全基于云原生架构设计的&#xff0c;在使用时会有一些注意事项。这里首先我们要了解磐舟整体的流水线打包逻辑。 文档结构说明 一般来说&#xff0c;磐舟推荐单个业务的标准git库…

C#实现观察者模式

观察者模式是一种软件设计模式&#xff0c;当一个对象的状态发生变化时&#xff0c;其所有依赖者都会自动得到通知。 观察者模式也被称为“发布-订阅”模式&#xff0c;它定义了对象之间的一对多的依赖性&#xff0c;当一个对象状态改变时&#xff0c;所有依赖于它的对象都会得…

SpringSecurity+JWT权限认证

SpringSecurity默认的是采用Session来判断请求的用户是否登录的&#xff0c;但是不方便分布式的扩展 虽然SpringSecurity也支持采用SpringSession来管理分布式下的用户状态&#xff0c;不过现在分布式的还是无状态的Jwt比较主流 一、创建SpringBoot的项目 spring-boot-starte…

Elasticsearch 和 LangChain 合作开发可用于生产的 RAG 模板

作者&#xff1a;Aditya Tripathi 在过去的几个月里&#xff0c;我们一直与 LangChain 团队密切合作&#xff0c;他们在推出 LangServe 和 LangChain 模板方面取得了进展&#xff01; LangChain Templates 是一组用于构建生产质量的生成式 AI 应用程序的参考架构。 你可以在此处…

运动装备经营小程序商城效果如何

运动装备可包含服装、帐篷、渔具、箱包鞋帽等&#xff0c;对喜欢外出的人来说&#xff0c;靠谱的装备是关键&#xff0c;往往更容易选择品牌和信得过的商家。 而对商家来说&#xff0c;如何打造品牌提升卖货经营效率和提升营收是重中之重&#xff1b;互联网时代需要商家拓展线…

串口工作流程硬核解析,没有比这更简单的了!

串口通信,就是我们常说的串口通讯,是一种短距离、点对点的数据传输方式。它基于串行通信协议,通过串口线连接设备进行数据交互。串口在很多硬件系统中广泛使用,是工控机、单片机、外设设备之间信息交换的重要接口。 那串口是怎么工作的呢?我们举个形象的例子。假设A和B是两台…

Wireshark的数据包它来啦!

通过Wireshark工具&#xff0c;可以轻松的看到网卡的数据信息。通过Wireshark显示的数据包内容信息&#xff0c;通常分七栏&#xff0c;介绍一下&#xff1a; 1No.&#xff1a; 数据包编号。 2.Time Time显示时间&#xff0c;以1号数据包发生开始计时。 3.Source Source显示内容…

探秘TikTok社群:短视频中的共同体验

社交媒体平台TikTok成为全球用户分享创意、表达自我、建立连接的重要场所。在这个数字化的时代&#xff0c;TikTok社群不仅是个人创作者的聚集地&#xff0c;更是成千上万用户共同参与、体验的独特社交现象。 本文将深入探讨TikTok社群的形成、特点以及其中的共同体验&#xf…

[java进阶]——泛型类、泛型方法、泛型接口、泛型的通配符

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 泛型的基础知识&#xff1a; ♥A 泛型的好处&#xff1a; ♠A 泛型擦除&#xff1a; ♣A 泛型的小细节&#xff1a; 泛型的使用&#xff1a; ①泛型类&#xff1a; ②⭐泛型接口&#xff1a; ③泛型方法&…