阅读 121

http协议(报文格式及常见首部)

http协议(报文格式及常见首部)

超文本传输协议,广泛应用于互联网,平时对它的理解比较零散,这里做一些整理,强化记忆,并记录;

主要特点:

  • 可靠传输,基于TCP协议实现,具有可靠传输的特性(无差错,不丢失,不重复,按序到达);

  • 结构简单,http协议的报文格式比较简单,本身就是普通的字符串。具体结构在后面给出;

  • 可扩展性强,http规定了报文格式,但是并不限制首部名称和值,也不限制传输数据的格式(可以传普通文本,也可以传二进制对象)

  • 一次请求一次响应,http通信模式遵从一次请求,一次应答,这么一个完整的过程称之为一次http事务。

http报文格式

  • request 报文格式
METHOD PATH VERSION\r\n
header1:value1\r\n
header2:value2\r\n
...
\r\n
request body
复制代码

示例:

GET /login HTTP/1.1\r\n
Accept: */*\r\n
Content-Type:application/json;chartset=utf8\r\n
user-agent:...\r\n
\r\n
复制代码
  • response 报文格式
VERSION STTAUS State primitive\r\n
header1:value1\r\n
header2:value2\r\n
...
\r\n
body
复制代码

示例:

HTTP/1.1 200 OK\r\n
Content-type: text/plain;charset=utf8\r\n
Cache-Control: no-cache\r\n
\r\n
body
复制代码

http首部的换行符需要使用CRLF, 并且请求体和请求头之间,响应体与响应头之间需要有空行;

缺点

  • http本身没有任何安全策略,采用明文传输,没有任何安全性可言。(对安全性的要求我们一般会交给其他协议去实现,例如:SSL/TLS)
  • 队头阻塞问题,当多个请求共用一个连接时,排在前面的任务如果占用了大量的时间,会阻塞后面的任务。

常见的请求头

  • Content-Type: 标识请求体中数据的mime类型,有可能会带上编码格式。
    • 例如:
    Content-Type:application/json
    复制代码
  • Accept: 告知服务器客户端能处理的数据类型,,以Mime类型来表示。
    • 例如:
    // 使用*/*表示支持任意mime类型
    Accept: */*
    复制代码
  • Accept-Encoding: 告知服务器客户端支持的数据编码格式,通常是
    • 例如:
    Accept-Encoding:gzip,deflate,compress
    复制代码
  • Accept-Language: 告知服务器客户端能理解的自然语言
    • 例如:
    Accept-Language:h-CN,zh
    复制代码
  • Accept-Charset: 告知服务器客户端能处理的字符集类型
    • 例如:
    Accept-Charset:UTF-8,iso-8859-1
    复制代码

常见的响应头

  • Content-Type: 功能和请求头差别不大,表示相应内容的mime类型
    • 例如:
    Content-Type:application/json
    复制代码
  • Content-Length: 标识返回数据的长度,用十进制数字表示的八位字节的数目。
    • 例如:
    Content-Length:200
    复制代码
  • Tansfer-Encoding: 传输不定长文件所需要的首部,指定的是编码格式,当指定了这个首部之后,Content-Length首部会被忽略;
    • 例如:
    Transfer-Encoding:chunked
    复制代码
  • Accept-Ranges: 告知客户端服务器支持范围请求
    • 例如:
    Accept-Ranges:bytes
    复制代码

cookie

cookie主要作用是用来跟踪会话,http协议本身是无状态的,无法跟踪会话,所以cookie诞生了;

cookie这个特性有很多坑,特性也多,单独归纳一下

相关响应头:Set-Cookie,服务端返回设置cookie命令,浏览器端会在本地存储这个cookie - 例如:

      Set-Cookie:connectid=asjdhajkshdagfhasgfjhasf00==
复制代码

相关请求头:Cookie,当cookie被设置后,当前域下之后所有的请求都会带上设置的cookie在这个首部中; - 例如:

  Cookie:connectid=asjdhajkshdagfhasgfjhasf00==
复制代码

Set-Cookie相关指令:

Domain: cookie的作用域(可以通过设置让多个子域共享cookie)

Path: cookie作用于哪个路径,如果设置为:/,表示作用于设置的域下的任意一个路径

httpOnly:限制这个cookie只能通过http访问,本地脚本不得访问,由服务端设置;设置之后,本地脚本无法再通过 document.cookie访问;

max-age: cookie生存时间,由后端设置

Expires: cookie到期时间,由后端设置

如果Set-Cookie里面没有带max-age以及Expires,那么cookie的生命会在会话终止后结束。

secure: 安全传输,表示cookie只能在https环境下传输,如果不是https,浏览器在请求时,不会带上该cookie

SameSite: 有三个值,Strict,Lax, None;从前到后依次为:禁止任何其他域带上该cookie,只能通过get方法带上cookie,无限制(该命令是预防CSRF的重要手段)

坑点:

  • 浪费带宽,当前域下所有请求,不管它要不要,每次请求都会带上cookie;

  • 不安全, 是csrf的主要攻击对象

  • 很容易被人窃取,示例如下:

    背景:

    • 当前网站为https
    • cookie未设置secure命令

    例如当前域名为:https://test.kiliaosi.com 在整个会话中,中间人是无法获取cookie的,但是当用户访问另一个不是https的网站时,流量会被中间人截获,攻击方式如下:

    1. 用户访问 https://test.kiliaosi.com 登录、完成一系列任务;
    2. 用户在某一时间点访问 http://test.unsafe.com
    3. 中间人截获明文请求数据
    4. 中间人发送重定向响应302,重定向到:http://test.kiliaosi.com
    5. 客户浏览器打开 http://test.kiliaosi.com 并请求(由于cookie未设置secure,在请求的时候,会带上所有cookie)
    6. 中间人获得cookie。

上面只是针对cookie众多攻击方式中的一种;能明显看到,https并不能完全保证整个会话安全,它目前也做不到,所以规范cookie的使用是非常重要的。

文章分类
后端
文章标签