跳到主要内容

3. 概述 (Overview)

本节概述一种方式, 源服务器可通过该方式向用户代理发送状态信息, 用户代理也可通过该方式将状态信息返回给源服务器.

为了存储状态, 源服务器会在 HTTP 响应中包含 Set-Cookie 头. 在后续请求中, 用户代理会向源服务器返回 Cookie 请求头. Cookie 头包含用户代理先前在 Set-Cookie 头中收到的 cookie. 源服务器可以自由忽略 Cookie 头, 或将其内容 用于应用定义的目的.

源服务器 MAY 随任何响应发送 Set-Cookie 响应头. 用户代理 MAY 忽略 100 级状态码 响应中包含的 Set-Cookie 头, 但 MUST 处理其他响应中包含的 Set-Cookie 头 (包括 400 级和 500 级状态码响应). 源服务器可以在单个响应中包含多个 Set-Cookie 头字段. Cookie 或 Set-Cookie 头字段的存在并不阻止 HTTP 缓存 存储和重用响应.

源服务器 SHOULD NOT 将多个 Set-Cookie 头字段折叠为单个头字段. 折叠 HTTP 头字段的通常机制 (即 [RFC2616] 中定义的机制) 可能改变 Set-Cookie 头字段的 语义, 因为 Set-Cookie 对 %x2C (",") 字符的使用方式与这种折叠存在冲突.

3.1. 示例 (Examples)

使用 Set-Cookie 头, 服务器可以在 HTTP 响应中向用户代理发送一个短字符串, 用户代理会在未来处于该 cookie 作用域内的 HTTP 请求中返回该字符串. 例如, 服务器可以向用户代理发送一个名为 SID 且值为 31d4d96e407aad42 的 "session identifier". 随后, 用户代理会在后续请求中返回该会话标识符.

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42

服务器可以使用 Path 和 Domain 属性改变 cookie 的默认作用域. 例如, 服务器可以 指示用户代理向 example.com 的每个路径和每个子域返回该 cookie.

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=example.com

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42

如下一个示例所示, 服务器可以在用户代理处存储多个 cookie. 例如, 服务器可以通过 返回两个 Set-Cookie 头字段来存储会话标识符以及用户偏好的语言. 注意, 服务器使用 Secure 和 HttpOnly 属性为更敏感的会话标识符提供额外安全保护 (见第 4.1.2 节).

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly Set-Cookie: lang=en-US; Path=/; Domain=example.com

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US

注意, 上面的 Cookie 头包含两个 cookie, 一个名为 SID, 另一个名为 lang. 如果服务器 希望用户代理跨多个 "sessions" (例如用户代理重启) 持久保存该 cookie, 服务器可以在 Expires 属性中指定过期日期. 注意, 如果用户代理的 cookie 存储超过配额, 或者用户 手动删除服务器的 cookie, 用户代理可能会在过期日期之前删除该 cookie.

== Server -> User Agent ==

Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US

最后, 为了移除 cookie, 服务器会返回一个带有过去过期日期的 Set-Cookie 头. 只有当 Set-Cookie 头中的 Path 和 Domain 属性与创建该 cookie 时使用的值匹配时, 服务器才能成功移除该 cookie.

== Server -> User Agent ==

Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42