TOC

HTTP Cookie

语法

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure

// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
  • Expires: 过期时间,格式类似 Wed, 21 Oct 2015 07:28:00 GMT
  • Max-Age: 有效期,整数,单位为秒
    其实作用和 Expires 一样, 不过据说 Max-Age 优先级更高
    Expire 出现的比较早,出于历史原因,一般两个值都会设置(保持一致)
    如果不指定 Expires / Max-Age, 那就表示这个 Cookie 会在浏览器关闭后失效
  • Domain: 限定 Cookie 在哪些域名下可用
  • Path: 限定 Cookie 在哪些路径下可用
  • Secure: 是否只支持 HTTPS
  • HttpOnly: 是否只能通过 HTTP 访问
  • SameSite: 是否允许跨站(不是跨域!只要二级域名相同就行)

  • Strict: 仅允许同站请求携带 Cookie,其他站点的请求不带 Cookie
    比如有个网站的 Cookie SameSite 全部设定为 Strict,那么从其他网站跳转过来的请求全部不会带 Cookie。

  • Lax: 默认,跳转,GET 表单不受影响,只是排除 Ajax 请求,静态资源加载,iframe,以及非安全方法(POST,PUT, PATCH,DELETE)。

    请求类型 示例 正常情况 Lax
    链接 <a href="..."></a> 发送 Cookie 发送 Cookie
    预加载 <link rel="prerender" href="..."/> 发送 Cookie 发送 Cookie
    GET 表单 <form method="GET" action="..."> 发送 Cookie 发送 Cookie
    POST 表单 <form method="POST" action="..."> 发送 Cookie 不发送
    iframe <iframe src="..."></iframe> 发送 Cookie 不发送
    AJAX $.get("...") 发送 Cookie 不发送
    Image <img src="..."> 发送 Cookie 不发送
  • None: Cookie 可以跨域,但是只有在 Secure 的情况下才有效

Google Chrome 新增了的两个属性:SameParty 和 Priority,目前没有得到广泛支持。

  1. Cookie 的 Value 是基于文本的, 所以只支持字符串
  2. Domain, Path, Name 三元组,可以确定一个 Cookie
    不同 Domain,或者不同 Path 可以有相同 Name 的 Cookie

示例

HTTP/1.1 200 OK
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Fri, 28 Jan 2022 06:47:46 GMT
Expires: Fri, 28 Jan 2022 06:46:56 GMT
Set-Cookie: BAIDUID=83FA9905CC686266A7FE1720AC2E3CE5:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=83FA9905CC686266A7FE1720AC2E3CE5; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1643352466; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=83FA9905CC6862669ADAA13587EB99B7:FG=1; max-age=31536000; expires=Sat, 28-Jan-23 06:47:46 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=35104_31253_35488_35777_34584_35490_35245_35796_35320_26350_22160; path=/; domain=.baidu.com
Set-Cookie: BAIDUID_BFESS=83FA9905CC686266A7FE1720AC2E3CE5:FG=1; Path=/; Domain=baidu.com; Expires=Thu, 31 Dec 2037 23:55:55 GMT; Max-Age=2147483647; Secure; SameSite=None
Transfer-Encoding: chunked
  1. 字段名大小写不限
  2. 可以有自定义的字段

安全问题

中间人攻击,DNS 欺骗这种层面的安全问题都可以通过加上 SSL/TLS 层解决。

  • XSS:Cookie
  • CSRF

参考资料与拓展阅读