【Linux 27】HTTP 协议中的 cookie 和 session

news2024/11/27 18:23:13

文章目录

  • 🌈一、Cookie 的相关概念
    • ⭐ 1. Cookie 的概念
    • ⭐ 2. Cookie 的工作原理
    • ⭐ 3. Cookie 的分类
    • ⭐ 4. Cookie 的用途
    • ⭐ 5. Cookie 设置的基本格式
    • ⭐ 6. Cookie 设置时的注意事项
    • ⭐ 7. Cookie 的生命周期
    • ⭐ 8. Cookie 的安全性问题
  • 🌈 二、Session 的相关概念
    • ⭐ 1. Session 的概念
    • ⭐ 2. Session 的工作原理
    • ⭐ 3. Session 的安全性问题
    • ⭐ 4. Session 的超时和失效
    • ⭐ 5. Session 的用途

🌈一、Cookie 的相关概念

⭐ 1. Cookie 的概念

  • Cookie (也叫 HTTP Cookie、Web Cookie、浏览器 Cookie) 是服务器发送到用户浏览器并保存在浏览器上的一小块数据。
  • Cookie 用于在客户端中存储少量的信息,由于 HTTP 是一种无状态的协议 (服务器不会保存客户端的信息),如果没有 Cookie,每次页面请求时都需要重新认证用户信息。
    • 例:看 VIP 视频时,每个视频都是一个新的 HTTP 请求,如果每一集 (甚至刷新当前集) 都要自己进行 VIP 认证,那用户早跑光了。
  • Cookie 保存的这一小块数据会在浏览器之后再次向同一个服务器发起请求时被添加到请求报文中。
  • 通常,Cookie 用于告知服务端两个请求是否来自同一个浏览器 (客户端),例如保持用户的登录状态,记录用户偏好等。

1. 查看网站的 Cookie 数据

  • 点击浏览器左上角的 🔒 即可查看对应网站的各种 Cookie 数据。
  • 看到的这些 Cookie 数据都是由对应的服务器方写的,将某些包含登陆时所设置信息的 Cookie 数据删除的话就可能会导致需要重新进行登录认证。

image-20241102095111358

2. 删除浏览器保存的 Cookie 数据

  • 如果删除了用来保存某个网站认证信息的 Cookie 数据,当用户再次向服务器发起请求时,就需要重新输入认证信息。
    • 当前不用管这些 Cookie 文件中都存着什么数据,全部删掉即可。

image-20241102095343142

image-20241102095606454

⭐ 2. Cookie 的工作原理

  • HTTP 中有一个报头选项 Set-Cookie,可以用来给浏览器设置 Cookie 值。
  • 当第一次登录某个网站时,需要进行用户认证,此时如果服务器在经过数据对比之后判断为合法用户,就设置 Set-Cookie 报头字段,填充用户登录信息。
  • 当认证通过并在服务端搞定了 Set-Cookie 设置后,服务器返回给浏览器的 HTTP 响应报文就会携带上 Set-Cookie 报头及其对应的值。
  • 浏览器在收到 HTTP 响应报文后,会提取出 Set-Cookie 报头字段中的值,并将其保存在浏览器的 Cookie 文件中,此时就将认证信息保存在本地客户端的 Cookie 文件了。
  • 用户之后再访问该网站时,浏览器会自动在 HTTP 请求报文中添加上 Cookie 报头,将之前保存的 Cookie 信息发送给服务器端,不需要用户频繁的进行用户身份认证。

image-20241102101436841

image-20241102101809296

⭐ 3. Cookie 的分类

  • 根据保存方式将 Cookie 分成了两种,分别是内存级的会话 Cookie (Session Cookie)以及文件级的持久 Cookie (Persistent Cookie)

1. 内存级的会话 Cookie

  • 浏览器也能申请内存空间,会话 Cookie 就属于内存级 Cookie,会话 Cookie 在浏览器关闭时失效
  • 如果在重启浏览器之后再访问之前登录过的网站时,需要重新进行登录。则表示之前登录时,浏览器中保存的 Cookie 信息是内存级的。

2. 文件级的持久 Cookie

  • 持久 Cookie 属于文件级 Cookie,带有明确的过期日期或持续时间,可以跨多个浏览器会话存在
    • 注:持久 Cookie 也不是永久存在的,浏览器会定期删除这些 Cookie 信息,防止堆积。
  • 重启浏览器后再访问之前登录过的网站,如果不需要再重新进行用户认证,则说明之前登录时浏览器中保存的 Cookie 信息属于文件级。
  • 如果 Cookie 是一个持久性的文件级 Cookie,浏览器会将 Cookie 数据保存到特定目录下的一个文件中。
    • 由于 Cookie 文件通常以 二进制 / sqlite 的格式存储,如果想直接查看到这些 Cookie 文件就会发生乱码或无法读取的情况。

⭐ 4. Cookie 的用途

  1. 用户身份认证和会话管理 (最重要):Cookie 可以存储用户的唯一标识符,让服务器能够认出特定的用户。
  2. 跟踪用户行为:Cookie 可以存储用户的访问行为 (访问时间、访问页面、点击次数等)。
  3. 缓存用户偏好:Cookie 可以存储用户的偏好设置 (语言选择、主题偏好等)。

查看 Chrome 浏览器的 Cookie

image-20241102132915903

⭐ 5. Cookie 设置的基本格式

Set-Cookie: 属性=

1. Set-Cookie 的一般格式示例

  • 设置 Cookie 信息时,只设置该条 Cookie 的名称。
Set-Cookie: name=value
  • 其中,name 是要设置的 Cookie 的名称,value 是要设置的 Cookie 中存的值。
    • name 属性的值一般作为整条 Cookie 信息的 key 值。

2. Set-Cookie 的完整格式示例

  • 一般来说,设置 Cookie 肯定不会只是给这条 Cookie 取个名字这么简单。
  • 一条 Cookie 信息还需要包含各种其他属性来完善。
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC; path=/; domain=.example.com; secure; HttpOnly

3. Set-Cookie 的常见可选属性

  • Set-Cookie 并不是只有一个 name=value 属性,它还有其他功能不同的属性。
属性说明
expires符合规范的日期和时间字符串,以及 GMT / UTC 时间设置 Cookie 信息的过期时间
pathCookie 的有效路径字符串如果该属性的值就是一个 \ ,则表示访问 Web 根目录下的任何资源时,浏览器都要自动在 HTTP 请求报文中添加上 Cookie 中的信息。如果设置的是特定路径,则只有在访问该路径的文件时,浏览器才会在 HTTP 请求报文中添加上 Cookie 中的信息。
domain域名字符串 (如 .example.com)指定哪些域名 (主机) 可以接收这个 Cookie (例:qq 的服务器就无法接收用于访问 百度 的 Cookie)
securebool 类型,该属性只要存在就是有效的确保 Cookie 只能通过 HTTPS 协议发送,从而提高安全性
HttpOnlybool 类型,该属性只要存在就是有效的阻止客户端脚本 (如 JavaScript) 访问 Cookie,防御 XSS (跨站脚本) 的攻击

⭐ 6. Cookie 设置时的注意事项

  • 每个 Cookie 属性之间都要用 “; ” 分号 + 空格来隔开。
  • Cookie 属性和与该属性对应的值之间使用等号 = 分隔。
  • 如果 Cookie 的属性或值包含特殊字符,需要进行 URL 编码。

⭐ 7. Cookie 的生命周期

  • 如果 有设置 expiress 属性,则 Cookie 信息会在指定的日期 / 时间之后过期。
  • 如果 没设置 expiress 属性,则 Cookie 默认是内存及的会话 Cookie,该 Cookie 信息会在浏览器关闭时过期。

⭐ 8. Cookie 的安全性问题

  • 由于 Cookie 信息存储在客户端当中, 因此存在被篡改或窃取的风险。
  • 如果张三的客户端中保存的 Cookie 信息被非法用户窃取了, 该非法用户就能使用张三的 Cookie 信息,以合法的身份访问张三曾经访问过的网站。

Cookie 被盗的场景

  • 假设用户张三不小心点击了某个钓鱼链接,该链接可能是个下载程序 (也可能是其他的什么东西)。
  • 张三点击该链接之后会将程序下载到本地,并自动执行该程序,该程序会扫描浏览器的 Cookie 目录,将所有的 Cookie 信息通过网络发送给非法用户。
  • 非法用户会用获取到的 Cookie 信息拷贝到它的浏览器所对应的 Cookie 目录中,这样就完成了非法用户无需密码使用合法用户的身份。

🌈 二、Session 的相关概念

  • 由于单独使用 Cookie 容易发生 Cookie 被盗,因此这并不是目前主流的做法,主流做法是让Cookie 搭配 Session 使用

⭐ 1. Session 的概念

  • Session (也叫 HTTP Session) 是服务器用来跟踪用户与服务器交互期间用户状态的一种机制。
  • 由于 HTTP 协议是无状态的 (每个请求都是独立的),因此服务器需要通过 Session 来记住用户的信息。
  • Session 和 Cookie 类似,但比 Cookie 要更安全 (当然也不绝对安全)。
  • Session 和 Cookie 不同的点,Cookie 是将用户的认证信息写到客户端中,而 Session 是将用户的认证信息写入到服务器端

⭐ 2. Session 的工作原理

  • 当用户首次登录网站输入账号密码后,服务器认证成功的话会在服务端为用户创建一个唯一的 Session ID,并通过 Cookie 将其发送给客户端。
    • 这个 Session ID 与用户信息并不相关,系统会将所有登录用户的 Session ID 统一维护。
  • 客户端在收到 HTTP 响应后,会自动提取出 Cookie 中的 Session ID 的值,然后将其保存在浏览器的 Cookie 文件中 (客户端只保存 Session ID)。
  • 服务器通常会将 Session 信息存储内存、数据库、缓存中。
    • Session 信息中包含用户的基本信息 (用户身份信息、用户偏好设置、用户浏览历史等)。

image-20241102185750566

  • 客户端之后再访问该网站时,发送的 HTTP 请求报文中就不会带上用户的认证信息,而是自动携带上这个 Session ID,服务器再根据这个 Session ID 来识别用户,从而获取用户的会话信息。
  • 当服务器识别到 客户端发送过来的 HTTP 请求报文中如果包含了 Session ID,就会提取出这个 Session ID,然后再到对应的集合中去进行对比。如果对比成功就说明这个用户曾经登陆过,此时就自动认证成功,再正常处理接收到的请求。

image-20241102185843295

⭐ 3. Session 的安全性问题

  • 与 Cookie 类似,由于 Session ID 会在客户端与服务器之间进行传递,因此Session 它也有安全性问题。
  • Session ID 虽然能用来保证 Cookie 中的信息不会泄漏,但并不能保证 Session ID 本身不会泄漏。如果非法用户盗取了 Session ID 之后去访问合法用户曾经访问过的服务器也会造成安全性问题。
  • Cookie 和 Session 都无法彻底解决身份信息被冒认的问题,但 Session 主要解决的私密信息泄漏的问题。
  • Session ID 主要是用来增加非法用户的盗取成本。当某件事的成本高于收益时,正常人应该都不会想着去做这件事了。

⭐ 4. Session 的超时和失效

  • 和 Cookie 一样,Session 信息也不会永久保存,也有指定的过期时间。
  • 当超过过期时间后,Session 会自动失败。
  • 服务器也能主动让 Session 失效,当服务器检查到 Session ID 是从可疑客户端发来的,就可以执行该操作。

如何识别可疑客户端

  • 如何识别可疑客户端:和业务结合,以判断用户的登录地址,活跃状态为例。
  • 当一个用户的活跃度突然爆增或者登录 IP 频繁变换时,服务器就可能删除 Session ID 对应的 Session 信息了。
  • 那么此时非法用户手里拿着的就是一个非法的 Session ID,自然也就无法通过身份信息认证了。
  • 之后合法用户如果再想访问服务,让该合法用户再重新进行身份认证即可。

⭐ 5. Session 的用途

  1. 维持用户状态:保存用户的登录状态、浏览历史、购物车内容等

  2. 验证用户身份:通过保存用户的登录状态实现用户身份验证。

  3. 会话管理:允许开发者在服务端跟踪和控制用户的会话。

  4. 数据共享:Session 可以将一些共享数的数据保存在 Session 中,以便于不同的页面共享数据。
    ssion 的用途

  5. 维持用户状态:保存用户的登录状态、浏览历史、购物车内容等

  6. 验证用户身份:通过保存用户的登录状态实现用户身份验证。

  7. 会话管理:允许开发者在服务端跟踪和控制用户的会话。

  8. 数据共享:Session 可以将一些共享数的数据保存在 Session 中,以便于不同的页面共享数据。

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

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

相关文章

SQL用一个字段查询出数据的交集

出个SQL查询的题吧,有兴趣的可以看看 1、问题 下面有一份数据(图1),由两部分组成:分析数据和基准数据 分析数据标识列为1,基准数据标识列为1,两字段0,1互斥 要求:按找出两部分数据…

后端java——如何为你的网页设置一个验证码

目录 1、工具的准备 2.基本方法 3.实现类 4.实践 HTML文件: Java文件1:创建验证码 Java文件2:验证验证码 本文通过HUTOOL实现:Hutool参考文档Hutool,Java工具集https://hutool.cn/docs/#/ 1、工具的准备 如果我们通过hutool来实现这个…

【Python单元测试】pytest框架单元测试 配置 命令行操作 测试报告 覆盖率

单元测试(unit test),简称UT。本文将介绍在Python项目中,pytest测试框架的安装,配置,执行,测试报告与覆盖率 pytest简介 pytest是一款流行的,简单易上手的单元测试框架,…

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

练习LabVIEW第三十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十八题&#xff1a; 创建一个VI&#xff0c;实现对按钮状态的指示和按钮“按下”持续时间简单计算功能&#xff0c;按…

HomeAssistant自定义组件学习-【二】

#要说的话# 前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA&#xff0c;现在准备写窗帘控制组件&#xff0c;构想的东西会比较多&#xff0c;估计有些难度&#xff0c;过程会比较长&#xff0c;边写边记录吧&#xff01; #设备和场景环境# 使用的是Novo的电机&#xf…

Linux脚本数组与字符串

文章目录 打印数组与长度数组遍历数组赋值下标索引访问切片追加()删除关联数组(像map)字符串字符拼接截取子串字符串长度字符串替换模式匹配截取分割字符串大小写转换 打印数组与长度 ${arrayName[*]} 打印数组${arrayName[]} 打印数组${#arrayName[*]} 打印数组长度${#arrayN…

闯关leetcode——3289. The Two Sneaky Numbers of Digitville

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/the-two-sneaky-numbers-of-digitville/description/ 内容 In the town of Digitville, there was a list of numbers called nums containing integers from 0 to n - 1. Each number was suppos…

#Jest进阶知识:整合 webpack 综合练习

这一小节&#xff0c;我们来做一个综合的练习&#xff0c;该练习会整合&#xff1a; typescriptwebpackjest 准备工作 首先创建项目目录&#xff0c;通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发&#xff0c;因此需要安装 typescript npm i t…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验

文章目录 引言一、鸿蒙原生应用的高效开发二、用户隐私保护&#xff1a;安全访问管理三、开发者实用工具&#xff1a;应用分析与A/B测试四、应用审核与分发&#xff1a;快速上线4.1 应用加密&#xff1a;保护代码安全4.2 自动化测试与检测前移&#xff1a;提升应用质量 五、结语…

基于SSM+微信小程序的社团登录管理系统(社团1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 2、项目技术 3、开发环境 4、功能介绍 1、项目介绍 基于SSM微信小程序的社团登录管理系统实现了管理员及社团、用户。 1、管理员实现了首页、用户管理、社团管理、社团信息管理、社…

虚拟化环境中的精简版 Android 操作系统 Microdroid

随着移动设备的普及和应用场景的多样化&#xff0c;安全性和隐私保护成为了移动操作系统的重要课题。Google推出的Microdroid&#xff0c;是一个专为虚拟化环境设计的精简版Android操作系统&#xff0c;旨在提供一个安全、隔离的执行环境。本文将详细介绍Microdroid的架构、功能…

手动搭建 Java Web 环境

操作场景 本文档介绍如何在 Linux 操作系统的腾讯云云服务器&#xff08;CVM&#xff09;上手动搭建 Java Web 环境。 进行手动搭建 Java Web 环境&#xff0c;您需要熟悉 Linux 命令&#xff0c;例如 CentOS 环境下通过 YUM 安装软件 等常用命令&#xff0c;并对所安装软件使…

WPF+MVVM案例实战与特效(二十四)- 粒子字体效果实现

文章目录 1、案例效果2、案例实现1、文件创建2.代码实现3、界面与功能代码3、总结1、案例效果 提示:这里可以添加本文要记录的大概内容: 2、案例实现 1、文件创建 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 ParticleWindow.xaml,在 Models 文件夹下创建粒子…

「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制

高级动画可以显著提升用户体验&#xff0c;为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画&#xff0c;包括弹性动画、透明度渐变和旋转缩放组合动画等示例。 关键词 高级动画弹性缓动自动动画缓动曲线 一、Animation 组件的高级缓动曲线 缓动曲线&#…

Golang--数组、切片、映射

1、数组 1.1 数组类型 var 数组名 [数组大小]数据类型 package main import "fmt"func main(){//1、定义一个数组var arr1 [5]intarr1[0] 100arr1[1] 200fmt.Println(arr1) //[100 200 0 0 0] } 1.2 数组的初始化方式 package main import "fmt" func …

Android音频进阶之PCM设备创建(九十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

【已解决】C# NPOI如何设置单元格格式

前言 设置单元格格式我们做表格必须要的一步&#xff0c;那么如何对单元格进行设置呢&#xff1f;直接上图看看效果图先&#xff0c;我做的是一个居中然后字体变化的操作&#xff0c;其他的查他的手册即可。 解决方法 直接上代码 IWorkbook excelDoc new XSSFWorkbook();…

系统学习算法:专题一 双指针

题目一&#xff1a; 算法原理&#xff1a; 首先我们可以对这道题目进行题目分类&#xff0c;像这种对数组以某种标准而进行一定的划分的题目&#xff0c;我们统称为数组分块问题&#xff0c;其中使用到的算法就是双指针算法&#xff0c;这里的指针并非真正int*这种&#xff0c…