HTTP Cookie 了解

补充知识:

(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 开始)。

更多内容 请在MDN文档上查看Set-Cookie - HTTP | MDN响应标头 Set-Cookie 被用来由服务器端向用户代理发送 cookie,所以用户代理可在后续的请求中将其发送回服务器。服务器要发送多个 cookie,则应该在同一响应中发送多个 Set-Cookie 标头。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie


 

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)的保护。它采用三个可能的值:StrictLax 和 None

使用 Strict,cookie 仅发送到它来源的站点。Lax 与 Strict 相似,只是在用户导航到 cookie 的源站点时发送 cookie。例如,通过跟踪来自外部站点的链接。None 指定浏览器会在同站请求和跨站请求下继续发送 cookie,但 SameSite=None 的 cookie 还必须指定 Secure 属性(它们需要安全上下文)。这个属性默认为lax。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值