Cache/Storage/HTTPS

214 阅读5分钟

httpheader

Cache-Control

这个关键字在req res都可以出现,以下是主要属性

  • max-age 过期时间 expires优先级不高 1.0ver里面的
  • s-maxage 缓存服务器上的过期时间,比max-age优先级高
  • private
  • public
  • no-cache:不管如何都要发请求到server验证缓存,
  • no-store:完全不使用缓存

expires: 告诉服务器具体的过期时间点

Last-Modified/If-Modified-Since

  • 客户端/服务端协商的缓存机制
  • last-modified-----response header
  • if-modified-since-----request header
  • cache-control 共同使用 缓存文件的最后改变时间,第一次发送req的时候没有,然后根据服务端返回的时间保存下来,以后发送的时候带上last-modified再判断

缺点?

  1. 某些服务段不能获取精确的修改时间
  2. 文件修改时间变了但是内容没变

但是有时候读取本地cache,请求不一定会出去,可能不会带上last-modified 但是s-maxage生效使用代理服务器的时候,一定会带上last-modified。 Etag同理

ETag/If-None-Match

是文件的hash值,前者req后者res。比Last-Modified更可靠

当缓存过期或者没有缓存,请求并保存缓存,返回200 当last-modified/etag变化然后请求服务器,返回值不变 则304 最后是过期(2种方法)时,返回200

流程图:

缓存

先判断有无缓存 无缓存直接向服务器请求,返回200 有缓存先判断是否过期 保存时间和hash码 没有过期直接使用 过期了先判断有无Etag 有Etag向服务器请求if-none-match 没Etag检验Last Modified Etag/Modified 变量请求并200 没变304

Cache-Control

先判断no-store 然后no-cache 然后public/private 最后时间

tips

Chrome F5 header里面cache-control有max-age=0, 但是新建一个page然后输入address 会启用缓存

Cookie

通过Set-Cookie设置,下次请求会自动带上(client send),键值对

  • max-age
  • expires 以上两个设置过期时间
  • Secure 只在https的时候发送
  • HttpOnly 无法通过document.cookie访问

cookie有一个访问域的设置,参见下图domain写法

但是cookie不能跨域设置,超出了权限,如果要给二级域名设置权限从而使得所有有二级域名的都有cookies,参见上图

Session

使用cookie保存session,主要是保存用户信息。

HTTP长连接

HTTP的请求在TCP的连接之上进行发送,发送的请求有长连接短链接之分。保持长连接以减少新开连接的开销。在request msg里面的 Connection 参数可以设置为 keep-alive 浏览器有TCP并发限制,若请求慢可能会开多个TCP连接,若快,一个连接即可完成。

若请求数量十分庞大,率先完成T传输的TCP连接可能之后被复用。

若Connection值设置为close,则连接完之后就会关闭。

在http2上面可以信道复用,一个TCP连接可以发送多个http请求。连接网站只需要一个TCP即可。但是只有同域的才会是同一个TCP连接。

数据协商(Content Negotiation)

请求里会包含希望返回的数据内容和格式,就相应的资源内容进行交涉。

Accept

  • Accept:指定想要的数据类型
  • Accept-Encoding: 指定想要的数据压缩方式 gzip deflate br(压缩比高)
  • Accept-Language: 想要的language
  • User-Agent: 返回PC还是移动端页面?

Content

  • Content-Type: 返回的数据格式 比如 text/plain text/html image/jpg
  • Content-Encoding: 数据压缩方式
  • Content-Language: 返回的语言类型

redirect

使用Location键值对,val是路径的path。代码302, 只有301或者302代表跳转。302是临时跳转 301是永久。 区别是302需要先访问旧的路径然后跳转,301从第二次访问开始就不需要了访问旧路径,直接去新路径,而且是从缓存取值。

301慎重,因为会长时间保存缓存,不是自己能控制的情况

Content-Security-Policy

  • 限制资源获取
  • 报告资源获取越权
  • default-src限制全局
  • 指定资源类型

使用的头参数就是 Content-Security-Policy :'default-src http:https' Content-Security-Policy-Report-Only :'default-src http:https' 还可以限制外链引用的域名限制,

mdn csp

主动汇报

添加report-uri /report 参数

写在HTML

可以写在HTML的meta标签里面,但是不能设置report

Range

当比较大的数据需要切片传输的时候,可以使用Range来指定资源的byte范围。 Range: bytes=5000-10000

HTTPS

HTTP + Security HTTP 明文传输, 不要把很重要的数据通过http传输。 HTTPS 私钥 公钥。 公钥是公开的加密密码,只有用私钥才能解析。主要是在握手的时候进行公钥私钥的验证,公钥私钥都在server。

服务端证书--公钥,总共3个随机数。

HTTPS握手过程: Server bind to a port and open it for connection, client generates a random number and send it to server. Server receives the client random number and send another server random number and entrayed suit to client. client use this public key certificate to generate a premaster key and send it back. Server use private key certificate to decrypt this private key and get the last random number . These three random number are used to generate a master key and use it to communcate between client and server. The first and second random is public but the last one is secret,

配置过程

http监听80端口 https监听443端口。

访问http 跳转https

Nginx常用命令

HTTP2

信道复用 分帧传输:有上下文联系,不用强制顺序,会自动组合。可以并发发送请求

Server Push

工业上 https才能支持http2,