Table of Contents
参考
https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
cookie用途:在无状态的HTTP协议里保存和状态相关的东西。
查看Cookie:Chrome f12 => Application => Storage => Cookies。
读写cookie的相关api:Web Storage API。
创建cookie
Set-Cookie与Cookie头
服务器在response中加上Set-Cookie头,浏览器下次发送请求时就会用Cookie头把这个cookie带上来:
Set-Cookie: <cookie-name>=<cookie-value>
例子:
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
设置Cookie的生命周期
cookie的生命周期可以用两种方式来定义:
- 由浏览器决定在当前会话结束时删除掉(“会话结束”也是由浏览器定义的)。如果浏览器可以在重启的时候恢复会话(session restoring),那么这个会话的cookie的生命周期可以无线长;
- 服务器在设置cookie时带上
Expires或者Max-Age属性(基于客户端的时间):
Set-Cookie: id=a3fWa; Expires=Thu, 31 Oct 2021 07:28:00 GMT;
限制cookie的访问
Secure
带有Secure属性的cookie只能通过HTTPS发送给服务器,除非服务器也在本地(localhost);HttpOnly
带有HttpOnly属性的cookie不能通过Document.cookie访问;
例子:
Set-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly
定义cookie发给谁
DomainDomain属性指定要接受该cookie的服务器;如果未指定,默认为设置该cookie的服务器(host/domain),但是不包含其子域名。而如果设置了Domain属性,则又是包含了其子域名的。PathPath属性指定和该cookie匹配的url里的path,并且该path的子文件夹/子文件也匹配。比如Path=/docs可以匹配/docs,/docs/Web/和/docs/Web/HTTP;SameSite属性,可以用来防护cross-site request forgery attacks(CSRF)- 设置为
Strict时只能发给原网站; - 设置为
Lax时可以发给referer; - 设置为
None时,必须同时设置Secure属性,此时cookie可以发给设置该cookie的网站或者其他网站;
Cookie的前缀
可以为cookie的名字添加以下前缀:
__Host-
添加这个前缀时,Set-Cookie头里必须同时含有Secure属性、不含有Domain属性,设置Domain属性为/,以及*was sent from a secure origin`__Secure-
添加这个前缀时,Set-Cookie头里必须含有Secure属性和was sent from a secure origin,这是__Host-的弱化版本。
第三方cookie
当页面里含有第三方的资源时,第三方服务器可能会设置第三方cookie。
浏览器里cookie的读写
allCookies = document.cookie;
cookie的键值对是用分号加空格分开的;

近期评论