Http

  • 1.x为无状态协议。即同一客户端连续发送两次请求给服务器,服务器也识别不出这是同一客户端发送的请求,导致的问题如:当将商品加入购物车中,因为识别不出这是同一个客户端而导致刷新下页面商品就没有了,等等问题

Cookie

  • 指某些网站为辨别用户身份而存储在用户本地客户端上的数据
  • 一般不超过4KB
  • 由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成

cookie的设置:

  • 客户端发送Http请求到服务器
  • 当服务器收到http请求时,在响应头中添加一个Set-Cookie字段
  • 浏览器收到响应后保存下Cookie
  • 只后对该服务器每一次请求中都通过Cookie字段将Cookie信息发送给服务器

Expires:

  • 用于设置Cookie的过期时间
  • 当Expores属性缺省时,表示是会话性Cookie
  • 会话性Cookie,值保存在客户端内存中,并在用户关系浏览器时失效
  • 有些浏览器提供了会话恢复功能(是否重新打开已关闭页面),这种情况下即使关闭了浏览器,会话期Cookie也会被保留下来,就像浏览器没有关闭一样
  • 与会话性Cookie相对的是持久性Cookie,持久性Cookies会保存在用户的硬盘中,直至过期或者手动删除Cookie。这里设定的日期和时间只与客户端相关,而不是服务端

Max-Age:用于设置在Cookie失效之前需要经过的秒数

  • 当max-Age属性为正时,浏览器会将其持久化,即写到对应的Cookie文件中
  • 当max-Age属性为负时,则表示该Cookie只是一个会话性Cookie
  • 当max-Age为0时,则会立即删除这个Cookie
  • 优先级:Max-age>Expires

Domain:

  • 指定了Cookie可以送达的主机名,若没有指定,则默认值为当前文档访问地址中的主机部分(不包含子域名)
  • 注:不能跨域设置Cookie

Path:

  • 指定了一个URL路径,这个路径必须出现要请求的资源的路径才可以发送Cookie首部。如设置path=/docs, /docs/Web/下的资源会带Cookie首部
  • Domain和Path标识共同定义了Cookie的作用域:即Cookie应该发送给哪些URL

Secure属性

  • 标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。使用HTTPS协议,可以保护Cookie在浏览器和Web服务器间的传输过程中不被窃取和篡改

HttpOnly:

  • 设置HTTPOnly属性可以防止客户端脚本通过document.cookie等方式访问Cookie,有助于避免XSS攻击

SameSite:

  • Chrome80版本中默认屏蔽了第三方的Cookie
  • 作用:可以让Cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪装攻击(CSRF)
  • 属性值:
    • Strict:仅允许以防请求携带Cookie,即浏览器将只发送相同站点请求的Cookie,也就是当前网页的URL与请求目标URL一致
    • Lax:允许部分第三方请求携带Cookie
    • None:无论是否跨站都会发生Cookie
    • chrome80后默认是Lax

跨站和跨域

  • [同站(same-site)/跨站(cross-site)] 和第一方(first-party)/第三方(third-party)是等价的
  • 但是与浏览器同源策略(SOP)中的「同源(same-origin)/跨域(cross-origin)」是完全不同的概念。
  • 同源策略的同源指的是两个URL的协议/主机名/端口一致、
  • 例如,https://www.taobao.com/pages/...,它的协议是 https,主机名是 www.taobao.com,端口是 443。
  • 同源策略的【同源】比较严格,而Cookie的【同站】判断比较宽松
  • 【同站】:只要两个URL的 eTLD+1 相同即可,不需要考虑协议和端口
    • eTLD:有效顶级域名 例如,.com、.co.uk、.github.io 等
    • eTLD+1 : 有效顶级域名+二级域名,例如 qdmmz.com等所以
      www.qdmmz.com和www.baidu.com是跨站,a.github.io 和 b.github.io 是跨站
      www.a.qdmmz.com和www.b.qdmmz.com是同站

samesite 从 None 改成 Lax 影响那些地方的Cookies发送

  • 对大部分 web 应用而言,Post 表单,iframe,AJAX,Image 这四种情况从以前的跨站会发送三方 Cookie,变成了不发送。

解决方案就是设置 SameSite 为 none。

注:

  1. HTTP 接口不支持 SameSite=none

如果你想加 SameSite=none 属性,那么该 Cookie 就必须同时加上 Secure 属性,表示只有在 HTTPS 协议下该 Cookie 才会被发送。

2.需要 UA 检测,部分浏览器不能加 SameSite=none

IOS 12 的 Safari 以及老版本的一些 Chrome 会把 SameSite=none 识别成 SameSite=Strict,所以服务端必须在下发 Set-Cookie 响应头时进行 User-Agent 检测,对这些浏览器不下发 SameSite=none 属性

Cookie作用

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

缺点:大小,安全,增加请求大小等方面

源自 https://github.com/mqyqingfeng/Blog/issues/157


爬。