HTTP Header 中的 cookie 和 set-cookie

HTTP 协议中,CookieSet-Cookie 是两个不同的头部,分别用于发送 Cookie 和 设置 Cookie


Cookie MDN Doc

  • 作用 :客户端(浏览器)在请求中携带已存储的 Cookie 信息,发送给服务器。
  • 值的格式
    • 键值对 :多个 Cookie 以分号和空格分隔。(PS:空格不是必须的)

    • 示例

      http 复制代码
      Cookie: sessionId=abc123; theme=dark; userId=42
    • 解析后的结构

      javascript 复制代码
      {
        sessionId: "abc123",
        theme: "dark",
        userId: "42"
      }

set-cookie MDN Doc

Set-Cookie 是一个 HTTP 响应标头用于将 Cookie 由服务器发送到用户代理(即浏览器),以便用户代理在后续的请求中可以将其发送回服务器。要发送多个 Cookie,则应在同一响应中发送多个 Set-Cookie 标头。)

  • 作用 :服务器通过响应头设置新的 Cookie 或更新现有 Cookie

  • 值的格式
    每个 Set-Cookie 头设置一个 Cookie,可包含以下属性(用分号分隔):

    http 复制代码
    Set-Cookie: <name>=<value>; [Expires=<date>]; [Max-Age=<seconds>]; [Domain=<domain>]; [Path=<path>]; [Secure]; [HttpOnly]; [SameSite=<Strict|Lax|None>]
  • 示例

    http 复制代码
    Set-Cookie: sessionId=abc123; Path=/; Secure; HttpOnly; SameSite=Strict
    Set-Cookie: theme=dark; Max-Age=3600; Path=/settings

<cookie-name>=<cookie-value> 必填,其它均可以省略

定义 Cookienamevalue

Domain=<domain-value>

Domain属性被设置为某个域名时,不仅该域名下的请求会携带此 Cookie,该域名的所有子域名下的请求也会携带此 Cookie。例如,若设置 Domain=example.com,则 subdomain.example.com下的请求同样会携带该 Cookie.。

同主机的不同端口的 Cookie 会共享,这点和跨域的判断不同

Expires=<date>

HTTP 日期时间戳形式指定的 Cookie 的最长有效时间,如果未指定则自动为 会话期Cookie会话期Cookie在客户端关闭时即删除。

日期格式

例如:

txt 复制代码
Set-Cookie: sessionId=abc123; Expires=Sun, 31 Dec 2025 23:59:59 GMT

HttpOnly

设置 HttpOnly 属性后,JavaScript 无法通过 Document.cookie 来访问该 Cookie,但 Document.cookie 仍会返回其他非 HttpOnlyCookie

Max-Age=<number>

Cookie 过期之前需要经过的秒数,即有效期。秒数为 0 或负值将会使 Cookie 立刻过期并删除。假如同时设置了 ExpiresMax-Age 属性,那么 Max-Age 的优先级更高。

Partitioned

用于隔离第三方嵌入的 Cookie(如 iframe),避免跨站跟踪。

实验性功能,作用主要是控制 Cookie 是否共享,例如A网站嵌入了C网站页面。B网站也嵌入了C网站页面,之前的两个被嵌入的C网站页面的 Cookie 是共享的,如果开启了这个属性则两个被嵌入的C网站页面,之间不会共享 Cookie

Path=<path-value>

表示浏览器要发送该 Cookie 标头时,请求的 URL 中所必须存在的路径。即哪些请求需要带上这个Cookie

未指定时默认为发起请求的 Path

SameSite=<samesite-value>

控制 Cookie 是否随跨站请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击

  • Strict
    SameSite 属性设置为 Strict 时,浏览器只会在同站请求时发送该 Cookie。也就是说,只有当请求的源(协议、域名和端口)与设置 Cookie 的源完全相同时,浏览器才会在请求中携带该 Cookie。跨站请求(例如从另一个网站的链接点击进入当前网站)不会发送 SameSite=StrictCookie
  • Lax (默认值 Chrome 80 开始)
    SameSite=Lax 是一种相对宽松的策略。在跨站请求中,只有部分安全的顶级导航请求(如通过链接、表单的 GET 请求等)会发送该 Cookie,而其他跨站请求(如 POST 请求、XMLHttpRequestFetch 请求等)不会发送。在同站请求时,Cookie 会正常发送。
  • None
    SameSite=None 表示 Cookie 会在同站和跨站请求中都发送,但前提是该 Cookie 必须同时设置了 Secure 属性,即只能通过 HTTPS 协议传输。这是因为在不安全的 HTTP 连接下允许跨站发送 Cookie 会带来较大的安全风险。

Secure

表示仅当请求通过 https: 协议(localhost 不受此限制)发送时才会将该 Cookie 发送到服务器。

3. 关键区别

特性 Cookie Set-Cookie
方向 客户端 → 服务器 服务器 → 客户端
内容 仅包含键值对 键值对 + 控制属性(过期时间、安全标志等)
数量 所有 Cookie 合并为一个头 每个 Cookie 对应一个独立的 Set-Cookie
用途 发送已存储的 Cookie 设置、更新或删除 Cookie

4. 常见场景示例

http 复制代码
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax
场景 2:删除 Cookie(设置过期时间为过去)
http 复制代码
HTTP/1.1 200 OK
Set-Cookie: sessionId=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/
http 复制代码
GET /api/data HTTP/1.1
Cookie: sessionId=abc123; theme=dark

5. 示例(Node.js/Express)

设置 Cookie(服务端)
javascript 复制代码
res.setHeader('Set-Cookie', [
  'sessionId=abc123; Path=/; HttpOnly',
  'theme=dark; Max-Age=3600'
]);
// 追加
res.appendHeader(
    "Set-Cookie",
    `${cookieName}=; max-age=0; path=/`
);
读取 Cookie(服务端)
javascript 复制代码
// 使用 cookie 包解析
const cookie = require('cookie');
const cookies = cookie.parse(req.headers.cookie || '');
console.log(cookies.sessionId); // "abc123"

6. 安全性注意事项

  • HttpOnly :防止 JavaScript 通过 document.cookie 访问敏感 Cookie。
  • Secure:仅通过 HTTPS 传输 Cookie。
  • SameSite :防止跨站请求伪造(CSRF),建议设为 LaxStrict

总结

  • Cookie:客户端发送已存储的键值对。
  • Set-Cookie:服务器设置包含元数据的单个 Cookie。
相关推荐
思考的橙子4 小时前
初识HTTP
网络·网络协议·http
小宋要上岸6 小时前
基于TCP/QT/C++的网络调试助手测试报告
网络·c++·qt·网络协议·tcp/ip
大哥喝阔落7 小时前
查看自己的公有ip
网络·网络协议·tcp/ip
卑微小文9 小时前
国内期货市场行情实时采集:代理 IP 助力投资者决策
后端·http·html
二流小码农9 小时前
鸿蒙开发:正则中的match和matchAll
android·ios·harmonyos
π大星星️11 小时前
TCP的“四次挥手“与TIME_WAIT状态详解
网络·网络协议·tcp/ip
iOS大前端海猫11 小时前
Swift 中的Any、AnyObject和 AnyClass
ios·swift
前端花园11 小时前
八股文:OPTIONS请求条件与浏览器安全策略CORS
前端·http
帅次13 小时前
Flutter TextFormField 完全手册与设计最佳实践
android·flutter·ios·小程序·kotlin·gradle·android studio
哥谭居民000114 小时前
七天免登录 为什么不能用seesion,客户端的http请求自动携带cookei的机制(比较重要)涉及HTTP规范
java·http·tomcat