HTTP协议常见面试题二【干货】
当精力有限时,想一下眼下自己最看重什么,有选择性的取舍,将宝贵的时间投入到产出比最大的事情上。
六、缓存
-
强缓存 通过设置Expires和Cache-Control实现。强缓存表示在缓存期间不需要发起请求,状态码为200
Expires是HTTP/1的产物,值为缓存的过期时间
Cache-control出现于HTTP/1.1,优先级比Expires高
Expires指定一个绝对的过期时间(GMT格式),这么做会导致至少2个
客户端和服务器时间不同步导致Expires的配置出现问题
很容易在配置后忘记具体的过期时间,导致过期来临出现浪涌现象
max-age 指定的是从文档被访问后的存活时间,这个时间是个相对值(比如:3600s),相对的是文档第一次被请求时服务器记录的Request_time(请求时间)
Expires指定的时间可以是相对文件的最后访问时间(Atime)或者修改时间(MTime),而max-age相对对的是文档的请求时间(Atime)
在Apache中,max-age是根据Expires的时间来计算出来的max-age = expires- request_time:(mod_expires.c)
-
协商缓存 通过设置Last-Modified和ETag实现。如果缓存过期了,就需要发起请求验证资源是否有更新。如果发起请求验证资源没有改变,返回状态304,并且更新浏览器缓存的有效期。
Last-Modified和If-Modified-Since:Last-Modified表示本地文件最后修改日期,If-Modified-Since会将Last-Modified的值发送给服务器,询问该日期之后的资源是否有更新,有就将新资源发送来,没有返回304状态码。
ETag和If-None-Match:ETag出现于HTTP/1.1,他的优先级比Last-Modified高。ETag类似于文件的指纹,If-None-Match会将ETag发送给服务器,询问该ETag是否变动,有变动的话就将获取新的资源。
Last-Modified 的问题在于它的精度在秒(s)的级别,比较适合不太敏感的静态资源。
Nginx 官方默认的 ETag 计算方式是为"文件最后修改时间16进制-文件长度16进制"。
Express 框架使用了 serve-static 中间件来配置缓存方案,使用了一个叫 etag 的 npm 包来实现 etag 计算
使用文件大小和修改时间
使用文件内容的hash值和内容长度
-
F5与Ctrl+F5的区别 F5:跳过强缓存,但会检查协商缓存
Ctrl+F5:直接从服务器加载,跳过强缓存和协商缓存
-
Cache-Control 如果我们给我们的cache-control设置了no-cache以后,每次浏览器发起设置了cache-control资源请求的时候,都会到服务器端进行资源的验证,验证完了以后,如果确定这个资源可以使用缓存,才会读取本地的缓存。
no-store 完全不使用缓存
七、安全
-
XSS:攻击者通过页面注入可执行的代码的攻击方式,防御方法: 将用户输入的内容,进行转义,过滤标签和标签属性
使用CSP告诉浏览器限制外部资源可以加载和执行,开启CSP有两种方式:
设置HTTP-Header中的Content-sesurity-Policy
设置标签的方式
-
CSRF:跨站请求伪造,如获取cookie伪造用户登陆状态,防御方法: 设置cookie的SameSite
验证Referer
登陆后服务器下发一个随机token,之后的请求带上
八、三次握手
三次是最小的安全次数,为了让客户端和服务端都能确定彼此发起和响应的能力是否靠谱
客户端发送SYN包
服务端接收到SYN包之后将SYN+ACK包发送给客户端
客户端接收到SYN+ACK包之后,向服务器发送确认包ACK
服务端接收到之后连接成功,开始传输数据
九、四次挥手
关闭连接是双向的,客户端和服务器都可以提出,四次挥手是为了不让关闭太仓促,保证可靠性
客户端发送一个FIN,用来关闭客户到服务器的数据传送。
服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
服务器关闭客户端的连接,发送一个FIN给客户端。
客户端发回ACK报文确认,并将确认序号设置为收到序号加1。