HTTP协议分析 - 报文
1. 缓存
强缓存
- Expires:时间戳。Expires是HTTP/1.0中的头部,指定资源的过期时间,用 GMT 格式表示。服务器会在响应头中设置 Expires 字段,表示资源的过期时间,过了这个时间就需要重新获取资源。
- 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 小时)内,可以直接从缓存获取资源。同时,如果资源在缓存过期后被请求,浏览器必须重新向服务器验证资源是否仍然有效。
协商缓存
- ETag/If-None-Match:资源的特定版本标识符,类似于指纹。服务器在响应头中添加 ETag 字段,是一个资源的唯一标识符,可以是哈希值等。客户端在下一次请求时,通过 If-None-Match 头将上次资源的 ETag 发送给服务器。服务器比较这个值与当前资源的 ETag,如果相同,返回 304 Not Modified,客户端继续使用缓存。
- 示例:
- 首次请求 - 浏览器存储ETag值“abc123”
GET /example.css HTTP/1.1 Host: example.comHTTP/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
- Last-Modified/If-Modified-Since:最后修改时间。服务器在响应头中添加 Last-Modified 字段,表示资源的最后修改时间。当客户端发送请求时,通过 If-Modified-Since 头将上次资源的最后修改时间发送给服务器。服务器比较这个时间与资源的实际最后修改时间,如果相同,返回 304 Not Modified,客户端继续使用缓存。
- 示例:
- 首次请求 - 浏览器存储Last-Modified时间戳
GET /example.jpg HTTP/1.1 Host: example.comHTTP/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
缓存流程:
2. Cookie
在HTTP报文中,Cookie是一种用于在客户端和服务器之间传递状态信息的机制。它是通过HTTP头部中的Set-Cookie和Cookie字段来实现的。
- Name=Value: 各种cookie的名称和值。这是Cookie的基本属性,用于存储键值对的数据。例如
username=rianna - Expires=Date:Cookie的有效期。指定一个日期,告诉浏览器在该日期之后将删除此Cookie。如果不设置该属性,Cookie将成为会话Cookie,即只在用户关闭浏览器后失效。例如:
Expires=Fri, 31 Dec 2023 23:59:59 GMT - Path=Path:限制指定Cookie的发送范围的文件目录,默认为当前。例如:
Path=/login - Domain=domain:限制cookie生效的域名,默认为创建cookie的服务。例如:
Domain=example.com - Secure:仅在HTTPS安全连接时,才可以发送Cookie。它可以确保Cookie数据在传输过程中的安全性。
- HttpOnly:设置了HttpOnly属性的Cookie只能通过HTTP协议访问,JavaScript无法访问该Cookie。这有助于防止跨站点脚本攻击(XSS)。
- 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