HTTP协议(二) | 青训营

205 阅读4分钟

HTTP协议分析 - 报文

1. 缓存

强缓存

  1. Expires:时间戳。Expires是HTTP/1.0中的头部,指定资源的过期时间,用 GMT 格式表示。服务器会在响应头中设置 Expires 字段,表示资源的过期时间,过了这个时间就需要重新获取资源。
  2. Cache-Control
    • 可缓存性:
      • no-cache:协商缓存验证。表示缓存是可用的,但在使用之前需要重新验证资源的有效性。
      • no-store:不使用任何缓存。表示缓存完全禁用,每次都要向服务器请求最新资源。
      • max-age:单位是秒,存储的最大周期,相对于请求的时间。设置缓存有效期的秒数,资源在此期间内不会过期。
    • 重新验证*重新加载:
      • must-revalidate:一旦资源过期,在成功向原始服务器验证之前,不能使用。

示例:假设服务器返回了一个带有强缓存策略的响应头,如下:

HTTP/1.1 200 OK
Content-Type: text/css
Cache-Control: max-age=3600, must-revalidate
Expires: Sat, 31 Dec 2023 23:59:59 GMT

这个响应头告诉浏览器,在接下来的 3600 秒(1 小时)内,可以直接从缓存获取资源。同时,如果资源在缓存过期后被请求,浏览器必须重新向服务器验证资源是否仍然有效。

协商缓存

  1. ETag/If-None-Match:资源的特定版本标识符,类似于指纹。服务器在响应头中添加 ETag 字段,是一个资源的唯一标识符,可以是哈希值等。客户端在下一次请求时,通过 If-None-Match 头将上次资源的 ETag 发送给服务器。服务器比较这个值与当前资源的 ETag,如果相同,返回 304 Not Modified,客户端继续使用缓存。
  • 示例:
    • 首次请求 - 浏览器存储ETag值“abc123”
    GET /example.css HTTP/1.1
    Host: example.com
    
    HTTP/1.1 200 OK
    Content-Type: text/css
    ETag: "abc123"
    Last-Modified: Wed, 01 Jan 2023 00:00:00 GMT
    
    • 再次请求
    // 服务器检查请求中的If-None-Match头,发现值与当前资源的Etag相匹配,
    // 表示资源没有发生变化
    GET /example.css HTTP/1.1
    Host: example.com
    If-None-Match: "abc123"
    
    // 浏览器收到 304 响应,意味着它的缓存仍然有效,
    // 可以继续使用缓存中的资源
    HTTP/1.1 304 Not Modified
    
  1. Last-Modified/If-Modified-Since:最后修改时间。服务器在响应头中添加 Last-Modified 字段,表示资源的最后修改时间。当客户端发送请求时,通过 If-Modified-Since 头将上次资源的最后修改时间发送给服务器。服务器比较这个时间与资源的实际最后修改时间,如果相同,返回 304 Not Modified,客户端继续使用缓存。
  • 示例:
    • 首次请求 - 浏览器存储Last-Modified时间戳
    GET /example.jpg HTTP/1.1
    Host: example.com
    
    HTTP/1.1 200 OK
    Content-Type: image/jpeg
    Last-Modified: Wed, 01 Jan 2023 00:00:00 GMT
    
    • 再次请求
    // 服务器检查请求中的If-Modified-Since头,发现时间戳与当前资源的最后修改时间相匹配,
    // 表示资源没有发生变化
    GET /example.jpg HTTP/1.1
    Host: example.com
    If-Modified-Since: Wed, 01 Jan 2023 00:00:00 GMT
    
    // 浏览器收到304响应,继续使用缓存中的资源
    HTTP/1.1 304 Not Modified
    

缓存流程: 36c122732cbdc52a4b4b99857fa7592.png

2. Cookie

在HTTP报文中,Cookie是一种用于在客户端和服务器之间传递状态信息的机制。它是通过HTTP头部中的Set-Cookie和Cookie字段来实现的。

  1. Name=Value: 各种cookie的名称和值。这是Cookie的基本属性,用于存储键值对的数据。例如username=rianna
  2. Expires=Date:Cookie的有效期。指定一个日期,告诉浏览器在该日期之后将删除此Cookie。如果不设置该属性,Cookie将成为会话Cookie,即只在用户关闭浏览器后失效。例如:Expires=Fri, 31 Dec 2023 23:59:59 GMT
  3. Path=Path:限制指定Cookie的发送范围的文件目录,默认为当前。例如:Path=/login
  4. Domain=domain:限制cookie生效的域名,默认为创建cookie的服务。例如:Domain=example.com
  5. Secure:仅在HTTPS安全连接时,才可以发送Cookie。它可以确保Cookie数据在传输过程中的安全性。
  6. HttpOnly:设置了HttpOnly属性的Cookie只能通过HTTP协议访问,JavaScript无法访问该Cookie。这有助于防止跨站点脚本攻击(XSS)。
  7. SameSite=[None|Strict|Lax]: SameSite属性用于控制跨站点请求时是否发送Cookie。它有三个选项:
    • None: 同站、跨站请求都可发送,但需要同时设置secure属性。
    • strict:严格限制,仅在同站发送,不允许跨站点请求时发送。
    • Lax:宽松限制,允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送。
// 示例
Set-Cookie: username=johndoe; Expires=Fri, 31 Dec 2023 23:59:59 GMT; Path=/myapp; Domain=example.com; Secure; HttpOnly; SameSite=Strict