文章目录
- [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. 用途)
1. HTTP Cookie
HTTP Cookie(也称为 Web Cookie、浏览器 Cookie)是服务器发送到用户浏览器并保存在浏览器上的一块数据。主要功能如下:
- 状态保持:告知服务器两个请求是否来自同一浏览器,例如保持用户的登录状态。
- 用户偏好:记录用户的偏好设置,如语言选择、主题样式等。
在浏览器向同一服务器再次发起请求时,Cookie 会被携带并发送到服务器上,以实现个性化服务和状态管理。
1.1. HTTP Cookie 工作流程
-
首次访问:
- 在用户第一次访问网站时,服务器会在响应的 HTTP 头中设置
Set-Cookie
字段,用于发送 Cookie 到用户的浏览器。
- 在用户第一次访问网站时,服务器会在响应的 HTTP 头中设置
-
存储 Cookie:
- 浏览器在接收到 Cookie 后,会将其保存在本地(通常是按照域名进行存储)。
-
后续请求:
- 在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。
比如对于edge浏览器,我们可以通过任一浏览器的左上角按钮查看cookie信息:
可以看到在上面的cookie信息中,有一些属性如路径,期限等;
1.2. Cookie 分类
-
会话 Cookie(Session Cookie):
- 在浏览器关闭时失效。
- 主要用于临时存储用户会话数据。
-
持久 Cookie(Persistent Cookie):
- 带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
- 如果 Cookie 是一个持久性的 Cookie,那么它实际上是浏览器相关的,存储在特定目录下的一个文件。
-
存储格式:
- 持久 Cookie 通常以二进制或 SQLite 格式存储,直接查看这些文件可能会看到乱码或无法读取的内容。
- 一般情况下,可以通过浏览器的相关选项直接查看 Cookie。
1.3. 安全性
根据上面的内容,我们知道Cookie是存储在客户端中的,存在被篡改或窃取的风险;
主要用途
-
用户认证和会话管理(重要):
- 确保用户在不同请求之间的身份验证和会话状态。
-
跟踪用户行为:
- 记录用户在网站上的活动,以便进行分析和优化。
-
缓存用户偏好:
- 保存用户的个性化设置和偏好,以提供更好的用户体验。
-
查看 Cookie:
- 在一些浏览器中,可以直接通过设置 查看和管理存储的 Cookie。
2. Set-Cookie 报头
HTTP 存在一个报头选项:Set-Cookie,用于给浏览器设置 Cookie 值。
-
添加方式:
- 在 HTTP 响应头中添加
Set-Cookie
字段。
- 在 HTTP 响应头中添加
-
客户端处理:
- 客户端(如浏览器)接收到该字段后,会获取、设置并保存 Cookie。
2.1. Set-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. 生命周期
- 如果设置了 expires 属性, 则 Cookie 将在指定的日期 / 时间后过期。
- 如果没有设置 expires 属性, 则 Cookie 默认为会话 Cookie, 即当浏览器关闭时过期。
另外,以安全性考虑,在使用cookie时可以采用下面的方法:
-
使用 HttpOnly:设置此标志可防止客户端脚本(如 JavaScript)访问 Cookie,降低跨站脚本攻击的风险。
-
设置 Secure:仅在 HTTPS 连接中发送 Cookie,确保数据在传输过程中加密。
-
使用 SameSite :设置为
Strict
或Lax
,限制跨站请求时 Cookie 的发送,减少跨站请求伪造攻击的风险。 -
设置短期有效期 :通过
Expires
或Max-Age
将 Cookie 设置为短期有效,降低被窃取后利用的风险。 -
定期轮换 Cookie:定期更新 Cookie 的值和相关信息,增加安全性。
对于一般的信息,可以使用Cookie,但对于一些私密性较高的数据,比如用户密码, 浏览痕迹等,如果使用Cookie保存在客户端,很容易被窃取造成泄露,为了避免这一情况,我们引入了Session的概念
3. HTTP Session
HTTP Session 是服务器用来跟踪用户与服务器交互期间用户状态的机制。 由于 HTTP 协议是无状态的(每个请求都是独立的) , 因此服务器需要通过 Session 来记录用户的信息
3.1. 工作流程
- 当用户首次访问网站时, 服务器会为用户创建一个唯一的
Session ID
, 并通过Cookie
将其发送到客户端。 - 客户端在之后的请求中会携带这个
Session ID
, 服务器通过Session ID
来识别用户, 从而获取用户的会话信息。 - 服务器通常会将
Session
信息存储在内存、 数据库或缓存中
3.2. 安全性
-
与
Cookie
相似, 由于Session ID
是在客户端和服务器之间传递的, 因此也存在被窃取的风险。但是一般虽然Cookie
被盗取了, 但是用户只泄漏了一个Session ID
, 私密信息暂时没有被泄露的风险; -
Session ID
便于服务端进行客户端有效性的管理, 比如异地登录。也可以通过
HTTPS
和设置合适的Cookie
属性(如HttpOnly
和Secure
) 来增强安全性。
3.3. 超时 与 失效
Session
也可以设置超时时间, 当超过这个时间后, Session
会自动失效。
同时服务器也可以主动使 Session
失效;
3.4. 用途
- 用户认证和会话管理
- 存储用户的临时数据(如购物车内容)
- 实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)