Cookie

一、概述

MDN|HTTP cookies

Cookie,通常指的是 HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie),Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明,它是一小段文本(通常很小,不超过4kb),可以保存在浏览器,其上承载了某些信息。
目的是为了保存一些状态信息,因为http是无状态的,主要有三个用途:

  1. 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  2. 个性化设置(如用户自定义设置、主题等)
  3. 浏览器行为跟踪(如跟踪分析用户行为等)

Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB

二、格式

2.1 基本格式

Cookie只是一段文本而已,但是内容有格式要求:键值对形式,相互之间以分号 ; 隔开。
以下是某个请求报文中cookie的部分截图:
图片名称

2.2 内置的键值对

有些比较重要的键值对,它会影响浏览器对Cookie的管理:

  • Expires: 设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效。

  • Domain: 指定了可以访问该 Cookie 的 Web 站点或域。Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。当需要实现单点登录方案时,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻击的危险,比如攻击者可以借此发动会话定置攻击。因而,浏览器禁止在 Domain 属性中设置.org、.com 等通用顶级域名、以及在国家及地区顶级域下注册的二级域名,以减小攻击发生的范围(注意什么是domin,domin即域,通常指的是域名,比如cnblogs.com是父域名,i.cnblogs.com是子域名)

  • Path: 为了在HTTP请求头设置Cookie,所要设置的路径(即我们所说的url,网址中除了域名的那一部分,不含参数)。如果设置了 Path=/docs,那么其下的/docs/docs/Web//docs/Web/HTTP等等都会被匹配

  • Secure: 指定是否使用HTTPS安全协议发送Cookie

  • HTTPOnly: 指定是否允许客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头

三、生命周期

一般而言,用户很难体验到cookie的存在,一个网站可以有多个cookie。如果用户禁止了cookie,那么便不能生成cookie。

3.1 Cookie生成

Cookie的创建从用户第一次请求服务器起开始,服务器将会在响应头添加Set-Cookie选项(可以重复):

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly

...

浏览器收到响应后通常会保存下 Cookie,注意 Cookie 上如果有设置信息,则会影响 Cookie 存活阶段的行为。

根据 Cookie 的设置,所有符合设置的 http 请求会自动携带上 Cookie。注意,根据浏览器的安全策略,不管是同域还是跨域,ajax生成的Http请求不会自动携带 Cookie!
这就是为什么有些新手(比如一年前的我)在编辑服务器代码时,出现session失效的问题。原因就是服务器的session一般是基于 Cookie实现的(sessionId存放在Cookie上面),没有sessionId便无法判断session是不是当前用户的,所以找不到session。
想要携带Cookie的话,浏览器端的ajax请求得设置withCredentials,服务器也得设置响应头Access-Control-Allow-Credentials: true

Cookie未设置过期时间(Expires属性)的话,将会在浏览器关闭的时候在内存中清除。
如果设置了时间且关闭浏览器的时候还没有到过期时间,浏览器会将Cookie生成为一个文件,存放在指定的位置,下次打开浏览器的时候就会重新激活取出。

原文地址:https://www.cnblogs.com/panshaojun/p/14892239.html