mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-06 02:04:10 +00:00
Update HTTP.md
补充 301 被缓存后无法撤回、普通刷新时子资源直接使用缓存(附录 A2 补实测),以及 TLS 1.3 默认提供的 X25519MLKEM768 混合密钥交换。
This commit is contained in:
+16
-2
@@ -258,7 +258,7 @@ TRACE 用于追踪路径,服务器会将通信路径返回给客户端。
|
||||
- 307 Temporary Redirect:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法;
|
||||
- 308 Permanent Redirect:永久重定向,与 301 的含义类似,但不允许改变请求方法。
|
||||
|
||||
301 和 302 的区别也体现在缓存上:没有缓存指令时,301 默认可以缓存,浏览器之后直接跳到新地址(Edge 156 实测,见[附录 A13](#a13-301-与-302-的缓存)),搜索引擎也会改为收录新地址,适合域名迁移;302 默认不缓存,每次都先访问旧地址,适合登录后跳回原页面这类临时跳转。
|
||||
301 和 302 的区别也体现在缓存上:没有缓存指令时,301 默认可以缓存,浏览器之后直接跳到新地址(Edge 156 实测,见[附录 A13](#a13-301-与-302-的缓存)),搜索引擎也会改为收录新地址,适合域名迁移;302 默认不缓存,每次都先访问旧地址,适合登录后跳回原页面这类临时跳转。需要注意的是,服务器无法撤回浏览器已经缓存的 301,在缓存失效或者浏览器重新确认之前,改了服务器的配置也不一定生效,所以不确定是否永久迁移时先用 302,或者给 301 加上 Cache-Control: max-age 限定缓存的时长。
|
||||
|
||||
需要注意的是,RFC 9110 出于历史原因允许用户代理在 301、302 重定向时把 POST 方法改成 GET 方法,大多数浏览器也是这么做的,但只改 POST,PUT、DELETE 保持不变;303 则把 GET、HEAD 以外的方法都改为 GET。如果不希望方法被改变,应该使用 307 或者 308。
|
||||
|
||||
@@ -638,7 +638,7 @@ Cache-Control: public
|
||||
|
||||
max-age 指令出现在响应报文中,表示响应在多少秒内是新鲜的,例如 max-age=600 表示缓存 10 分钟之内可以直接使用。
|
||||
|
||||
max-age 指令出现在请求报文中,表示客户端希望得到已缓存时间不超过这个秒数的响应(请求中的指令只是建议,缓存可以不遵守),例如刷新页面时浏览器发送 max-age=0,要求缓存先向服务器确认;强制刷新时发送的则是 no-cache。
|
||||
max-age 指令出现在请求报文中,表示客户端希望得到已缓存时间不超过这个秒数的响应(请求中的指令只是建议,缓存可以不遵守),例如刷新页面时浏览器对页面本身发送 max-age=0,要求缓存先向服务器确认,页面中还在有效期内的脚本、图片则直接使用缓存,不再确认;强制刷新时页面和其中的资源都带 no-cache(Edge 156 实测,见[附录 A2](#a2-强缓存与协商缓存))。
|
||||
|
||||
```http
|
||||
Cache-Control: max-age=31536000
|
||||
@@ -1084,6 +1084,8 @@ TLS 1.2 还支持 RSA 密钥交换:客户端生成 48 字节的随机预主密
|
||||
|
||||
RSA 密钥交换没有前向安全:攻击者录下通信,日后拿到服务器的私钥,就能解密录下的预主密钥,进而解密全部通信。ECDHE 的私钥在握手后就丢弃,证书私钥只用来签名,泄露后也无法还原以前的会话密钥。因此 TLS 1.3 删除了 RSA 密钥交换,完整握手只能使用 (EC)DHE 这类前向安全的方式;2026 年 7 月发布的 RFC 10015 进一步要求 TLS 1.2 的客户端不再提供、服务器不再选择 RSA 密钥交换的密码套件。
|
||||
|
||||
Chrome 131、OpenSSL 3.5 起,TLS 1.3 握手默认提供 X25519MLKEM768,它把 X25519 的 ECDHE 与后量子算法 ML-KEM-768 组合起来,防止现在录下的通信将来被量子计算机解密,是否选用由服务器决定。它的密钥同样每次握手临时生成,仍然前向安全。
|
||||
|
||||
#### 3. Finished 与会话恢复
|
||||
|
||||
Finished 报文的内容是用主密钥对此前全部握手报文的哈希值计算出的校验值(TLS 1.2 中为 12 字节)。握手的前几个报文是明文,攻击者可以篡改,例如删掉 ClientHello 中安全的密码套件,迫使双方使用弱算法,称为降级攻击。双方各自根据自己收发的报文计算校验值,报文被改过,两边的结果就对不上,握手失败。
|
||||
@@ -1320,6 +1322,18 @@ if not c or c["exp"] < time.time() or c["redirect_uri"] != q.get("redirect_uri")
|
||||
/favicon.ico 无条件请求 -> 200
|
||||
```
|
||||
|
||||
另一个页面引用 style.css、logo.png 和 app.js,响应首部都带 Cache-Control: max-age=3600。用 Edge 156 的开发者协议打开页面后,依次普通刷新(Page.reload)和强制刷新(Page.reload,ignoreCache 为 true),服务器收到的请求:
|
||||
|
||||
```text
|
||||
普通刷新 / Cache-Control: max-age=0, If-Modified-Since -> 304
|
||||
强制刷新 / Cache-Control: no-cache, Pragma: no-cache -> 200
|
||||
强制刷新 /style.css Cache-Control: no-cache, Pragma: no-cache -> 200
|
||||
强制刷新 /logo.png Cache-Control: no-cache, Pragma: no-cache -> 200
|
||||
强制刷新 /app.js Cache-Control: no-cache, Pragma: no-cache -> 200
|
||||
```
|
||||
|
||||
普通刷新时,三个子资源都没有发出请求。
|
||||
|
||||
### A3 跨域
|
||||
|
||||
页面在 127.0.0.1:8001,接口在 127.0.0.1:8002。/plain 不返回 Access-Control-Allow-Origin;/cors 返回它,但预检时不返回 Access-Control-Allow-Methods;/full 的预检允许 PUT;/star 返回 Access-Control-Allow-Origin: *。用无头模式的 Edge 打开页面,页面中 fetch 的结果和接口服务器的日志:
|
||||
|
||||
Reference in New Issue
Block a user