补充知识:
(1)HTTP 是无状态的:
在同一个连接中,两个执行成功的请求之间是没有关系的。简单来说,用户没有办法在同一个网站中进行连续的交互。
比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。
而使用 HTTP 的标头扩展,HTTP Cookie 就可以解决这个问题。把 Cookie 添加到标头中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。(这就是http cookie使用的原因)
注意,HTTP 本质是无状态的,使用 Cookie 可以创建有状态的会话。
(2)响应标头(Response header)
用于http的响应,且与响应信息主体无关
Get 请求后的响应和表示的标头
200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY
1.cooike的概念
HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。
2.cookie的应用 (体会cookie的用法)
Cookie 主要用于以下三个方面:
会话状态管理
如用户登录状态、购物车、游戏分数或其他需要记录的信息
个性化设置
如用户自定义设置、主题和其他设置
浏览器行为跟踪
如跟踪分析用户行为等
用于存储数据的手段 Cookies
3.创建cookie
服务器在收到http请求后,可以在响应标头添加set-cookie选项
语法
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
四.补充 创建Cookie的详细说明
详细说明:
1.名称和值对的规范
<cookie-name>=<cookie-value>
一个 cookie 开始于一个名称/值对:
<cookie-name>
可以是除了控制字符、空格或制表符之外的任何 US-ASCII 字符。同时不能包含以下分隔字符:( ) < > @ , ; : \ " / [ ] ? = { }
。<cookie-value>
是可选的,如果存在的话,那么需要包含在双引号里面。支持除了控制字符、空格 (en-US)、双引号、逗号、分号以及反斜线之外的任意 US-ASCII 字符。
2.3.其实是定义cookie生命周期的两种方式
2.定义最长cookie有效期
Expires=<date>
cookie 的最长有效时间,形式为符合 HTTP-date 规范的时间戳。参见 Date 可以获取详细信息。
如果没有设置这个属性,那么表示这是一个会话期 cookie。一个会话结束于客户端被关闭时,这意味着会话期 cookie 在彼时会被移除。
3.cookie失效前需要经过的时间
Max-Age=<number>
在 cookie 失效之前需要经过的秒数。秒数为 0 或 -1 将会使 cookie 直接过期。假如 Expires
和 Max-Age
属性均存在,那么 Max-Age
的优先级更高。
4.cookie可以传达的主机名
Domain=<domain-value>
指定 cookie 可以送达的主机名。
假如没有指定,那么默认值为当前文档访问地址中的主机部分(但是不包含子域名)。
与之前的规范不同的是,域名(.example.com
)之前的点号会被忽略。
多个主机/域名的值是不被允许的,但如果指定了一个域,则其子域也会被包含。(多个不允许 父子继承)
e.g.如果设置 Domain=mozilla.org
,则 Cookie 也包含在子域名中(如 developer.mozilla.org
)。
限制访问cookie的两种属性 secure 属性和HttpOnly属性(详情看5,6点)
有两种方法可以确保 Cookie
被安全发送,并且不会被意外的参与者或脚本访问
5.安全属性 Secure属性
Secure
永远不会使用不安全的HTTP发送
一个带有安全属性的 cookie 只有在请求使用 https:
协议(localhost 不受此限制)的时候才会被发送到服务器。以阻止中间人攻击,但是无法阻止对cookie中的敏感信息的访问。例如,有权访问客户端硬盘(或,如果未设置 HttpOnly
属性,则为 JavaScript)的人可以读取和修改它。
P.S.非安全站点(http:
)已经不能在 cookie 中设置 Secure
属性了(在 Chrome 52 和 Firefox 52 中新引入的限制)。对于 Firefox,Secure
属性的 https:
限制会在域为 localhost 时被忽略(从 Firefox 75 开始)。
6. HttpOnly属性(这个就是用于解决Secure属性无法阻止硬盘被访问的问题)
用于阻止 JavaScript 通过 Document.cookie 属性访问 cookie。注意,设置了 HttpOnly
的 cookie 在 JavaScript 初始化的请求中仍然会被发送。例如,调用 XMLHttpRequest.send() 或 fetch()。其用于防范跨站脚本攻击(XSS)。
7.Path属性
Path
属性指定了一个 URL 路径,该 URL 路径必须存在于请求的 URL中,以便发送 Cookie
标头。以字符 %x2F
(“/”) 作为路径分隔符,并且子路径也会被匹配。
8.cookie前缀
cookie 的机制使得服务器无法确认 cookie 是在安全来源上设置的,甚至无法确定 cookie 最初是在哪里设置的。
__Host-
如果 cookie 名称具有此前缀,则仅当它也用 Secure
属性标记、从安全来源发送、不包括 Domain
属性,并将 Path
属性设置为 /
时,它才在 Set-Cookie 标头中接受。这样,这些 cookie 可以被视为“domain-locked”。
__Secure-
如果 cookie 名称具有此前缀,则仅当它也用 Secure
属性标记,是从安全来源发送的,它才在 Set-Cookie 标头中接受。该前缀限制要弱于 __Host-
前缀。
9.SameSite属性
允许服务器指定是否/何时通过跨站点请求发送。这提供了一些针对跨站点请求伪造攻击(CSRF)的保护。它采用三个可能的值:Strict
、Lax
和 None
。
使用 Strict
,cookie 仅发送到它来源的站点。Lax
与 Strict 相似,只是在用户导航到 cookie 的源站点时发送 cookie。例如,通过跟踪来自外部站点的链接。None
指定浏览器会在同站请求和跨站请求下继续发送 cookie,但 SameSite=None
的 cookie 还必须指定 Secure
属性(它们需要安全上下文)。这个属性默认为lax。