前端面试HTTP
Contents
1 GET和POST的区别有哪些
1.1 幂等性
- 首先最根本的不同是语义上的不同,GET是读,POST是写,造成两者幂等性的不同
- 由于GET是读,POST是写
- 所以GET是幂等的,POST不是幂等的
- 所以用浏览器打开网页会发送GET请求(若想用POST打开网页要用form标签)
- 所以GET打开的页面刷新是无害的,POST打开的页面刷新需要确认
- 所以GET结果会被缓存,POST结果不会被缓存
- 所以GET打开的页面可被书签收藏,POST打开的不行
- 由于GET是读,POST是写
1.2 请求参数不同
- 通常,GET请求参数放在url中,POST请求数据放在body(消息体)中
- 其实是可以互换的,即GET可以携带body,不过浏览器或服务器一般不会接受
- GET比POST更不安全,因为参数直接以明文形式暴露在url中,所以不能用来传递敏感信息
- 但是POST请求体实际上也是明文的
- GET请求参数放在url中是有长度限制的,而POST放在body里没有长度限制
- 都是可配置的,比如nginx就可以限制POST请求体的最大长度(code:414)
1.3 TCP packet
- GET产生一个TCP数据包,POST产生两个或以上TCP数据包
- 因为一般浏览器或服务器不会接受GET的请求体,默认GET没有请求体
2 HTTP缓存有哪些方案
详见《缓存与内容协商》
http协议版本 | 缓存(强缓存) | 内容协商(弱缓存) | 备注 |
---|---|---|---|
HTTP/1.1 | 服务器响应时在响应头添加:Cache-Control: max-age:3600,must-revalidate ETag: ... |
请求头:If-None-Match: ...ETag 响应:304+空内容/200+新内容 |
主流 |
HTTP/1.0 | 服务器响应时在响应头添加:Expire: 时间点A Last-Modified: 时间点B |
请求头:If-Modified-Since: 时间点B 响应:304+空内容/200+新内容 |
依赖于收发双方的时间统一,如果用户PC时间不准确,将会影响缓存文件的时效性。 |
3 HTTP和HTTPS的区别
HTTPS = HTTP + SSL/TLS(安全层)
- 区别:
- HTTP是明文传输的,不安全(Chrome直接会显示不安全);HTTPS是加密传输的,非常安全
- HTTP默认使用80端口;HTTPS默认使用443端口
- HTTP较快,HTTPS较慢(因为要加密)
- HTTPS的证书一般需要购买,HTTP不需要证书
4 TCP三次握手四次挥手
TCP(Transmission Control Protocol):传输控制协议
- 建立TCP连接过程的三次握手,
SYN
表示同步信息,ACK
表示获悉,x、y一般从0开始
- A->B,
SYN(x)
- B->A,
ACK(x+1)SYN(y)
——确保A能向B发送信息,B能收到A的信息, - A->B,
ACK(y+1)
——确保A能收(为什么一定需要第三次) - A正式开始发送HTTP请求
- 关闭TCP连接过程的四次挥手,
FIN
表示finish,x、y一般不为0
-
A->B,
FIN(x)
——A请求结束通讯 -
B->A,
ACK(x+1)
——确保B知道A要请求结束了 -
B->A,
FIN(y)
——B结束响应,并关闭TCP连接 -
A->B,
ACK(y+1)
——确保A知道B要结束响应了-
为什么2、3两步骤B不能一起发送?因为第二次和第三次中间,服务端可能夹杂其他响应数据(B可能还没说完)
-
不一定是客户端发起FIN,服务端也可以发起FIN
-
5 说说同源策略与跨域
-
什么是同源策略
- 如果两个URL的协议、端口和域名都完全一致的话,则这两个URL是同源的
-
同源策略怎么做
- 只要是在浏览器中打开页面,就默认遵守同源策略
- postman可以随便发请求
-
优点:
- 保证用户的隐私安全与数据安全
-
缺点:
- 很多情况下,前端需要访问另一个域名的后端接口,会被浏览器阻止其获取响应,即出现跨域问题
-
如何解决缺点:
-
JSONP
-
请求阶段:浏览器先准备一个接受数据的全局函数(
jsonpCallback
),再创建一个script
标签,并给其src
赋值(http://example.com/api/?callback-jsonpCallback
) -
发送请求:当浏览器解析到script标签有src属性时,就会自动发起get请求
1 2 3 4 5 6
<script> window.jsonpCallback = (res) => { console.log(res) } </script> <script src='http://example.com/api/?callback-jsonpCallback'></script>
-
数据响应:服务端将要返回的数据作为参数和函数名称拼接在一起(
jsonpCallback({name:'abc'})
)返回。1
jsonpCallback({name: 'abc'})
-
浏览器接收到了响应数据,由于发起请求的是script标签,所以相当于直接调用
jsonpCallback
方法,并且传入了一个参数1 2 3 4 5 6 7 8
<script> window.jsonpCallback = (res) => { console.log(res) } </script> <script> jsonpCallback({name: 'abc'}) </script>
-
优点是兼容性好,缺点是只支持GET方法
-
-
CORS(跨域资源共享)
-
对于简单请求,乙站点Server端在响应头里添加
Accept-Control-Allow-Origin: http://甲站点
即可 -
对于复杂请求,如PATCH,乙站点Server端需要:
-
响应OPTIONS请求,在响应添加如下的响应头
1 2 3
Access-Control-Allow-Origin: https://甲站点 Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: Content-Type
-
响应POST请求,在响应中添加
Access-Control-Allow-Origin
头
-
-
如果需要附带身份信息,需要前端在AJAX中设置
xhr-withCredentials = true
-
存在一定风险,因为添加响应头,说明完全信任甲站点,小公司可以,但是大公司建议用nginx代理,即中间层
-
-
-
nginx如何解决跨域?
- 配置nginx
|
|
6 Cookie、Session、LS、SS的区别
6.1 Cookie vs LS
- 主要区别是cookie会被发送到服务器,而LS不会
- cookie一般最大4k,LS可以用5M甚至10M(各浏览器不同)
6.2 LS vs SS
- LS存储的数据没有过期时间设置,而存储在SS中的数据会在页面会话结束时被浏览器清除
- 理论上关闭浏览器或tab页,SS的数据就会被清除
- 而恢复页面或刷新不会影响SS
6.3 Cookie vs Session
- Cookie存在浏览器的文件中,Session存在服务器的文件里
- Session是基于Cookie实现的,具体做法就是把SessionID存在Cookie中,ID对应的数据放在服务器中
7 HTTP/2 vs HTTP/1.1
- HTTP/2使用了二进制传输,而且将head和body分成帧来传输;HTTP/1.1是字符串传输
- HTTP/2支持多路复用,即一个TCP连接从单车道变成了几百个双向通行的车道
- HTTP/2可以压缩head
8 TCP\UDP区别
- TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
- TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
- TCP和UDP都属于传输层协议
8.1 UDP(用户数据报协议)
-
面向无连接:不需要像TCP那样在发送数据前进行三次握手建立连接的,同时不会对报文进行处理
-
传输方式多样:UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
-
不可靠性:
- 首先不可靠性体现在无连接上
- 在网络条件不好的情况下可能会导致丢包
-
头部开销小,传输数据报文时是很高效的。
-
适用于实时应用(IP电话,视频会议,直播等)
8.2 TCP(传输控制协议)
-
面向连接:发送数据之前必须在两端建立连接
-
仅支持单播传输:只能进行点对点的数据传输
-
可靠传输:每个包都有序号,保证传输顺序,且接收方会返回确认(ACK),没收到的话会重传
-
适用于要求可靠传输的应用,例如文件传输
9 WebSocket
10 如何防止DNS污染
一般内容违规或者被举报会导致dns污染?
11 HTTPS 存在安全性问题吗?有什么办法可以解决吗?
-
中间人代理:
-
该方法的思想比较简单,就是在用户进行https请求的时候,中间人接受用户请求,同时向真实的服务器发送https请求。并对服务器返回的数据,发回给用户。该方法要求中间人提供证书。
-
解决方法:进行https访问的时候,验证证书是否是真实的服务器或者使用双边证书验证机制。
-
12 XSS,CSRF
-
XSS,跨站脚本攻击,缩写为XSS(Cross Site Scripting),是利用网页的漏洞,通过某种方式给网页注入恶意代码,使用户加载网页时执行注入的恶意代码。
-
就是可以提交给后端不干净的东西
-
假设有一个博客网站,这个博客网站的安全做的很差。那么我现在准备在这个网站上发布一篇博客,在发布的这篇博客中,我嵌入了一段 ,并且发送到我的服务器上(服务器配合跨域)。
写完之后呢,我成功把这篇博客发送出去了。现在,只要有人在这个网站查看我这篇博客文章,那么我就能轻松地收割访问者的
cookie
,这就是一个简单的xss
攻击流程。
(1)设置HttpOnly
在 cookie
中设置 HttpOnly
属性后, js
脚本将无法读取到 cookie
信息。
(2)转义字符串
- 跨站请求伪造(Cross-site request forgery),也被称为
one-click attack
或者 session riding,通常缩写为CSRF
或者XSRF
,是一种挟制用户在当前已登录的Web
应用程序上执行非本意的操作的攻击方法。 就是窃取正常用户的令牌,攻击该网站
- 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
1)验证码
增加验证,例如密码、短信验证码、指纹等等,强制用户必须与应用进行交互,才能完成最终请求。这种方式能很好的遏制 csrf
,但是用户体验相对会比较差。
3)token
Author gsemir
LastMod 2021-03-08