当前位置: 首页 > article >正文

理解HTTP中的Cookie与Session:机制、安全性与报头响应

文章目录

  • 1. HTTP Cookie
    • 1.1. HTTP Cookie 工作流程
    • 1.2. Cookie 分类
    • 1.3. 安全性
    • 主要用途
  • 2. Set-Cookie 报头
    • 2.1. Set-Cookie 格式
    • 2.2. 生命周期
  • 3. HTTP Session
    • 3.1. 工作流程
    • 3.2. 安全性
    • 3.3. 超时 与 失效
    • 3.4. 用途


1. HTTP Cookie

HTTP Cookie(也称为 Web Cookie、浏览器 Cookie)是服务器发送到用户浏览器并保存在浏览器上的一块数据。主要功能如下:

  • 状态保持:告知服务器两个请求是否来自同一浏览器,例如保持用户的登录状态。
  • 用户偏好:记录用户的偏好设置,如语言选择、主题样式等。

在浏览器向同一服务器再次发起请求时,Cookie 会被携带并发送到服务器上,以实现个性化服务和状态管理。


1.1. HTTP Cookie 工作流程

  1. 首次访问

    • 在用户第一次访问网站时,服务器会在响应的 HTTP 头中设置 Set-Cookie 字段,用于发送 Cookie 到用户的浏览器。
  2. 存储 Cookie

    • 浏览器在接收到 Cookie 后,会将其保存在本地(通常是按照域名进行存储)。
  3. 后续请求

    • 在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。

比如对于edge浏览器,我们可以通过任一浏览器的左上角按钮查看cookie信息:

在这里插入图片描述
在这里插入图片描述

可以看到在上面的cookie信息中,有一些属性如路径,期限等;


1.2. Cookie 分类

  1. 会话 Cookie(Session Cookie)

    • 在浏览器关闭时失效。
    • 主要用于临时存储用户会话数据。
  2. 持久 Cookie(Persistent Cookie)

    • 带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
    • 如果 Cookie 是一个持久性的 Cookie,那么它实际上是浏览器相关的,存储在特定目录下的一个文件。
  3. 存储格式

    • 持久 Cookie 通常以二进制或 SQLite 格式存储,直接查看这些文件可能会看到乱码或无法读取的内容。
    • 一般情况下,可以通过浏览器的相关选项直接查看 Cookie。

1.3. 安全性

根据上面的内容,我们知道Cookie是存储在客户端中的,存在被篡改或窃取的风险;

主要用途

  1. 用户认证和会话管理(重要):

    • 确保用户在不同请求之间的身份验证和会话状态。
  2. 跟踪用户行为

    • 记录用户在网站上的活动,以便进行分析和优化。
  3. 缓存用户偏好

    • 保存用户的个性化设置和偏好,以提供更好的用户体验。
  4. 查看 Cookie

    • 在一些浏览器中,可以直接通过设置 查看和管理存储的 Cookie。

2. Set-Cookie 报头

HTTP 存在一个报头选项:Set-Cookie,用于给浏览器设置 Cookie 值。

  • 添加方式

    • 在 HTTP 响应头中添加 Set-Cookie 字段。
  • 客户端处理

    • 客户端(如浏览器)接收到该字段后,会获取、设置并保存 Cookie。

2.1. Set-Cookie 格式

下面举一个具体的Set-Cookie的实例:

Set-Cookie: sessionId=abc123; Path=/; Domain=example.com; Expires=Wed, 21 Oct 2024 07:28:00 GMT; Secure; HttpOnly; SameSite=Strict

需要注意的是,set-Cookie 的时间格式必须遵守 RFC 1123 标准, 具体格式样例: Tue, 01 Jan 2030 12:34:56GMT 或者 UTC。

各部分解释:

属性描述
名称和值sessionId=abc123Cookie 的名称和值
Path/指定 Cookie 的有效路径,表示在整个网站中有效
Domainexample.com指定 Cookie 的有效域名,仅在该域名及子域名中有效
ExpiresWed, 21 Oct 2024 07:28:00 GMT指定 Cookie 的过期日期和时间
Max-Age86400指定 Cookie 的最大存活时间(以秒为单位)
Secure仅在安全的 HTTPS 连接中发送 Cookie
HttpOnly防止客户端脚本访问该 Cookie,增强安全性
SameSiteStrict限制跨站请求时 Cookie 的发送,仅在同源请求中发送

根据上面的实例,对于Set-Cookie的格式有以下要求:

  • 每个 Cookie 属性都以分号(;) 和空格( ) 分隔。
  • 名称和值之间使用等号(=) 分隔。
  • 如果 Cookie 的名称或值包含特殊字符(如空格、 分号、 逗号等) , 则需要进行 URL 编码。

2.2. 生命周期

  1. 如果设置了 expires 属性, 则 Cookie 将在指定的日期 / 时间后过期。
  2. 如果没有设置 expires 属性, 则 Cookie 默认为会话 Cookie, 即当浏览器关闭时过期。

另外,以安全性考虑,在使用cookie时可以采用下面的方法:

  1. 使用 HttpOnly:设置此标志可防止客户端脚本(如 JavaScript)访问 Cookie,降低跨站脚本攻击的风险。

  2. 设置 Secure:仅在 HTTPS 连接中发送 Cookie,确保数据在传输过程中加密。

  3. 使用 SameSite:设置为 StrictLax,限制跨站请求时 Cookie 的发送,减少跨站请求伪造攻击的风险。

  4. 设置短期有效期:通过 ExpiresMax-Age 将 Cookie 设置为短期有效,降低被窃取后利用的风险。

  5. 定期轮换 Cookie:定期更新 Cookie 的值和相关信息,增加安全性。


对于一般的信息,可以使用Cookie,但对于一些私密性较高的数据,比如用户密码, 浏览痕迹等,如果使用Cookie保存在客户端,很容易被窃取造成泄露,为了避免这一情况,我们引入了Session的概念


3. HTTP Session

HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。 由于 HTTP 协议是无状态的(每个请求都是独立的) , 因此服务器需要通过 Session 来记录用户的信息


3.1. 工作流程

  1. 当用户首次访问网站时, 服务器会为用户创建一个唯一的 Session ID, 并通过 Cookie 将其发送到客户端。
  2. 客户端在之后的请求中会携带这个 Session ID, 服务器通过 Session ID 来识别用户, 从而获取用户的会话信息。
  3. 服务器通常会将 Session 信息存储在内存、 数据库或缓存中

3.2. 安全性

  • Cookie 相似, 由于 Session ID 是在客户端和服务器之间传递的, 因此也存在被窃取的风险。但是一般虽然 Cookie 被盗取了, 但是用户只泄漏了一个 Session ID, 私密信息暂时没有被泄露的风险;

  • Session ID 便于服务端进行客户端有效性的管理, 比如异地登录。
    也可以通过 HTTPS 和设置合适的 Cookie 属性(如 HttpOnlySecure) 来增强安全性。


3.3. 超时 与 失效

Session 也可以设置超时时间, 当超过这个时间后, Session 会自动失效。
同时服务器也可以主动使 Session 失效;


3.4. 用途

  • 用户认证和会话管理
  • 存储用户的临时数据(如购物车内容)
  • 实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)

http://www.kler.cn/a/394871.html

相关文章:

  • Excel粘贴复制不完整的原因以及解决方法
  • Nginx界的天花板-Oracle 中间件OHS 11g服务器环境搭建
  • LabVIEW软件开发的未来趋势
  • C#调用OpenXml,读取excel行数据,遇到空单元跳过现象处理
  • iClient3D for Cesium 加载shp数据并拉伸为白模
  • 论文DiffBP: generative diffusion of 3D molecules for target protein binding
  • 华为路由策略配置
  • SSL 证书申请以及配置流程
  • MySQL中,使用XtraBackup进行备份锁
  • Matlab2022b安装MinGW64
  • Windows仿macOS?看这一篇就够了
  • go语言 分布式一致
  • 知识库管理系统:企业数字化转型的加速器
  • 大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
  • Kubernetes 上部署 ZenTao(禅道)
  • 深入探究 JavaScript 中的继承方式
  • WSL2安装Ubuntu22.04并开启GPU进行ML学习教程
  • Java NIO 深度解析:构建高效的 I/O 操作
  • WEB3.0介绍
  • 让Git走代理
  • 服务器数据恢复——Ext4文件系统使用fsck后mount不上的数据恢复案例
  • 【网络安全渗透测试零基础入门】之Vulnhub靶场PWNOS: 2.0 多种渗透方法,收藏这一篇就够了!
  • Rust 所有权机制
  • MacBook 下载vscode不能被解压及打开的解决方案
  • Oracle19C AWR报告分析之Instance Efficiency Percentages (Target 100%)
  • A tour of Go - Web Crawler