计算机 · 2021年8月13日 0

Http Cookie

参考

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的读写

参考
https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#read_all_cookies_accessible_from_this_location

allCookies = document.cookie;

cookie的键值对是用分号加空格分开的;