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

文章目录

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

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

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

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


  1. 首次访问

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

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

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

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


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


  1. 会话 Cookie(Session Cookie)

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

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

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

1.3. 安全性

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

主要用途

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

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

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

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

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

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

  • 添加方式

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

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

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

bash 复制代码
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=abc123 Cookie 的名称和值
Path / 指定 Cookie 的有效路径,表示在整个网站中有效
Domain example.com 指定 Cookie 的有效域名,仅在该域名及子域名中有效
Expires Wed, 21 Oct 2024 07:28:00 GMT 指定 Cookie 的过期日期和时间
Max-Age 86400 指定 Cookie 的最大存活时间(以秒为单位)
Secure --- 仅在安全的 HTTPS 连接中发送 Cookie
HttpOnly --- 防止客户端脚本访问该 Cookie,增强安全性
SameSite Strict 限制跨站请求时 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. 用途

  • 用户认证和会话管理
  • 存储用户的临时数据(如购物车内容)
  • 实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)
相关推荐
长安110835 分钟前
前后端、网关、协议方面补充
网络
hzyyyyyyyu4 小时前
隧道技术-tcp封装icmp出网
网络·网络协议·tcp/ip
南猿北者4 小时前
docker Network(网络)
网络·docker·容器
Hacker_Nightrain5 小时前
网络安全CTF比赛规则
网络·安全·web安全
网络安全指导员6 小时前
恶意PDF文档分析记录
网络·安全·web安全·pdf
co0t7 小时前
计算机网络(11)和流量控制补充
服务器·网络·计算机网络
白总Server7 小时前
JVM解说
网络·jvm·物联网·安全·web安全·架构·数据库架构
清尘沐歌7 小时前
有什么好用的 WebSocket 测试工具吗?
websocket·网络协议·测试工具
清尘沐歌7 小时前
有什么好用的 WebSocket 调试工具吗?
网络·websocket·网络协议
Li_0304067 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络