一、Cookie与Set-Cookie
1. Cookie
- 定义: Cookie 是客户端(通常是浏览器)存储的一小段数据,由服务器通过 Set-Cookie 响应头设置,并在后续请求中通过 Cookie 请求头发送回服务器。
- 作用: 用于在客户端保存状态信息,例如用户登录状态、偏好设置等。
- 使用场景:
客户端在每次请求时,自动将 Cookie 附加到请求头中,发送给服务器。
服务器通过读取 Cookie 来识别用户或恢复会话状态。 - 示例
GET /example HTTP/1.1
Host: www.example.com
Cookie: name=value; sessionid=12345
客户端将存储的 Cookie 发送给服务器
2、Set-Cookie
- 定义: Set-Cookie 是服务器在 HTTP 响应中发送的响应头,用于在客户端设置或更新 Cookie。
- 作用: 服务器通过 Set-Cookie 向客户端发送数据,要求客户端保存这些数据并在后续请求中回传。
- 使用场景:
服务器需要在客户端存储数据时(如用户登录成功后的会话 ID)。
服务器可以设置 Cookie 的属性,如过期时间、作用域、安全性等。 - 示例
HTTP/1.1 200 OK
Set-Cookie: sessionid=12345; Path=/; Expires=Wed, 09 Jun 2023 10:18:14 GMT; Secure; HttpOnly
服务器通过 Set-Cookie 设置一个名为 sessionid 的 Cookie,并指定了路径、过期时间、安全性和 HTTP-only 属性
3、主要区别
特性 | Cookie | Set-Cookie |
---|---|---|
类型 | 请求头 | 响应头 |
作用 | 客户端将存储的 Cookie 发送给服务器 | 服务器要求客户端设置或更新 Cookie |
使用场景 | 客户端发起请求时 | 服务器返回响应时 |
数据流向 | 客户端 → 服务器 | 服务器 → 客户端 |
示例 | Cookie: name=value; sessionid=12345 | Set-Cookie: sessionid=12345; Path=/ |
4、Set-Cookie 的属性
Set-Cookie 可以设置多个属性来控制 Cookie 的行为:
- Name=Value: Cookie 的名称和值。
- Expires: Cookie 的过期时间(GMT 格式)。
示例: Expires=Wed, 09 Jun 2023 10:18:14 GMT - Max-Age: Cookie 的最大存活时间(秒)。
示例: Max-Age=3600(1 小时后过期) - Domain: Cookie 的作用域(指定域名)。
示例: Domain=example.com - Path: Cookie 的作用路径。
示例: Path=/(根路径下有效) - Secure: 仅在使用 HTTPS 时发送 Cookie。
示例: Secure - HttpOnly: 禁止 JavaScript 访问 Cookie,防止 XSS 攻击。
示例: HttpOnly - SameSite: 控制 Cookie 是否在跨站请求时发送。
示例: SameSite=Strict(严格模式,禁止跨站发送)
5、工作流程
在客户端(如浏览器)第一次向服务器发送请求时,客户端是没有 Cookie 的。Cookie 的生成和传递过程是一个逐步建立的过程,以下是详细的解释:
- 1.、第一次请求(无 Cookie)
当客户端第一次访问某个网站时,浏览器会向服务器发送一个 HTTP 请求。由于是第一次访问,客户端还没有存储任何与该网站相关的 Cookie,因此请求头中不会包含 Cookie 字段。
示例
GET /index.html HTTP/1.1
Host: www.example.com
- 2、服务器响应并设置 Cookie
服务器接收到请求后,会根据业务逻辑决定是否需要设置 Cookie(例如,生成一个会话 ID 或其他标识)。服务器通过 Set-Cookie 响应头将 Cookie 发送给客户端。
示例
HTTP/1.1 200 OK
Set-Cookie: sessionid=12345; Path=/; HttpOnly
- 3、客户端存储 Cookie
客户端(浏览器)接收到服务器的响应后,会解析 Set-Cookie 头,并将 Cookie 存储在本地。
存储的 Cookie 通常包括以下信息:
Cookie 的名称和值(如 sessionid=12345)。
作用域(如 Domain 和 Path)。
过期时间(如 Expires 或 Max-Age)。
其他属性(如 Secure、HttpOnly、SameSite)。 - 4、后续请求(携带 Cookie)
在客户端存储了 Cookie 后,后续对同一服务器的请求会自动将 Cookie 附加到请求头中。
示例
GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: sessionid=12345
6、 Cookie 的初始来源
- 第一次请求时没有 Cookie:客户端第一次访问服务器时,请求头中没有 Cookie 字段。
- Cookie 是由服务器生成的:服务器通过 Set-Cookie 响应头将 Cookie 发送给客户端。
- 客户端存储并回传 Cookie:客户端在后续请求中自动将存储的 Cookie 发送给服务器。
7、实际应用场景
- 会话管理:
服务器在用户登录成功后生成一个会话 ID,并通过 Set-Cookie 发送给客户端。
客户端在后续请求中携带该会话 ID,服务器通过验证会话 ID 来识别用户。 - 个性化设置:
服务器可以通过 Cookie 存储用户的偏好设置(如语言、主题等)。 - 跟踪用户行为:
服务器可以通过 Cookie 记录用户的访问行为,用于分析或广告投放。
二、seesion详解
1、 基本概念
- Cookie:
是客户端(通常是浏览器)存储的一小段数据。
由服务器通过 Set-Cookie 响应头发送给客户端。
客户端在后续请求中自动将 Cookie 附加到请求头中发送给服务器。
数据存储在客户端。 - Session:
是服务器端存储的用户状态信息。
服务器为每个用户创建一个唯一的会话 ID,并将该 ID 通过 Cookie 或 URL 重写的方式发送给客户端。
客户端在后续请求中发送会话 ID,服务器根据该 ID 查找对应的会话数据。
数据存储在服务器端。
2、存储位置
- Cookie:
数据存储在客户端(浏览器)中。
可以是内存 Cookie(浏览器关闭后失效)或持久化 Cookie(根据过期时间存储在硬盘中)。 - Session:
数据存储在服务器端(如内存、数据库或文件系统)。
客户端只存储会话 ID(通常通过 Cookie 存储)。
3、数据安全性
- Cookie:
数据存储在客户端,可能被篡改或窃取。
可以通过设置 Secure(仅 HTTPS 传输)、HttpOnly(禁止 JavaScript 访问)等属性提高安全性。 - Session:
数据存储在服务器端,客户端只存储会话 ID,相对更安全。
会话 ID 仍需通过 Cookie 或 URL 传递,可能被窃取(如通过 XSS 攻击)。
4、数据大小限制
- Cookie:
单个 Cookie 大小通常限制为 4KB。
每个域名下的 Cookie 数量和总大小也有限制(通常为 50 个 Cookie,总大小不超过 4KB)。 - Session:
数据存储在服务器端,没有严格的大小限制。
但存储过多数据可能影响服务器性能。
5、生命周期
- Cookie:
可以设置过期时间(Expires 或 Max-Age),可以是会话级(浏览器关闭后失效)或持久化(长期有效)。
客户端可以手动清除 Cookie。 - Session:
生命周期由服务器控制,通常在一定时间内无活动后失效(如 30 分钟)。
服务器可以主动销毁 Session。
6、使用场景
- Cookie:
适合存储少量不敏感的数据,如用户偏好设置、跟踪信息等。
适合跨页面或跨会话的状态管理。 - Session:
适合存储敏感数据,如用户登录状态、购物车信息等。
适合短期状态管理(如一次会话期间)。
7、实现方式
- Cookie:
服务器通过 Set-Cookie 响应头设置 Cookie。
客户端自动管理 Cookie 的存储和发送。 - Session:
服务器创建会话并生成唯一的会话 ID。
会话 ID 通过 Cookie 或 URL 重写发送给客户端。
客户端在后续请求中发送会话 ID,服务器根据 ID 查找对应的会话数据。
8、 性能影响
- Cookie:
每次请求都会携带 Cookie,可能增加请求头的大小。
数据存储在客户端,对服务器性能无直接影响。 - Session:
数据存储在服务器端,可能占用服务器内存或存储资源。
需要根据会话 ID 查找数据,可能增加服务器负载。
9、示例对比
- Cookie 示例
1、服务器设置 Cookie:
HTTP/1.1 200 OK
Set-Cookie: username=john; Path=/; Expires=Wed, 09 Jun 2023 10:18:14 GMT
2、客户端发送 Cookie:
GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: username=john
- Session 示例
1、服务器创建 Session 并发送会话 ID:
HTTP/1.1 200 OK
Set-Cookie: sessionid=12345; Path=/; HttpOnly
2、客户端发送会话 ID:
GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: sessionid=12345
服务器根据会话 ID 查找 Session 数据:
会话数据:{ sessionid: 12345, username: “john”, loggedIn: true }
10、总结对比表
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端 | 服务器端 |
数据安全性 | 较低(数据存储在客户端) | 较高(数据存储在服务器端) |
数据大小限制 | 有(通常 4KB) | 无严格限制 |
生命周期 | 可设置过期时间 | 由服务器控制 |
使用场景 | 存储少量不敏感数据 | 存储敏感数据 |
实现方式 | 通过 Set-Cookie 设置 | 通过会话 ID 管理 |
性能影响 | 增加请求头大小 | 占用服务器资源 |
11.、如何选择?
- 如果需要存储少量不敏感的数据,并且希望数据在客户端长期保存,使用 Cookie。
- 如果需要存储敏感数据或大量数据,并且希望数据在服务器端管理,使用 Session。
在实际开发中,Cookie 和 Session 通常会结合使用。例如,使用 Cookie 存储会话 ID,而将实际数据存储在 Session 中。
理论上,只用 Cookie 是可以实现状态管理的,但在实际应用中,Session 的引入是为了解决 Cookie 的一些局限性,尤其是在安全性、数据存储和性能方面。