语法
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
: 是否只支持 HTTPSHttpOnly
: 是否只能通过 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,目前没有得到广泛支持。
- Cookie 的 Value 是基于文本的, 所以只支持字符串
- 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
- 字段名大小写不限
- 可以有自定义的字段
安全问题
中间人攻击,DNS 欺骗这种层面的安全问题都可以通过加上 SSL/TLS 层解决。
- XSS:Cookie
- CSRF
参考资料与拓展阅读
- 阮一峰,《Cookie 的 SameSite 属性》