Open MrSeaWave opened 3 years ago
首先都知道HTTP缓存都是从第二次请求开始的。
response header
中返回带Expires(http1.0)
和Cache-Control(http1.1)
的字段,状态码为200
。from memory
或者from disk
,状态码为200
。当浏览器的强缓存失效的时候或者请求头中设置了不走强缓存,并且在请求头中设置了If-Modified-Since(http1.0)
或者If-None-Match(http1.1)
的时候,会将这两个属性值到服务端去验证是否命中协商缓存,如果命中了协商缓存,会返回304
状态码,加载浏览器缓存,并且响应头会设置Last-Modified
或者ETag
属性。Q: 怎么设置不走强缓存?
Q: Cache-Control 的 public、 private 区别知道吗?
Q: from memory 和 from disk 区别知道吗?
浏览器会把哪些文件丢进内存中?哪些丢进硬盘中? 关于这点,网上说法不一,不过以下观点比较靠得住:
讲一些常见的HTTP状态码
HTTP
升级为WebSocket
的时候,如果服务器同意变更,就会发送状态码 101。OK
成功返回的状态码,有数据会放在响应体。NO Content
成功返回的状态码,但响应头后没有 body 数据。Not Modified
协商缓存。Bad Request
请求无效。Unauthorized
鉴权失败。Forbidden
禁止访问。Not Found
资源未找到。Q: 301 和 302 什么区别?
Status Code
后面看到 from disk/memory cache)Q: 重定向会带上原来请求的数据吗?
传统使用session
使用RedirectAttributes. (利用session原理)
优点: 提供了addFlashAttribute 等方法.确保数据只能被使用一次后删除
① 直接在Controller的参数中添加RedirectAttributes.
② addFlashAttribute会在重定向到下一个页面取出这个数据以后,将session里面的数据删除\
③ addFlashAttribute 方法会将数据存储在session中,访问一次后失效
④ addAttribute 方法会将数据拼接在url后(get的形式)
301重定向的时候无法将数据发送给即将重定向的页面, 307 Temporary Redirect是HTTP协议中的一个状态码(Status Code)。可以理解为一个临时的重定向。 但该响应代码与302重定向有所区别的地方在于,收到307响应码后,客户端应保持请求方法不变向新的地址发出请求
请求报文和响应报文大致上都是起始行
+头部
+空行
+实体
。
请求方法
路径
HTTP版本
。
响应报文起始行 HTTP版本
状态码
状态
。Q: 头部中间加一个空行会怎么样?
Q: 常见的请求头、响应头有哪些
常见的请求头字段:
常见的响应头字段:
Q: 请求头里的Referer是干什么用的?
(设置一些防盗链,比如直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer的。https://blog.csdn.net/shenqueying/article/details/79426884)
Q: Content-Length是什么的长度?
Q: 知道Transfer-Encoding: chunked这个字段吗?
Q: Cookie中有哪些属性?
Domain
和Path
才会附加Cookie)https
协议发送给服务器。SameSite=None
: 浏览器会在同站请求、跨站请求下继续发送Cookie。
SameSite=Strict
: 限制Cookie不能跨站发送,只在访问相同站点时发送Cookie。
SameSite=Lax
: 跨站请求时,如果是安全的HTTP方法情况会携带Cookie。Q: 同源和同站的区别是什么?
scheme
://ip/hostname
:port
一样表示同源。二级域名
.顶级域名
一样表示同站。参考文章讲一下前端常见的一些安全问题以及怎么去预防。
XSS
1、通过HTML内容攻击
:模板渲染的时通过反射
或者存储
插入脚本。
2、通过HTML属性攻击
: 提前闭合一些属性,传入攻击代码。
3、JS代码攻击
:跟通过HTML内容攻击相似。
4、获取Cookie信息
:利用第三方脚本的document.cookie
偷取。
预防措施:
1、对& < > " '
这些进行转译。
2、服务端设置白名单
进行过滤。
3、Set-Cookie时设置httpOnly标记
,使JS无法获取Cookie的值。
4、响应头设置Content-Security-Policy
,不加载第三方脚本。
Q: HTML属性怎么攻击?
比如上传头像,本来保存的是一段url,然后页面通过<img src="url">
渲染。
但是攻击者可能会传入 ' " onerror="alert('xxx')"'
这样的字符串,这样页面渲染头像的时候就被攻击了。
Q: CSP除了在响应头里面设置,还可以在哪里设置?
可以在HTML里通过meta元素设置。
Q:CSP有哪些属性?
CSP属性说明
CSRF
预防措施:
1、关键操作使用验证码
。
2、通过Referer
来检查请求的"源"。
3、服务端Token
校验机制。
4、之前说到Cookie设置的SameSite
。
ClickJacking 是一种视觉欺骗的手段,主要是一些类似iframe嵌入、图片覆盖、拖拽等类似方法攻击。
Cookie只是实现Session的一种方案
首先要明白Session和Cookie的主要目的就是为了弥补HTTP的无状态特性。
1、用Session只需要在浏览器端保存一个id,实际上大量数据都是保存在服务端。 2、如果全部用Cookie,数据量大的时候浏览器是没有那么多空间的。账户信息全在浏览器端,一旦被劫持全部信息都会泄露。而且每次请求的网络传输数据量也会变大。 3、所以一般使用Session + Cookie方式来保持会话状态。
Token是一种认证方式
1、用户登录成功,服务端通过一些参数组成加密生成秘钥返回给用户端。
2、后续再次访问服务端,请求头都要带上这个Token秘钥来校验这个请求。(可以预防CSRF攻击)
不同源的请求就会被浏览器认为是跨域。
Q: 你们一般是通过什么方法解决跨域?
Q: 还有什么办法吗?
Content-Type 为 application/javascript
,内容为callbackFunction(data) 。Q: 知道简单请求和非简单请求吗?
简单请求:
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
。非简单请求:
Q: 知道跨域中的简单请求和非简单请求流程吗?
简单请求会直接发出CORS请求。
Origin
字段,服务器根据这个值,决定是否同意这次请求。Origin
指定的源不在许可范围内,浏览器就会将响应拦截。Origin
指定的源在许可范围内,响应头会多出Access-Control-Allow-Origin
、Access-Control-Allow-Credentials
、Access-Control-Allow-Headers
这几个字段。非简单请求会在正式通信之前,增加一次OPTIONS请求,称为"预检"请求。
Origin
、Access-Control-Request-Method
和Access-Control-Request-Headers
字段。Access-Control-Allow-Origin
、Access-Control-Allow-Methods
、Access-Control-Allow-Headers
的响应头字段。后续发起的CORS请求,就跟简单请求一样了。Q: 如何避免发送多次OPTIONS预检请求?
Access-Control-Max-Age: xxx
响应头(只对完全一样的url的缓存设置生效,单位为秒)Q: 跨域请求怎么携带Cookie?
withCredentials:true
。Access-Control-Allow-Credentials:true
。LocalStorage:
同源的所有标签(tab)页
之间共享数据。SessionStorage:
同一标签(tab)页
的会话中,不同标签页不共享。Q: localstorage存量过大时有什么解决方案吗?
头部压缩
HTTP1.x 每次通讯(请求或响应)都会携带首部信息用于描述资源属性。
HTTP2 在客户端和服务端会同时维护和更新一个包含之前见过的信息的索引列表
。请求与响应首部的定义在基本没有变,只是所有首部键必须全部小写,而且请求报文起始行拆分成:method: :scheme: :authority: :path: 这些键值对
。
二进制分帧
多路复用
HTTP1.x 基于请求-响应
的模型,在同一个 TCP 长连接中,前面的请求没有得到响应,后面的请求就会被阻塞。并发连接
虽然是一个解决办法,但是只是增加了TCP连接。而且这么做也有弊端,多条 TCP 连接会竞争有限的带宽
,让真正优先级高的请求不能优先处理。
HTTP2 基于二进制分帧,可以在共享一个TCP链接的基础上并行发送多个请求和响应。
服务器推送
Q: 头部压缩带来了什么优化?
https://juejin.cn/post/6844903734670000142#heading-6
Q: 为什么HTTP1.x不能实现多路复用?
Q: keep-alive和多路复用区别是什么?
参考 浏览器的缓存机制
参考 Shopee HTTP面试总结