跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
HTML / CSS大前端java

Cookie 机制深度解析:原理、版本与局限

HTTP 协议无状态导致服务端无法识别用户,Cookie 通过键值对机制解决此问题。分为会话与持久两类,支持版本 0 和版本 1 规范。Set-Cookie 响应头与 Cookie 请求头配合实现状态保持,包含过期时间、域名路径等属性。虽有效但存在安全风险及大小限制,需结合 HTTPS 使用。

LinuxPan发布于 2017/8/23更新于 2026/6/912 浏览
Cookie 机制深度解析:原理、版本与局限

Cookie 概述

HTTP 协议本质上是无状态的,这意味着服务器无法天然识别请求来源。用户每次访问站点时,服务端都像是在面对一个陌生人,既不知道他是谁,也无法判断这是否是他之前的访问记录。早期曾尝试过 IP 跟踪或 URL 嵌入等方式,但都未能从根本上解决问题。

Cookie 机制的出现,恰好填补了这一空白。当浏览器首次访问 Web 站点时,服务端会通过 Set-Cookie 响应头返回一组键值对(Key/Value)。浏览器收到后将其存储,并在后续符合规则的请求中自动携带这些信息回传给服务端。这样,服务端就能通过读取这些键值信息来识别当前用户身份。

Cookie 分类

根据生命周期不同,Cookie 主要分为两类:

  • 会话 Cookie:临时存在,未设置有效期。一旦用户关闭浏览器,数据即刻被清除。
  • 持久 Cookie:设置了明确的过期时间(Expires)或最大年龄(Max-Age)。即使关闭浏览器或重启机器,数据仍保留在硬盘上,直到过期或被手动删除。

Cookie 规范演进

目前主要涉及两个版本的规范:Cookie 版本 0 和 Cookie 版本 1。版本 1 是对版本 0 的扩展,虽然两者具备互操作性,但版本 0 在实际应用中更为广泛。

版本 0 属性

版本 0 定义了基础的 Set-Cookie 响应头和 Cookie 请求头。

Set-Cookie 响应头 服务端用于下发 Cookie 信息,基本语法如下:

Set-Cookie: key=value;expires=date;domain=domain;path=path;secure
  • key/value:服务端用于跟踪和识别用户的键值对。
  • expires:指定过期日期。若未指定,Cookie 将在浏览器会话结束时失效。
  • domain:限制 Cookie 可发送的域名。默认值为生成 Cookie 的服务器主机名。浏览器会根据此字段将 Cookie 路由到对应域名。
  • path:限定 Cookie 生效的请求路径。默认为生成 Cookie 的 URL 路径。
  • secure:仅在使用 SSL/TLS 安全连接时才发送 Cookie。若不设置则无传输限制。

示例:

Set-Cookie: member_id=1496800101;expires=Tuesday 16-Aug-01 22:10:11 GMT;domain="abc.com";path=/member;secure

Cookie 请求头 浏览器向服务端发起请求时携带已存储的 Cookie:

Cookie: key1=value1;key2=value2;key3=value3...

示例:

Cookie: member_id=1496800101

版本 1 属性

版本 1 引入了 Set-Cookie2 和 Cookie2 首部,增加了更多控制选项:

  1. 支持解释性文本(Comment),说明 Cookie 用途。
  2. 允许在浏览器退出时忽略过期时间直接销毁(Discard)。
  3. 使用相对秒数(Max-Age)设置生存周期。
  4. 增加端口限制(Port),结合 domain 和 path 共同控制生效范围。
  5. 请求头中会回传 domain、path 和 port 等附加信息。
  6. 引入版本号以实现互操作。
  7. 使用 $ 前缀标识服务端返回的属性。

Set-Cookie2 响应头语法:

Set-Cookie2: key=value;Version="1";Comment=Comment;CommentURL=CommentURL;Discard;Max-Age=age;domain=domain;path=path;Port=Port;secure

其中 Version 对应规范版本,Comment 说明用途,CommentURL 指向描述文档,Discard 标志浏览器退出即丢弃,Max-Age 设定生命周期秒数,Port 指定生效端口。

Cookie2 请求头示例:

Cookie: $Version="1";member_id=14690801;$Domain="abc.com";$path=/member

局限性

尽管 Cookie 有效解决了状态保持问题,但在实际使用中仍需注意以下缺点:

  1. 安全性风险:存储在客户端,易受 XSS 攻击或中间人劫持,敏感数据需谨慎处理。
  2. 容量限制:浏览器对单个 Cookie 大小及同一域名下的数量均有严格限制(通常单域名不超过 20 个,每个约 4KB)。
  3. 性能损耗:每次 HTTP 请求都会携带 Cookie 内容,数据量大时会增加带宽消耗并影响传输效率。

因此,在生产环境中,建议配合 HTTPS 加密传输,并避免在 Cookie 中存储敏感信息。

目录

  1. Cookie 概述
  2. Cookie 分类
  3. Cookie 规范演进
  4. 版本 0 属性
  5. 版本 1 属性
  6. 局限性
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Linux 命令:getfacl
  • CentOS 7 源码编译安装 Nginx 完整流程
  • 前端监控实战:基于 Sentry 的错误与性能管理
  • 双指针算法:单调性优化容器盛水问题
  • C++ 多态详解
  • C++ 有限状态自动机(FSM):原理、实现与应用全解析
  • 可视化大屏项目复盘:前端如何跨越技术与业务鸿沟
  • TRAE 与 VSCode 的 Git 工作流实战指南
  • 利用腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • 2024 前端主流框架演进与性能优化实践总结
  • 基于 Web Unlocker 与 n8n 的自动化资讯系统实战
  • DeepSeek 大模型私有化部署全指南:硬件配置与 Ollama 实操
  • 即梦 AI 与剪映创作课程资源汇总
  • 精易模块图像处理与OCR实战:构建自动化验证码识别系统
  • Java 泛型核心概念与用法详解
  • 华为 Mate XTs 非凡大师发布:搭载麒麟 9020 与鸿蒙 5.1
  • C++ 核心:继承机制详解
  • C# 封装:Windows 服务的安装、启停与状态查询
  • OpenCV 霍夫线变换原理与代码实现
  • OpenClaw 全平台卸载指南:Windows、macOS、Linux 及包管理器清理

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online