HTTP
一. 特点
- 简单快速。只需要发送请求方法和路径。
- 灵活。允许传输任意类型的的数据对象(由Content-Type加以标记)。
- 无连接。每次连接只处理一个请求,处理完成后断开连接。
- 无状态。对事务处理没有记忆能力。
二. 报文结构
首行结构.
- 请求行:请求方法 请求地址 协议版本
- 响应行:响应方法 状态码 状态码描述
http报文头分为四类:通用报文头、请求报文头、响应报文头、和实体报文头.
三. 请求方法
幂等:不管进行多少次重复的操作,都是实现相同的情况。
- GET:获取资源。
- POST(不幂等:创建用,例如添加头像):提交数据。
- PUT(幂等:更新用,例如更新头像):修改数据。
- HEAD:用于获取报头。
- DELETE:删除资源。
- OPTIONS:查询请求url支持的请求方法。
四. 状态码
五. 状态管理:Cookie与Session
六. 缓存
- 强缓存
- Cache-Control 一段时间
- Expires 指定具体时间
2. 协商缓存
- Last-Modified只精确到秒,如果在1秒内修改文件无法感知
3. 缓存改进方案:
七. 断点续传与多线程下载
八. HTTPS
- HTTP: 直接通过明文在浏览器和服务器之间传递信息。
- HTTPS:采用 对称加密 和 非对称加密 结合的方式来保护浏览器和服务端之间的通信安全。
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
九. SPDY改进
- 多路复用,请求优化
- 支持服务器推送
- 压缩http请求头
- 强制使用ssl传输协议
十. HTTP2.0
- 二进制分帧
- 多路复用
- 首部压缩 http1.x的header由于cookie和user agent很容易膨胀,而且每次都要重复发送。http2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。
- 服务器推送
缺陷:
- 队头阻塞(多路复用:丢包情况下,整个tcp都要重传)
- 建立连接的握手延迟大
十一. HTTP3.0
基于UDP的QUIC
- 0 RTT(往返时延)建立连接(目前TCP与SSL/TLS(1.0,1.1,1.2)每次建连需要TCP三次握手+安全握手,需要4~5个RRT)。
- 避免前序包阻塞(前向纠错)。多个数据在TCP连接上传输时,若一个数据包出现问题,TCP需要等待该包重传后,才能继续传输其它数据包。但在QUIC中,因为其基于UDP协议,UDP数据包在出问题需要重传时,并不会对其他数据包传输产生影响。
- 快速重启会话。普通基于tcp的连接,是基于两端的ip和端口和协议来建立的。在网络切换场景,例如手机端切换了无线网,使用4G网络,会改变本身的ip,这就导致tcp连接必须重新创建。而QUIC协议使用特有的UUID来标记每一次连接,在网络环境发生变化的时候,只要UUID不变,就能不需要握手,继续传输数据。
十二. Web安全
1. XSS(跨站脚本攻击)
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
- 持久型(存储型XSS) 攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
- 非持久型(反射型XSS) 攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。 反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
- DOM 型 攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL。
- 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
防御:
- 转义字符
用户的输入永远不可信任的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
- HTTPOnly Cookie
禁止通过脚本获取cookie
- 验证码
防止脚本冒充用户提交危险操作。
- CSP(白名单)
通常可以通过两种方式来开启 CSP:
- 设置 HTTP Header 中的 Content-Security-Policy
只允许加载本站资源:Content-Security-Policy: default-src 'self'
- 设置 meta 标签的方式,例如:
2. CSRF(跨站请求伪造)
下图简单阐述CSRF攻击原理:
防御:
- SameSite
可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送,可以很大程度减少 CSRF 的攻击,但是该属性目前并不是所有浏览器都兼容。
- Referer Check
通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击
- 请求时附带验证信息,比如验证码或者 Token
Token被用户端放在Cookie中(不设置HttpOnly),同源页面每次发请求都在请求头或者参数中加入Cookie中读取的Token来完成验证。CSRF_只能_通过_浏览器自己带上_Cookie,不能操作Cookie来获取到Token并加到http请求的参数中。 所以CSRF本质原因是“重要操作的所有参数都是可以被攻击者猜测到的”,Token加密后通过Cookie储存,只有同源页面可以读取,把Token作为重要操作的参数,CSRF无法获取Token放在参数中,也无法仿造出正确的Token,就被防止掉了
十三. 问题汇总
1. http各版本的区别
2. UDP和TCP的区别
字节就是散乱的数据 报文就是添加了标记,封装后的数据
3. GET和POST的区别
4. 命中缓存除了返回304还会返回什么
HTTP缓存一般有两种:强缓存和协议缓存。前者的资源是缓存到本地直接从本地获取的,获取成功后返回 200,状态为 from memory cache 或 from disk cache;后者是向服务器发送请求,通过响应头来判断是否“命中”缓存资源,如缓存资源与服务器一致,则使用缓存资源,返回304。
5.从输入url到页面显示的过程
6.cookie的字段有哪些
十四.扩展
推荐学习文章