自学内容网 自学内容网

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


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. 用途

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

原文地址:https://blog.csdn.net/Dreaming_TI/article/details/143179014

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!