概念
- 传输超媒体文档的应用程协议
- web 浏览器与 web 服务器之间通信
- 无状态协议
- 基于 TCP/IP 协议
组成
1. accept:用来告诉服务器(客户端)可以处理的内容类型,MIME 类型:用来表示文档、文件或字节流的性质和格式
1. 独立类型
1. text 表明文件时普通文本,理论是人类可读的
- text/plian
- text/html
2. image 表明是图像
- image/jpeg
- image/png
3. autio 音频
- audio/mpeg
- audio/ogg
- audio/*
4. video 视频
- video/mp4
5. application 二进制数据
- application/*
- application/json
- application/javascript
- application/octet-stream
2. multipart 类型:细分领域的文件类型的种类,
- multipart/form-data
- multipart/byterange
2. accept-charset:用来告诉服务器客户端可以处理的字符集类型(utf-8,iso-8859-15,*)
3. accept-encoding:将客户端能够理解的内容编码方式(某种压缩算法)进行通知服务器(gzip,compress,deflate,br,identity,*)
- gzip:表示采用 LZ77 压缩算法,以及 32 位 CRC 校验的编码方式
- compress:采用 LZW 压缩算法
- deflate:采用 zlib 结构和 deflate 压缩算法
- br:采用 Brotli 算法的编码方法
- identity:用于自身
- *:匹配其他任意未在该请求头字段中列出的编码方式,它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。
4. accept-control-allow-credentials:是否可以将请求响应暴露给页面
5. accept-control-allow-headers:请求头允许出现的头部元素
6. accept-control-allow-methods:请求头允许的请求方法
7. accept-control-allow-origin:指定该资源是否允许与给定的 origin 共享
8. accept-control-request-headers:用于通知服务器正真的请求中才会用那些请求头
9. accept-control-request-methods:用于通知服务器正真的请求中才会用那些请求方法,因为在预请求中总是以 options 的方式进行请求
10. allow: 用于枚举资源所支持的 http 方法集合
11. content-type:指示资源的 MIME 类型;组成:media-type, charset, boundary。举例:Content-Type: text/html; charset=utf-8;Content-Type: multipart/form-data; boundary=something
HTTP response
1. 响应状态码
1. 信息响应
- 100(continue)这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果请求已经完成,则忽略他
- 101(switching protocol)该代码是响应客户端 upgrade 标头发起的,并且指示服务器也正在切换协议
- 102(processing)服务器已收到并正在处理请求,但没有响应可用
- 103(early hints)此状态码主要用于与 link 连接头一起使用,允许用户代理在服务器仍准备响应时开始预加载资源
2. 成功响应
- 200(ok) 请求成功
- GET: 资源已被提取并在消息正文中传输
- HEAD:实体标头位于消息正文中
- POST:描述动作结果的资源在消息正文中传输
- TRACE:消息正文包含服务器收到的请求消息
- 201(created)该请求已成功,并因此创建一个新的资源,通常在 post 或者 put 请求中
- 202(accepted)请求已收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前的请求结果,预期另外的进程和服务去处理请求,或不处理
- 203(non-authoritative information)服务器已成功处理请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或第三方得拷贝
- 204(no content)服务器成功处理请求,但是不需要返回任何实体内容,并且希望更新了的元信息
- 205
- 206
- 207
- 208
- 226
3. 重定向
- 300(multiple choice)被请求的资源有一系列的可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息用户或者浏览器可以自行选择一个首选的地址进行重定向
- 301(moved permanently)请求的资源被永远的移到新的地方,并且将来对此资源的引用都应该使用本响应返回的若干 URI 之一
- 302
- 303
- 304(not modified)如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容并没改变,则服务器返回这个状态码
- 305
- 306
- 307
- 308
4. 客户端响应
- 400(bad request)
- 语义有误,当前请求无法被服务器理解,除非修改,否则客户端不应该重复提交该请求
- 请求参数有误
- 401 (unauthorized)当前请求需要用户验证
- 402
- 403(forbidden)服务器已经理解请求,但拒绝执行。
- 404(not found)请求失败,请求所需要的资源在服务器上未发现
- 405(method not allow)请求行中指定方法不能被用于请求相应得资源
- 406
- 407
- 408(request timeout)请求超时
~
- 451
5. 服务器响应
- 500(internal serve error)服务器遇到了不知如何处理的情况
- 501(not implemented) 此请求方法不被服务器支持且无法被处理
- 502(bad gateway)此错误响应表明服务器作为网关需要得到一个处理这个请求得响应,但是得到一个错误得响应
- 503(service unavailable)服务器没有准备好处理请求
- 504(gateway timeout)当服务器作为网关,不能及时得到响应时返回该状态码
- 505(http version not supported)服务器不支持请求中所使用的协议
~
- 511
CORS(跨域资源共享):它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。
1. 简单请求:浏览器会直接发出 CORS 请求,具体讲就是在请求头增加 origin 字段
- 请求方法:HEAD、GET、POST
- HTTP 头信息:Accept、Accept-language、content-language、Last-Event-ID、Content-Type:application/x-www-form-urlencoded、multipart/form-data、text/plain
2. 非简单请求:浏览器会在非简单请求正式通信前,增加一次 http 预请求(preflight),请求方法位 OPTIONS,预请求会和服务器协商,通过则发正式请求
3. 和 JOSNP 相比,目的一样,但是功能更强大,JOSNP 只能是 get 请求,缺点需要浏览器支持
http 安全
1. XSS(Cross Site Scripting)跨站脚本攻击
- 原理:页面渲染的数据中包含可运行的脚本
- 分类
- 反射性:url 参数注入
- 存储形:存储到 DB 后读取时注入
- 注入点
- HTML 节点内的内容(text)
- HTML 中 DOM 元素的属性
- Javascript 代码
- 富文本
- 解决
- 浏览器自带防御机制,主要应对反射型攻击(HTML 内容或属性):http 响应头中自动添加 x-xss-protection,值为 0(关闭),1(打开),默认打开
- 对特定字符做转义:内容注入替换尖括号( < => < > => > ) 属性注入替换单引号或双引号( " => " ' => ' )
- CSP(Content Security Policy)内容安全策略:用于指定哪些内容可执行
2. CSRF(Cross Site Request Forgy)跨站请求伪造
- 原理:在第三方网站向本网站发起请求
- 解决
- 禁止第三方网站携带本网站的 cookie 信息:设置 same-site 属性,same-site 属性有两个值,Strict(所有的第三方请求都不能携带本网站的 cookie)和 Lax(链接可以,但是 form 表单提交和 ajax 请求不行)
- 使用验证码或者添加 token 验证
- referer 验证:禁止来自第三方的请求
3. 点击劫持