1 GET和POST的区别有哪些

1.1 幂等性

  • 首先最根本的不同是语义上的不同,GET是读,POST是写,造成两者幂等性的不同
    • 由于GET是读,POST是写
      • 所以GET是幂等的,POST不是幂等的
      • 所以用浏览器打开网页会发送GET请求(若想用POST打开网页要用form标签)
      • 所以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(安全层)
  • 区别:
    1. HTTP是明文传输的,不安全(Chrome直接会显示不安全);HTTPS是加密传输的,非常安全
    2. HTTP默认使用80端口;HTTPS默认使用443端口
    3. HTTP较,HTTPS较(因为要加密)
    4. HTTPS的证书一般需要购买,HTTP不需要证书

4 TCP三次握手四次挥手

TCP(Transmission Control Protocol):传输控制协议

  • 建立TCP连接过程的三次握手,SYN表示同步信息,ACK表示获悉,x、y一般从0开始
  1. A->B,SYN(x)
  2. B->A,ACK(x+1)SYN(y)——确保A能向B发送信息,B能收到A的信息,
  3. A->B,ACK(y+1)——确保A能收(为什么一定需要第三次)
  4. A正式开始发送HTTP请求
  • 关闭TCP连接过程的四次挥手,FIN表示finish,x、y一般不为0
  1. A->B,FIN(x)——A请求结束通讯

  2. B->A,ACK(x+1)——确保B知道A要请求结束了

  3. B->A,FIN(y)——B结束响应,并关闭TCP连接

  4. A->B,ACK(y+1)——确保A知道B要结束响应了

    • 为什么2、3两步骤B不能一起发送?因为第二次和第三次中间,服务端可能夹杂其他响应数据(B可能还没说完)

    • 不一定是客户端发起FIN,服务端也可以发起FIN

5 说说同源策略与跨域

  1. 什么是同源策略

    • 如果两个URL的协议端口域名都完全一致的话,则这两个URL是同源的
  2. 同源策略怎么做

    • 只要是在浏览器中打开页面,就默认遵守同源策略
    • postman可以随便发请求
  3. 优点:

    • 保证用户的隐私安全与数据安全
  4. 缺点:

    • 很多情况下,前端需要访问另一个域名的后端接口,会被浏览器阻止其获取响应,即出现跨域问题
  5. 如何解决缺点:

    1. 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方法

    2. 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代理,即中间层

  6. nginx如何解决跨域?

  • 配置nginx
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
	listen	80;
	server_name localhost;
	# 我们访问的路径是localhost:80,但内容是localhost:8888的
  location / {
  	root	html;
  	index	index.html index.htm;
  	proxy_pass	http://localhost:8888; 
  }
  # 访问的路径是localhost:80/api/*,但内容是api.real.com/*中的
  location /api/ {
  	proxy_pass	http://api.real.com/;
  }
}

6 Cookie、Session、LS、SS的区别

  • 主要区别是cookie会被发送到服务器,而LS不会
  • cookie一般最大4k,LS可以用5M甚至10M(各浏览器不同)

6.2 LS vs SS

  • LS存储的数据没有过期时间设置,而存储在SS中的数据会在页面会话结束时被浏览器清除
    • 理论上关闭浏览器或tab页,SS的数据就会被清除
    • 而恢复页面或刷新不会影响SS
  • 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和UDP比较 - 掘金 (juejin.cn)

  • TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
  • TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层
  • TCP和UDP都属于传输层协议

8.1 UDP(用户数据报协议)

  1. 面向无连接:不需要像TCP那样在发送数据前进行三次握手建立连接的,同时不会对报文进行处理

  2. 传输方式多样:UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。

  3. 不可靠性

    • 首先不可靠性体现在无连接上
    • 在网络条件不好的情况下可能会导致丢包
  4. 头部开销小,传输数据报文时是很高效的。

  5. 适用于实时应用(IP电话,视频会议,直播等)

8.2 TCP(传输控制协议)

  1. 面向连接:发送数据之前必须在两端建立连接

  2. 仅支持单播传输:只能进行点对点的数据传输

  3. 可靠传输:每个包都有序号,保证传输顺序,且接收方会返回确认(ACK),没收到的话会重传

  4. 适用于要求可靠传输的应用,例如文件传输

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