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发给谁
Domain
Domain
属性指定要接受该cookie的服务器;如果未指定,默认为设置该cookie的服务器(host/domain),但是不包含其子域名。而如果设置了Domain
属性,则又是包含了其子域名的。Path
Path
属性指定和该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的键值对是用分号加空格分开的;
近期评论