Web 的设计方式是,Web 浏览器向网站发出的每个请求都是独立的。从设计上来说,Web 没有“记忆”。每次打开网页时,您访问的网站都无法记住您上次会话中的信息。 这有助于提高网络效率,因为无需使用机制来跟踪请求和响应。
但网络的健忘性也带来了一个问题。例如,如果您所在的网站无法记住您刚刚放入购物车的商品,那么购物车如何正常运作?
Cookie 的发明正是为了解决这个问题。
Cookie 可让网站记住您的信息
当您访问网站上的某个网页时,Web 浏览器会向网站的服务器请求网页上包含的资源,例如 HTML、CSS、JavaScript 或图片。
Web 浏览器和网站通过遵循 HTTP 协议进行互动。这是一套标准化的通信规则。
为了响应对资源的 HTTP 请求,网站服务器可以在提供资源本身的同时,还提供称为标头的额外信息。HTTP 响应中包含的 Set-Cookie
标头会告知浏览器存储一些文本:名称和值。这称为 Cookie。例如,响应标头 Set-Cookie: cat=tabby
会告知浏览器存储名称为“cat”、值为“tabby”的 Cookie。
设置该 Cookie 后,浏览器后续向网站发出的请求将包含 Cookie: cat=tabby
标头。网站的服务器可以从请求标头访问 Cookie,并使用该值。
Cookie 的工作原理:分步说明
假设您访问了网站 cats.example
。该网站希望向您展示一张随机的猫咪图片,并记录向您展示了哪只猫。
以下步骤介绍了如何通过 Cookie 实现此目的。
1. 浏览器请求文件
您访问了网站 cats.example
的首页。
浏览器处理完首页 HTML 后,会请求网页上的文件,包括来自 cats.example
的 cat.jpg
。
2. 网站服务器做出响应
cats.example
处的服务器会返回图片文件 cat.jpg
。
在响应中,服务器包含一个标头:Set-Cookie: cat=tabby
。
3. 浏览器接收响应
浏览器会收到图片文件,并处理其中包含的 Set-Cookie: cat=tabby
标头。
存储的 Cookie:名称 cat
,值 tabby
。
4. 浏览器发出其他请求
从现在开始,您的浏览器会在向 cats.example
发出的请求中包含 Cookie: cat=tabby
标头。
当 cats.example
Web 服务器收到请求时,它可以处理 Cookie 并对该值执行任何操作,例如确保不会再次向您发送同一只虎斑猫的图片。
以下是整个 Cookie 处理流程:
- 您的浏览器向网站的服务器请求文件。
- 服务器可以在发送的文件中添加标头(例如
Set-Cookie: cat=tabby
),以响应请求。 - 当浏览器收到响应时,它会存储相应 Cookie。
- 在每个后续请求中,浏览器都会通过
Cookie: cat=tabby
标头将 Cookie 发送到服务器。
使用 JavaScript 访问 Cookie
上一个示例使用 Set-Cookie
响应标头设置 Cookie。
您还可以使用 JavaScript 通过 document.cookie
方法创建 Cookie。
试用演示版:javascript-cookie.glitch.me。
了解详情:文档:cookie 属性。
我们为什么需要 Cookie?
1994 年,工程师 Lou Montulli 在软件公司 Netscape 工作,该公司后来打造了 20 世纪 90 年代中期最受欢迎的网络浏览器。与此同时,一家电信公司 MCI 正在尝试为全球首批在线商店之一构建购物车。MCI 联系了 Montulli,向他说明了他们的问题。Montulli 随即在 HTTP 中添加了一项功能,使网站能够在用户的 Web 浏览器上存储少量文本(名称和值),例如 cart-id=123
。他将其称为“Cookie”,因为当时程序员使用“magic cookie”一词来指代数据通信中包含的一小段额外信息。
Montulli 在不到一周的时间内完成了 HTTP Cookie 的工作。他当时并不知道,Cookie 会成为关键 Web 平台功能(包括广告、登录、付款和欺诈检测)的基础。Cookie 是一种看似简单的技术,但会产生深远的副作用。
Cookie 的用途
Cookie 可让浏览器存储少量有关用户的信息,以便在多个请求之间“记住”某些内容。Cookie 有多种用途:
- 会话管理
允许网站识别用户,例如在不同网页上保持登录状态。 - 个性化
存储用户偏好设置(例如语言、主题或最近浏览过的商品),以自定义网站体验。 - 跟踪
过去,Cookie 一直用于跨网站跟踪用户行为,以实现定向广告和其他使用场景。
Cookie 主要用于标识符,而不是直接存储信息。
例如,在线宠物店的购物车 Cookie 不会列出商品,而是提供一个账号 ID,让宠物店可以在其服务器端数据存储中查找您的购物车中的商品。
向宠物店服务器发出的请求可能包含如下所示的 Cookie 标头:
Cookie: _cart=CART1.2.34567890.123456789
然后,服务器可以在其数据存储区中查找 _cart
账号,并包含有关请求的其他信息。
了解详情
- Cookie 属性
- 什么是第三方 Cookie?
- HTTP 请求和响应
- Cookie 工具
- Cookie 演示
- 使用 HTTP Cookie
- 神奇的 Cookie:Lou Montulli 如何治愈 Web 的健忘症
- HTTP Cookie(原始规范)
- HTTP Cookie,或如何不设计协议