Cookie & 浏览器Header缓存设置

2018-11-23  本文已影响0人  Shaw007
前言

由于HTTP无状态协议,有时需要保存资源状态信息或者用户信息,根据状态判断是否需要重新请求资源或者在相同域名和端口下读取用户信息。

缓存可以使浏览器重用已获取的资源和保存用户信息,优化静态资源的加载速度以及加速页面的渲染速度。

缓存包括很多方面,这里仅简要介绍下数据缓存Cookie及相关设置和浏览器header缓存匹配策略(ETag, Cache-Control)

缓存分类.png
Cookie

一般Cookie是由首次请求时, 服务器在HTTP的响应头通过Set-Cookie给客户端的一串字符串及metadata,比如用户信息或资源状态信息或对缓存的控制信息等,浏览器收到响应后,会将Cookie保存在客户端一段时间,然后客户端每次访问的相同域名的网页时,浏览器会按照一定的原则(浏览器缓存策略)将Cookie发送给服务器。

Cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围

  == Server -> User Agent ==

  Set-Cookie:SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
  Set-Cookie: lang=en-US; Path=/; Domain=example.com
  Set-Cookie: Expires=Wed, 09 Jun 2021 10:18:14 GMT
##path:/设置浏览器即UA下一次请求每个路径都带上缓存
##Domain: example.com每个example.com下的子域名都带上缓存
   == User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US

注意

  1. 客户端可以对Cookie进行修改,通过控制台或者Javascript脚本。
  2. Cookie默认在用户关闭页面后就失效(保存在内存中),服务器可以通过cache-control设置强缓存-Cookie缓存位置及时间等(保存在硬盘中)。
  3. 可通过Set cookie指定expires为过去的一个值,使指定路径的Cookie失效。
  4. Cookie大小在4k左右, 域名、端口相同即可共享(CSRF)
  5. 可通过document.cookie获取cookie信息
##首次请求响应
HTTP/1.1 200 OK
Date: Sun, 17 Sep 2017 13:16:06 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache
Pragma: no-cache
Set-Cookie: SESSIONid=v666iuanetgmcv0couvmnf3jg4
Content-Length: 20
Content-Type: text/html
##接下来的请求
GET /clients/ HTTP/1.1
Host: mycompany.com
Accept: text/html
Cookie: SESSIONid=v666iuanetgmcv0couvmnf3jg4 

浏览器Header缓存策略
  1. 浏览器在加载资源时,根据请求头的expires和cache-control判断是否命中强缓存,是则直接从缓存读取资源,不会发请求到服务器。
  2. 如果没有命中强缓存,浏览器发送一个请求到服务器,通过last-modified或etag验证资源是否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存中读取资源
  3. 如果前面两者都没有命中,直接从服务器加载资源

早期HTTP /1.0中则通过服务器在Header中Set-Cookie设置Expires来实现缓存控制,表示资源到什么时候过期(绝对时间),一旦修改本地时间,可能造成缓存失效。

##Request
GET /hello.txt HTTP/1.1
If-None-Match: "8a75d48aaf3e72648a4e3747b713d730"
Host: www.foobar.tld

##Response
HTTP/1.1 304 Not Modified
Date: Sun, 05 Feb 2017 12:34:57 UTC
Server: Apache
Last-Modified: Sun, 05 Feb 2017 10:34:56 UTC
ETag: "8a75d48aaf3e72648a4e3747b713d730"
Content-Length: 8
Content-Type: text/plain; charset=UTF-8

早期HTTP /1.0使用首次响应返回Last-Modified,接下来请求头加上If-Modified-Since来实现协商缓存,相比ETag基于内容是否变更,其是否刷新缓存是通过修改时间是否变更来判断。有以下缺点:

若两者同时使用,则ETag优先级比Last Modified要高

注意:

  1. 分布式系统里多台机器间文件的Last-Modified必须保持一致,以免负载均衡到不同机器导致比对失败;
  2. 分布式系统尽量关闭掉ETag(每台机器生成的ETag都会不一样);

其他:
key value
expires Cookie失效时间(绝对时间)若不设置,浏览器关闭即删除
Max-Age Cookie失效时间,相对时间,优先级高于expires
path 设置哪些路径带上cookie,一般默认为'/'
Domain 设置哪些域名带上cookie,一般为当前一级域名
Secure 只在https下才能发送cookie
HttpOnly js脚本获取不到,且只能在http上才能发送cookie(防止xss)
SameSite 是否可能作为第三方 cookie(防止CSRF)
key value
pragma http1.0, 值为no-cache为禁用缓存
vary 基于字段区分缓存版本(res header)
Date 发送响应报文的时间(协商缓存、代理服务器缓存)
Age 文件存于服务器的时间
accept-encoding 请求服务器返回的文件类型
referrer 发送请求的源域名
上一篇 下一篇

猜你喜欢

热点阅读