Cache-Control: no-cache/no-store 的区别
之前分享 缓存 的时候不知道 no-cache/no-store 的区别。这次通过实验的方式在项目中验证了两者的效果。 在项目的 nginx 中,做了如下配置,通过调整下面的 Cache-Control 为 no-store 查看页面效果,可以得出 no-cache 和 no-store 的区别。
location ~* /intelligence/(.*)\.(js|css) {
root /usr/app/frontend/;
index index.html;
add_header Cache-Control 'no-cache'; // 这里修改为 no-store 查看效果
proxy_set_header Connection "";
try_files $uri $uri/ /index.html;
autoindex off;
}
no-cache 表示无论如何一定要进行服务器校验,也就是不可能发生 200 from disk/from memory 的情况,最好的结果就是 304。 no-store 则不同,表示永远不缓存,也就是只有请求服务器返回 200 这一种结果。不会 200 from disk/from memory,也不会 304。
Cache-Control: private / public 的区别
就是是否允许缓存服务器缓存资源。private 是不允许,public 允许缓存。
http 代理软件
fiddler charls anyproxy
反向代理
x-forward-for, x-real-ip 前者是很多 ip,就是每经过一个节点就记录一个 ip。 后者表示只记录最开始的客户端的 ip。
csrf vs click-jacking
csrf 只需要访问就好了 click-jacking 表示用户还需要点击才形成
csrf 生效的原因3点:
- cookie 自动添加到 request header 中
- form 表单提交不受跨域限制(语言的设计)
- js 可以自动提交表单(语言的设计)
阻止的方法:
- 限制浏览器地址栏非本域请求不携带 cookie
- form 表单提交改成 ajax 请求
samesite: strict | lax | none 限制 form 表单提交
x-frame-option: sameorigin 限制 iframe 点击劫持。
响应头中的 Vary
vary 是变种的意思,这个字段用来判断下一次请求到来的时候,是否给客户端提供缓存。我们都知道,对于同一个 url 的请求,如果强缓存过期之后,会发到服务端确认是否命中协商缓存。但是如果在协商缓存的过程中,客户端发出的请求只有部分请求头发生了变化,这个时候协商缓存的其他验证都通过了,是否还能使用这个协商缓存呢?这个时候这个 vary 就起作用了。
用最精简的内容来总结 vary 字段: vary 的值可以是多个请求头的字段名(键),表示当一个请求发送到中间的缓存服务器时,如果这些字段发生了变化,即使请求的 url 是一样的,但是缓存依然会失效。或者换句话而言,不接受这些字段的变种请求,尽管请求的是同一个资源。
ETag
ETag 会有两种类型
ETag: W/"<etag_value>"
ETag: "<etag_value>"
第一种是带 W/ 的,根据 mdn 的说明:
'W/'(case-sensitive) indicates that a weak validator is used. Weak etags are easy to generate, but are far less useful for comparisons. Strong validators are ideal for comparisons but can be very difficult to generate efficiently. WeakETagvalues of two representations of the same resources might be semantically equivalent, but not byte-for-byte identical. This means weak etags prevent caching when byte range requests are used, but strong etags mean range requests can still be cached.
其实算是一个小小的区别吧,就是 weak 的话容易生成,但是辨识度不高。 strong 的话就是一点变动都会生成一个新的 hash,但是不容易生成。