HTTP 协议

HTTP 协议

http 1.0

TCP不能复用,一般服务器在响应完请求后主动关闭连接

http 1.1

默认启用 keep-alive 重用连接,避免了建立/释放连接的开销 http 请求是一个接着一个的,不需要重复连接 判断响应结束:

  1. 消息首部字段Conent-Length(已知大小的静态数据)
  2. Transfer-Encoding:chunk(动态数据)

HTTP 2

  1. HTTP2.0使用了多路复用的技术,一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面
  2. TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求,通过流进行分包的方式(UDP 少了这些开销)
  3. header压缩,双方缓存一份 header 域的表,避免重复,又减少传输大小

HTTPS

在 HTTP 的基础上加入了 SSL 协议 HTTPS除了TCP的三个包,还要加上ssl握手需要的9个包,所以一共是12个包 大幅增加了中间人攻击的成本 https 只加密了 http 层的内容

常见状态码含义

301 - Moved Permanently 永久重定向 ,该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI 302 - Found 临时重定向,类似于301,但新的URL应该被视为临时性的替代,而不是永久性的 303 - See Other 当301、302、303响应状态码返回时,几乎所有浏览器都会把post改成get,并删除请求报文内的主体,之后请求会自动再次发送

400 - Bad Request 401 - Unauthorized 403 - Forbidden 404 - Not Found 500 - Internal Server Error 503 - Service Unavailable 504 - Gateway Timeout 网关超时

常用头

ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改,所以ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了

Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等

请求方法

GET请求产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200,返回数据,幂等,多次请求结果一样。

POST请求产生两个TCP数据包,浏览器先发送header,服务器响应100,浏览器再发送data,服务器响应200,返回数据,不幂等

HEAD方法和GET方法一致,除了服务器不能在响应里返回消息主体。HEAD请求响应里HTTP头域里的元信息应该和GET请求响应里的元信息一致

安全

XSS

允许恶意web用户将代码植入到网站页面中的漏洞 预防措施:

  1. httponly cookie
  2. 输入检查
  3. 输出检查

CSRF

跨站点请求伪造,攻击者诱使用户访问一个页面,以该用户身份在第三方站点里执行操作 预防措施:

  1. referer 判断是否为本站的请求
  2. csrfToken
  3. 自定义验证头
  4. 验证码

中间人攻击

上 HTTPS 加密

SQL注入

核心思想是参数化传入 解决方法:

  1. 预编译语句,重用执行计划
  2. 存储过程,重用执行计划
  3. 前端做字符检查

搭便车攻击

假设现在你的浏览器开了一个站点A,登陆了进去,于是cookie便记录了会话id。 然后你又不小心开了另一个站点B,这个站点页面一打开就开始执行一些恶意代码。这些代码的逻辑是调用站点A的API来获取站点A的数据,因为可以骑着(Ride)站点A的会话cookie。而这些数据正好是用户私密性的。于是用户在站点A上的私有信息就被站点B上的代码窃走了。这是随意跨域带来的问题

安全跨域

jsonp:通过 script 标记进行回调,在 js 中执行回调函数得到数据 缺点:只能发 GET,不能携带 cookie

CORS:跨域ajax浏览器会自带 origin 参数,服务端通过这个 origin 来判断是否授权,如果返回的时候读到 Access-Control-Allow-Origin 头部,那么表示跨域请求成功,否则失败