0%

HTTP详解

本文为《图解http》的笔记,主要补充http相关的计算机网络知识

HTTP基础

URI

某个协议方案表示的资源定位标识符。协议方案指访问资源所用的协议类型名称。

1555410041635

请求URI可以为绝对URI,也可以为相对URI并且在首部字段Host中写明网络域名或IP地址

报文

报文=报文首部 + 报文主体,由一个空行(CR+LF)划分

报文VS实体

  • 报文:http通信的基本单位,由8位字节流组成
  • 实体:作为请求或响应的有效载荷数据被传输,由实体首部和实体主体组成
  • 通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容才会发生变化,区别于报文主体

请求报文

1555410100190

响应报文

1555410136328

HTTP方法

GET、POST

PUT

上传文件,在报文主体中包含文件内容;但不带验证机制,存在安全性问题,一般不使用

和GET一样,但是不返回报文主体部分,用于确认URI的有效性和资源更新的日期时间等

DELETE

与PUT相反,也不带验证机制

PUT和DELETE配合Web的验证机制,遵守REST标准时可以开放使用

OPTIONS

查询URI的资源支持的方法

TRACE

追踪路径,在Max-Forwards首部填入数值(跳数),最后接收到请求的服务器返回200OK

不常用,而且容易引发XST(跨站追踪)攻击

CONNECT

要求与代理服务器通信时建立隧道,用隧道协议进行TCP通信,主要用SSL和TLS进行加密

1555496635805

分块传输编码

将实体主体分为多个部分,每一块用16进制来标记块的大小,实体主体的最后一块会使用“0(CR+LF)”来标记

获取部分内容的范围请求

用首部字段Range来指定资源的byte范围

1
Range:bytes=5001-10000

对于范围请求会返回状态码为206Partial Content的响应报文;若服务器无法响应范围请求,会返回状态码200OK的完整实体内容

HTTP状态码

类别 原因短语
1xx Informational 请求正在处理
2xx Success 请求处理完毕
3xx Redirection 需要附加操作来完成请求
4xx Client Error 服务器无法处理请求
5xx Server Error 服务器处理请求出错

2XX 成功

200 OK

正常处理

204 No Content

成功处理,但返回的相应报文中不包含实体的主体部分。一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

如在PUT请求中进行资源更新,但是不需要改变当前展示给用户的页面。

206 Partial Content

进行了范围请求,服务器成功执行,响应报文中用Content-Range指定范围的实体内容

3XX 重定向

301 Moved Permanently

永久重定向。浏览器会跳转到重定向的URI并记录下来,以后每次访问次URI都会进行跳转,而不会对该URI发起请求

302 Found

临时重定向。跳转到重定向的URI,但不会记录在浏览器中

303 See Other

类似302,通常作为 PUT或 POST操作的返回结果,区别在于表示客户端应该使用GET方法获取资源

浏览器得到301302303时,都会把POST改为GET,删除请求报文中的主体,自动重发

304 Not Modified

未满足请求报文中的条件,不包含响应的主体部分

307 Temporary Redirect

与302相同,但是不会从POST变为GET

注意POST请求的重定向要使用307

4XX 客户端错误

400 Bad Request

报文中存在语法错误

401 Unauthorized

第一次发送表示需要有用过Http认证的认证信息;第二次发送表示用户认证失败

403 Forbidden

请求资源的访问被服务器拒绝

404 Not Found

5XX 服务器错误

500 Internal Server Error

服务端在执行请求时发生错误

502 Bad Gateway

上游服务器故障

504 Gateway Timeout

扮演网关或者代理的服务器无法在规定的时间内获得想要的响应,上游服务执行超时(超过代理网关的等待时间)

重定向

1555500154422

永久重定向之间的区别

1555500178747

临时重定向的区别

1555500199054

Web服务器

数据转发

代理

服务器和客户端的中间人

代理不改变URI,每次通过代理服务器转发请求或响应时,会追加写入Via首部信息

1555499743903

优点:使用缓存减少流量;实现特定URI访问控制、获取访问日志..

  • 缓存代理:将资源副本保存在服务器上,代理再次收到相同请求时可以不获取资源,直接将缓存的资源作为响应返回
  • 透明代理:不对报文做任何加工

网关

转发其他服务器通信数据的服务器,类似代理但可以提供非HTTP服务

可以提高通信安全性,因为可以在客户端和网关之间的通信线路上加密确保安全

隧道

在客户端和服务器间中转,并保持双方通信连接。目的是确保客户端和服务器进行安全的通信。隧道不会解析HTTP请求,保持原样

缓存

大致可归为两类:私有与共享缓存。共享缓存存储的响应能够被多个用户使用。私有缓存只能用于单独用户。包括浏览器与代理缓存,除此之外还有网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上

1555500564455

1555500598866

若不超过缓存的有效期限则不请求服务器,直接返回

客户端的缓存

缓存在浏览器中,称为临时网络文件

缓存验证

强校验器

ETag响应头是一个对用户代理不透明的值。对于像浏览器这样的HTTP UA,不知道ETag代表什么,不能预测它的值是多少。如果资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上 If-None-Match头来验证缓存

用首部If-Match来比较ETag

弱校验器

Last-Modified响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since来验证缓存

带Vary头的响应

决定了对于后续的请求头,如何判断是请求一个新的资源还是使用缓存的文件

当缓存服务器收到一个请求,只有当前的请求和原始(缓存)的请求头跟缓存的响应头里的Vary都匹配,才能使用缓存的响应

1555501195373

HTTP首部

End2End VS HopbyHop

  • End2End会转发给最终目标
  • HopbyHop只对单次转发有效
  • Http/1.1之后如果要使用HopbyHop首部,需提供Connection首部字段

通用首部

Cache-Control

指定缓存工作机制(是否、最大Age值…)

请求指令:no-cache、no-store、max-age=100….

响应指令:public、no-cache、no-transform…

1555501712193

Cache-Control详细指令的含义

Connection

作用:控制不再转发给代理的首部字段、管理持久连接

Connection:不再转发的首部字段名

服务器端想明确断开连接时,Connection:Close

Date

表明创建HTTP报文的日期和时间

Pragama

仅作为与HTTP/1.0的向后兼容而定义

Trailer

实现说明在报文主体后记录了哪些首部字段

Transfer-Encoding

规定传输报文主体时采用的编码方式,HTTP/1.1的传输编码方式仅对分块传输编码有效

Upgrade

检测HTTP协议及其他协议是否可以使用更高版本进行通信

1555502713615

Via

追踪客户端和服务器之间的请求和响应报文的传输路径。经过代理或网关时会现在Via中附加该服务器的信息,再转发。Via还可以避免请求回环的发生。常和TRACE方法一起使用

请求首部字段

Accept

通知服务器用户代理能处理的媒体类型及相对优先级

可以使用q=来表示额外的权重 0-1 用分号隔离

Accep-Charset

支持的字符集和相对优先级

Accept-Encoding

支持的内容编码和相对优先级

Accept-Language

支持的语言和相对优先级

Authorization

用户代理的认证信息

Host

虚拟主机运行在同一个IP上,用Host加以区分

If-xxx

条件请求,只有当条件为真服务器才会处理请求

If-Modified-Since

告知服务器若字段值早于资源更新的时间则处理该请求,否则返回304

Max-Forwards

可经过的服务器最大数目,每经过一个服务器-1

User-Agent

传达浏览器的种类

响应首部字段

ETag

告知客户端实体标识

Location

重定向时提供重定向的URI

WWW-Authenticate

用于HTTP访问认证,告知客户端适用的认证方案

实体首部字段

Allow

通知客户端能够支持URI指定资源的所有HTTP方法

Content-Encoding

对实体的主题部分选用的内容编码方式,主要包括:gzip、compress、deflate、identity

Content-Location

报文主体返回资源对应的URI

如返回的页面内容与实际请求的对象不同时会写明URI

Cookie相关字段

Cookie作用:对无状态协议HTTP的补充

1555504189653

1555504200465

HttpOnly可以放止跨站脚本攻击(XSS)对Cookie信息的窃取,即无法通过doument.cookie获取Cookie内容

其他首部字段

X-XSS-Protection

用于控制浏览器XSS防护机制的开关

Web安全

HTTP缺点

  • 明文通信,内容可能被窃听:SSL和TLS组合使用进行加密
  • 不验证通信方身份,可能遭遇伪装:在开始通信前先确认服务器的证书
  • 很迷报文的完整性,可能被篡改:散列值校验、数字签名

HTTPS

HTTPS = HTTP + 加密 + 认证 + 完整性保护

1555505046673

HTTPS采用混合加密机制,若密钥能实现安全交换,则考虑仅用公开密钥加密,但是其处理速度比共享密钥加密要慢

1555505242502

证书

作用:证明密钥正确性

1555505794662

HTTPS通信

1555505910689

1555506163122

1555506189416

以上流程中,应用层发送数据时会附加MAC的报文摘要,查知报文是否被篡改,保护报文完整性

但HTTPS也存在速度慢,消耗CPU和你内存资源的问题

身份认证

BASIC认证

1555506908313

Base64不是加密处理,不需要附加信息即可解码

DIGEST认证

使用质询/响应的方式,不直接发送明文密码。即一方先发送认证要求给另一方,接着使用从另一方接收到的质询码计算生成响应码,再返回给对方

1555507128268

SSL客户端认证

  • 接收到需要认证资源的请求,服务器发送Certificate Request报文,要求客户端提供客户端证书
  • 客户端将证书信息以Client Certificate报文方式发送给服务器
  • 服务器验证证书通过后方可领取其中公开密钥,开始HTTPS加密通信

基于HTTP功能的追加协议

HTTP瓶颈

Ajax

通过js脚本调用和服务器进行http通信,可以从已加载完毕的Web页面上发起请求,只更新局部页面

Comet

将响应置于挂起状态,当服务器有内容更新时再返回响应,但会消耗更多资源

WebSocket

浏览器和服务器之间的全双工通信标准

优点:推送功能、减少通信量

在HTTP连接建立后需要一次握手来告知服务器通信协议改变,Upgrade:websocket

1555507877036

服务器可以调用websocket Api来发送数据

Web攻击

攻击

跨站脚本攻击

恶意web用户将代码植入到提供给其它用户使用的页面中,包括HTML代码和客户端脚本,骗取个人信息、窃取Cookie等

嵌入URL

1555509389819

窃取Cookie

1555509441737

1555509420941

SQL注入攻击

1555509497778

预防:变量采用占位符进行占位,实现转义

OS命令注入攻击

执行非法的操作系统命令,在能调用Shell函数的地方就存在被攻击的风险

1555509669501

1555509677609

HTTP首部注入攻击

在响应首部字段内插入换行或添加内容,可能设置任何Cookie信息、重定向至任意URL、显示任意主体(HTTP响应截断攻击)

HTTP响应截断攻击:插入%0D%0A%0D%0A,截断主体

目录遍历攻击

通过非法截断不公开的文件目录路径后形成攻击

1555509957604

安全漏洞

强制浏览

1555510070913

不正确的错误信息

  • Web应用抛出的错误信息:“未注册”信息可以被用于确认账号是否存在
  • 数据库抛出的错误信息

开放重定向

对指定的任意URL做重定向

1555510186494

会话管理疏忽

获取会话ID的途径:推测、窃听、会话固定攻击

会话固定攻击

1555556011317

跨站点请求伪造

CSRF,利用已认证用户的权限更新设定信息、购买商品、发表评论等

1555557659047

点击劫持

利用透明的按钮或链接做成陷阱覆盖在Web页面上,诱使用户点击

Dos攻击

集中利用访问请求导致资源过载;通过攻击安全漏洞使服务停止

其他

访问控制(CORS)

HTTP访问控制(CORS)文档

CORS中间件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
fmt.Println(method)
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")

// 放行所有OPTIONS方法,因为有的模板是要请求两次的
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
// 处理请求
c.Next()
}
}

JWT

英文介绍

阮一峰教程

Localstorage

localstorage 必知必会

Window.localStorage文档