HTTP协议相关的问题 - Go语言中文社区

HTTP协议相关的问题


一、Http的请求报文结构和响应报文结构

Http请求报文主要由请求行、请求头部、空行和请求正文(Get请求没有请求正文)4部分组成。

1. 请求行

由三部分组成,请求方法、URL和协议版本,之间由空格分隔。

请求方法

GET

获取资源,当前网络请求中,绝大部分使用的是GET方法。

HEAD

获取报文首部,但不返回报文实体主体部分。

主要用于确认URL的有效性以及资源的更新日期时间等。

POST

传输实体主体

主要用于传输数据,GET主要用来获取资源

PUT

上传文件,由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。

PATCH

对资源进行部分修改。

DELETE

删除文件

OPTIONS

查询支持的方法,查询指定的URL能够支持的方法

CONNECT

要求在与代理服务器通信时建立隧道

使用SSL(Secure Sockets Layer,安全套结层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。

TRACE

追踪路径

服务器会将通信路径返回给客户端

协议版本

格式:HTTP/版本主号.次版本号

HTTP/1.0:每个连接只能传送一个请求和响应,请求就会关闭,没有HOST字段。

HTTP/1.1:同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,必须有HOST字段。

2. 请求头

为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,之间用冒号分隔。

常见请求头:

HOST:接受请求的服务器地址,IP端口号或域名。

User-Agent:发送请求的应用程序名称。

Connection:指定与连接相关的属性。

3. 空行

表示请求头部结束。

4. 请求正文

可选部分,比如GET请求就没有正文

HTTP响应报文

主要由状态行、响应头、空行和响应正文。

1. 状态行

协议版本、状态码、状态码描述,之间由空格分隔,用来告知客户请求的结果。

状态码                      类别                                                       原因短语

1XX                          Information(信息性状态码)                  接受的请求正在处理

2XX                          Success(成功状态码)                            请求正常处理完毕

3XX                          Redirection(重定向状态码)                   需要进行附加操作完成请求

4XX                          Client Error(客户端错误状态码)            服务器无法处理

5XX                          Server Error(服务器错误状态码)            服务器处理请求出错

2. 响应头

为响应报文添加一些附加信息。

常见响应头:

Server:服务器应用程序软件的名称和版本

3. 空行

4. 响应正文

常见HTTP首部字段

a. 通用首部字段

Date: 创建报文时间

Connection:连接的管理

Cache-Control:缓存的控制

Transfer-Encoding:指定报文主体的传输编码方式

b. 请求首部字段 

Host:请求资源所在服务器

Accept:可处理的媒体类型

Accept-Charset:可接收的字符集

Accept-Encoding:可接收的内容编码

If-Match:比较实体标记(ETag)

If-Modified-Since:比较资源的更新时间

Referer:告诉服务器我是从哪个页面链接过来的

c. 响应首部字段

Accept-Ranges:可接收的字节范围

ETag:资源的匹配信息

Location:令客户端重新定向到的URI

Server:HTTP服务器的安装信息

Vary:代理服务器缓存的管理信息

d. 实体首部字段

Allow:资源可支持的HTTP方法

Content-Type:实体主体的类型

Content-Length:实体主体的字节数

Content-Range:实体主体的位置范围,一般用于发出部分请求时使用

Http状态码含义

200 OK 服务器已成功处理了请求并提供了请求的网页

200 Accepted 已经接受请求,但处理尚未完成。

200 No Content 没有新文档,浏览器应该继续显示原来的文档。

206 Partial Content 客户端进行了范围请求。响应报文中由Content-Range指定实体内容的范围。实现断点续传

301 Moved Permanently 永久性重定向。请求的网页已永久移动到新位置。

302(或307) Moved Temporatily 临时性重定向。请求的网页临时移动到新位置。

304 Not Modified 未修改。

401 Unauthorized 客户试图未经授权访问受密码保护的页面。

403 Forbidden 服务器拒绝请求。

404 Not Found 服务器上不存在客户机所请求的资源。

500 Internal Server Error 服务器遇到一个错误,使其无法为请求提供服务。

1. ETag和If-None-Match

判断资源是否改变的方法。

工作原理:在HTTP  Response中添加ETag信息。当客户端再次请求该资源时,将在HTTP  Response中加入If-None-Match信息(ETags的值)。如果服务器验证资源的ETags没有改变,将返回一个304状态;否则,服务器将返回200状态,并返回该资源和新的ETags

2. Last-Modified和If-Modified-Since

记录页面最后修改时间的HTTP头信息,Last-Modified由服务器往客户端发送的HTTP头,If-Modified-Since由客户端往服务器发送的头,可以看到,再次请求本地存在的缓存页面时,客户端会通过If-Modified-Since头把浏览器端缓存页面的最后一次被服务器修改的时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存进来并显示到浏览器中;如果是最新的,则返回304告诉客户端其本地缓存的页面是最新的,就直接把本地缓存文件显示到浏览器中,这样在网络上传输的数据量会大大减少,减轻了服务器的负担。

Last-Modified和ETag一起使用时,服务器会优先验证ETag的值。

3. Expires/Cache-Control(优先使用)

用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到服务器取数据。

Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

Cache-Control(HTTP/1.1才有):max-age =315360000

声明的是一个相对的秒数,在大多数情况下同时发送这两个头会是一个更好的选择,当客户端两种头都能解析的时候,会优先使用Cache-Control

具体应用

Cookie

HTTP协议是无状态的,主要是为了让HTTP协议尽可能简单,使得它能够处理大量事务。HTTP/1.1引入Cookie来保存状态信息

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。它用于告知服务端两个请求是否来自同一浏览器,并保持用户的登陆状态

1. 用途

会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

个性化设置(如用户自定义设置、主题等)

浏览器行为跟踪(如跟踪分析用户行为等)

2. 创建过程

服务器发送的响应报文中包含Set-Cookie 首部字段,客户端得到响应报文后把Cookie内容保存到浏览器中。

客户端之后对同一个服务器发送请求时,会从浏览器中读出Cookie信息通过Cookie请求首部字段发送给服务器。

3. 分类

会话期Cookie:浏览器关闭之后它会被自动删除,也就是说仅在会话期内有效

持久性Cookie:指定一个特定的过期时间(Expires)或有效期(max-age)。

4. JSP获取Cookie

通过Document.cookie属性可以创建新的Cookie,也可通过该属性访问非HttpOnly标记的Cookie

 

5. Secure 和 HttpOnly

标记为Secure的Cookie只应通过被HTTPs协议加密过的请求发送给服务端。

标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。

 

6. 作用域

Domain:指定了哪些主机可以接受Cookie,如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了Domain,则一般包含子域名。

Path:指定了主机下的哪些路径可以接受Cookie

 

7. Session

用户信息通过Cookie存储在用户浏览器中,也可以利用Session存储在服务端,更加安全。

Session 可以存储在服务器上的文件、数据库或者内存中,现在最常见的是将 Session 存储在内存型数据库中,比如 Redis。

使用Session维护用户登陆的过程:

用户进行登陆时,用户提交包含用户名和密码的表单,放入HTTP请求报文中;

服务器验证该用户名和密码;

如果正确则把用户信息存储到Redis中,它在Redis中的ID为Session ID;

服务器返回的响应报文中的Set-Cookie首部字段包含了这个Session ID,客户端收到响应报文之后将该Cookie值存入到浏览器中;

客户端之后对同一个服务器进行请求时会包含该Cookie值,服务器收到之后提取出Session ID,从Redis中取出用户信息,继续之后的业务操作。

8. 浏览器禁用 Cookie

此时无法使用 Cookie 来保存用户信息,只能使用 Session。除此之外,不能再将 Session ID 存放到 Cookie 中,而是使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。

9. Cookie和Session选择

Cookie 只能存储 ASCII 码字符串,而 Session 则可以存取任何类型的数据,因此在考虑数据复杂性时首选 Session;

Cookie存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;

对于大型网站,如果用户所有的信息都存储在Session 中,开销会非常大。

 

缓存

1. 优点

缓解服务器压力;

降低客户端获取资源的延迟(缓存资源比服务器上的资源离客户端更近)。

2. 实现方法

代理服务器进行缓存;

客户端浏览器进行缓存。

3. Cache-Control

HTTP/1.1通过Cache-Control首部字段来控制缓存。

(一)禁止进行缓存

no-store指令规定不能对请求或响应的任何一部分进行缓存。

 

Cache-Control: no-store

(二)强制确认缓存

no-cache 指令规定缓存服务器需要先向源服务器验证缓存资源的有效性,只有当缓存资源有效才将能使用该缓存对客户端的请求进行响应。

 

Cache-Control: no-cache

(三)私有缓存和公共缓存

 

private:将资源作为私有缓存,只能被单独用户所使用,一般存储在用户浏览器中。

 

 

Cache-Control: private

public:规定了将资源作为公共缓存,可以被多个用户所使用,一般在代理服务器中。

 

Cache-Control: public

(四)缓存过期机制

max-age 指令出现在请求报文中,并且缓存资源的缓存时间小于该指令指定的时间,那么就能接受该缓存。

max-age 指令出现在响应报文中,表示缓存资源在缓存服务器中保存的时间。

 

Cache-Control: max-age=31536000

Expires首部字段也可以用于告知缓存服务器该资源什么时候会过期。

 

Expires: Wed, 04 Jul 2012 08:26:05 GMT

4. 缓存验证

ETag首部字段:资源的唯一标识。

 

ETag: "82e22293907ce725faf67773957acd12"

可以将缓存资源的ETag值放入If-None-Match首部,服务器收到该请求后,判断缓存资源的ETag值和资源的最新ETag值是否一致,入股一致则表示该缓存资源有效,返回304 Not Modified。

If-None-Match: "82e22293907ce725faf67773957acd12"

Last-Modified 首部字段也可以用于缓存验证,它包含在源服务器发送的响应报文中,指示源服务器对资源的最后修改时间。但是它是一种弱校验器,因为只能精确到一秒,所以它通常作为 ETag 的备用方案。如果响应首部字段里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 OK。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 Not Modified 响应,

 

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

连接管理

1. 短连接与长连接

长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。

从HTTP/1.1开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用Connection : close;而在HTTP/1.1之前默认是短连接的,如果需要长连接,则使用Connection : Keep-Alive。

2. 流水线

默认情况下,HTTP请求是按顺序出发的,下一个请求只有在当前请求收到应答过后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。

流水线是在同一条长连接上发出连续的请求,而不用等待响应返回,避免连接延迟。

内容协商

通过内容协商返回最合适的内容,例如根据浏览器的默认语言选择返回中文界面还是英文界面。

1. 类型

(一)服务端驱动型内容协商

客户端设置特定的HTTP首部字段,服务器根据这些字段返回特定的资源。

(二)代理驱动型协商

服务器返回 300 Multiple Choices 或者 406 Not Acceptable,客户端从中选出最合适的那个资源。

2. Vary(代理服务器缓存的管理信息)

 

Vary: Accept-Language

在使用内容协商的情况下,只有当缓存服务器中的缓存满足内容协商条件时,才能使用该缓存,否则应该向源服务器请求该资源。

内容编码

内容编码将实体主体进行压缩,从而减少传输的数据量。

范围请求

如果出现网络中断,服务器只发送了一部分数据,范围请求可以使得客户端只请求服务器未发送的那部分数据,从而避免服务器重新发送所有的数据。

1. Range

在请求报文中添加Range首部字段指定请求的范围。

 

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023

请求成功的话服务器返回的响应包含206 Partial Content 状态码。

 

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024
...
(binary content)

2. Accept-Range

响应首部字段Accept-Range用于告知客户端是否能处理范围请求,可以处理使用bytes,否则使用none。

 

Accept-Ranges: bytes

3. 响应状态码

在请求成功的情况下,服务器会返回206 Partial Content 客户端进行了范围请求。

在请求的范围越界的情况下,服务器会返回 416 Requested Range Not Satisfiable 状态码。

在不支持范围请求的情况下,服务器会返回200 OK 状态码。

分块传输编码

Chunked Transfer Coding:可以把数据分割成多块,让浏览器逐步显示页面。

多部分对象集合

一份报文主体内可含有多种类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔,每个部分都可以有首部字段。

 

虚拟主机

HTTP/1.1使用虚拟主机技术,使得一台服务器拥有多个域名,并且在逻辑上可以看成多个服务器。

通信数据转发

1. 代理

代理服务器接受客户端的请求,并且转发给其他服务器

使用代理的主要目的:

缓存;负载均衡;网络访问控制;访问日志记录

代理服务器分为:正向代理和反向代理,用户察觉到正向代理的存在,反向代理一般位于内部网络中,用户察觉不到。

2. 网关

网关服务器会将HTTP转化为其他协议进行通信,从而请求其他非HTTP服务器的请求。

3. 隧道

使用SSL等加密手段,为客户端和服务器之间建立一条安全的通信线路。

 

HTTPs

HTTP 有以下安全性问题:

使用明文进行通信,内容可能会被窃听;

不验证通信方的身份,通信方的身份有可能遭遇伪装;

无法证明报文的完整性,报文有可能遭篡改。

HTTPs并不是新协议,而是先让HTTP先和SSL(Secure Sockets Layer)通信,再由SSL和TCP通信。HTTPs使用了隧道技术进行通信。

通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。

加密

1. 对称密钥加密

加密和解密使用同一密钥。

2. 非对称密钥加密

又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。

公开密钥所有人都可以获得,通信发送方获得接受方的公开密钥之后,就可以使用公开密钥进行加密,接受方收到通信内容后使用私有密钥进行加密。

非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。

3. HTTPs采用的加密方式

HTTPs采用混合的加密机制,使用非对称密钥加密用于传输对称密钥来保证安全性,之后使用对称性密钥加密进行通信来保证速率。

认证

通过使用证书来对通信方进行认证。

数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信的第三方机构。

服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。

进行HTTPs进行通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,先使用数字签名进行验证,如果验证通过了,就可以通信了。

通信开始时,客户端需要使用服务器的公开密钥将自己的私有密钥传输给服务器,之后再进行对称密钥加密。

完整性保护

SSL提供报文摘要功能来进行完整性保护。

 

Web攻击技术

跨站脚本攻击

1. 概念

跨站脚本攻击(XSS),可以将代码注入到用户浏览的网页上,这种代码包括HTML和JavaScript。

2. 危害

窃取用户的Cookie值

伪造虚假的输入表单骗取个人信息

显示伪造文章或者图片

3. 防范手段

(一)设置Cookie为HttpOnly

设置了 HttpOnly 的 Cookie 可以防止 JavaScript 脚本调用,就无法通过 document.cookie 获取用户 Cookie 信息。

(二)过滤特殊字符

(三)富文本编辑器的处理

富文本编辑器通常采用 XSS filter 来防范 XSS 攻击,可以定义一些标签白名单或者黑名单,从而不允许有攻击性的 HTML 代码的输入。

跨站请求伪造

1. 概念

跨站请求伪造(CSRF):攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。

XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户浏览器的信任。

攻击者并不能通过CSPF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义去操作。

2. 防范手段

(一)检查Referer首部字段

Referer 首部字段位于 HTTP 请求报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,可以极大的防止 CSRF 攻击。

(二)添加校验Token

在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,并且攻击者无法伪造的数据作为校验。

(三)输入验证码

 

 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。也可以要求用户输入验证码来进行校验。

SQL注入攻击

1. 概念

服务器上的数据库运行非法的SQL语句,主要通过拼接来完成。

2. 攻击原理

3. 防范手段

(一)使用参数化查询

(二) 单引号转换

拒绝服务攻击

亦称洪水攻击,其目的在于使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。

GET和POST的区别

作用

GET用于获取资源,POST用于传输实体主体。

参数

GET和POST的请求都能使用额外的参数,但GET的参数是以查询字符串出现在URL中,而POST的参数存储在实体主体中。

可缓存

如果要对响应进行缓存,需要满足以下条件:

请求报文的HTTP方法本身是可缓存的,包括GET和HEAD,但是PUT和DELETE不可缓存,POST在多数情况下不可缓存的。

响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。

响应报文的Cache-Control 首部字段没有指定不进行缓存。

XMLHttpRequest

为客户端提供了在客户端和服务器之间传输数据的功能,它提供了一个通过URL来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分而不会打扰到用户。XMLHttpRequest在AJAX中被大量使用。

在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。 GET 方法 Header 和 Data 会一起发送。

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/peixie9441/article/details/80864521
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 14:35:41
  • 阅读 ( 1038 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢