http请求响应报文及session&cookie&token详解

把笔记整理一下发出来

HTTP的报文分析

HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的应用层传送协议,其报文分为请求报文和响应报文。

HTTP基于TCP/IP通信协议来传递数据。

特点

(1)HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。还是无状态的。 服务端都不会知道访问者客户端是哪个,这样的好处就是http设计简单,缺点也显而易见:每次关闭浏览器后又要重新登录。(因此才有了cookie)

(2)HTTP是媒体独立的:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

当客户端请求一个网页时,会先通过http协议将 请求的内容 封装在http 请求报文之中,服务器收到该 请求报文 后根据协议规范进行报文解析,然后向客户端返回 响应报文

请求报文

http报文结构为:

–起始行(请求行)
对报文进行描述
–头部(请求头)
包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。决定了客户端和服务器能做什么事情,与缓存相关的规则信息,均包含在header中。
Content-Length(主体长度),Content-Type(主体类型)等。
–主体(请求体)
包含数据的主体部分

分布图如下:

image-20220730235211055

请求行

在请求报文中,起始行包括了3个部分:

①是 请求方法 ,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。

②为请求对应的 URL地址 ,它和报文头的Host属性组成完整的请求URL。

③是 协议名称及版本号 。

请求方法
在本例中请求的方法是POST,http中请求方法比较常用的是 GET,POST,HEAD ,包括在内一共有八种请求方法。

1.OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
\2. HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
\3. GET
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
\4. POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5.PUT
向指定资源位置上传其最新内容
6.DELETE
请求服务器删除Request-URL所标识的资源
7.TRACR
回显服务器收到的请求,主要用于测试或诊断
8.CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

GET&&POST

GET和POST之间的区别

GET方法的数据参数是暴露在起始行的URL中的,而POST方法的数据参数是在报文主体中的。
GET方法因为数据参数是放在URL中,所以它的数据参数大小有一定的限制,而POST对数据大小是没有限制的;GET的传输效率更高,但相对来说没有POST安全。GET请求只能进行url编码,而POST支持多种编码方式。GET只接受ASCII字符参数的数据类型,而POST没有限制。

GET,POST都是向服务器传数据。

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),两次包的TCP在验证数据包完整性上,有非常大的优点,不过并非所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

GET/POST建立连接过程

post和get本质也是基于TCP/IP的,两种方式也是通过 三次握手的过程 建立连接。

GET
1.浏览器请求tcp连接(第一次握手)
2.服务器答应进行tcp连接(第二次握手)
3. 浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
-----服务器返回200 OK响应

POST
1.浏览器请求tcp连接(第一次握手)

2.服务器答应进行tcp连接(第二次握手)

3. 浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)

-----服务器返回100 Continue响应

4. 浏览器发送数据

------服务器返回200 OK响应

请求头

④是HTTP的报文头,报文头包含若干个属性,格式为“ 属性名:属性值 ”,服务端据此获取客户端的信息。

与缓存相关的规则信息,均包含在header中

以下只列出部分请求报文头部信息:

Referer(参考页、引用页):提供了当前抓包请求页面的URL
Accept:告诉服务器能够发送哪些媒体类型,Accept属性的值可以为一个或多个MIME类型的值(描述消息内容类型的因特网标准, 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据)

Accept:text/plain   

Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码方式

Accept-Encoding: gzip, deflate  

Accept-Language:告诉服务器能够发送哪些语言

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6  

Cookie:客户端用它向服务器传送cookie数据值
Cookie2:用来说明请求端支持的cookie版本​

User-Agent:将发起请求的应用程序的名称告知服务器;User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答;

User-Agent通常格式:

User-Agent: Mozilla/5.0 (平台) 引擎版本 浏览器版本号  

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0

origin:请求首部字段 Origin 指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。该首部用于 CORS 请求或者 POST 请求。除了不包含路径信息,该字段与 Referer 首部字段相似。

1、只有跨域请求,或者同域时发送post请求,才会携带origin请求头,而referer不论何种情况下,只要浏览器能获取到请求源都会携带,除了上面提到的几种情况。

2、如果浏览器不能获取请求源,那么origin满足上面情况也会携带,不过其值为null

Client-IP:提供了运行客户端的机器的IP地址
From:提供了客户端用户的E-mail地址
Host:给出了接收请求的服务器的主机名和端口号

Cache-Control:对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的

TE:告诉服务器可以使用那些扩展传输编码
Expect:允许客户端列出某请求所要求的服务器行为
Range:如果服务器支持范围请求,就请求资源的指定范围

UA-Color:提供了与客户端显示器的显示颜色有关的信息
UA-CPU:给出了客户端CPU的类型或制造商
UA-OS:给出了运行在客户端机器上的操作系统名称及版本

cookie&session&token

cookie和session是一种 追踪 \**客户端\**\**服务器端\**通信的一种方式。

cookie是通过在客户端记录信息确定用户身份的,而session则通过在服务器端记录信息确定用户身份。

背景:http链接是无状态链接,每次客户端访问服务端,服务端都不会知道访问者是谁,这样使得http设计简单,但每次关闭浏览器后用户又要重新登录。为了实现记录用户访问,当用户第一次访问服务器时,在服务器生成一个记录并返回给客户,客户下次再访问时,将上次的记录一并传递到服务器中,这样就实现了会话追踪。

cookie:在客户端请求服务器时,如果服务器需要记录该用户状态就生成一个cookie返回发给客户端的,有客户端浏览器保存cookie,当浏览器再请求该网站时,浏览器把请求的网址和请求头里的cookie一同提交给服务器 标明自己用户身份和状态。cookie以一段 存储在浏览器中 的文本存在(但服务器中没有保存,所以不够安全),

cookie的主要属性包括:名字,值,过期时间,路径和域:
路径与域 : 构成cookie的作用范围。
过期时间 :对于会话cookie,如果不设置过期时间,表示这个cookie的生命期为浏览器的会话 期间,关闭浏览器窗口, cookie就消失了,会话cookie一般保存在内存里。对于持久cookie,设置了过期时间,浏览器会把cookie保存在硬盘上,存储在硬盘上的cookie会在不同的浏览器进程间共享。
名字 :就是给cookie起一个名字。
值 :cookie中记录的信息内容。

session : 避免浏览器中可能伪造cookie的不安全,所以 生成并存储 在服务器端的值, 当用户第一次访问服务器时,session在服务器中生成记录并保存,然后将这个记录通过cookie返回给浏览器,浏览器下次访问时带上cookie,服务器再通过session验证传过来的cookie是否正确。session在用户第一次访问服务器的时候自动创建。session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,超时未更新会失效。

sessionid: HTTP协议是无状态的,session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为SESSIONID的cookie,它的值为该Session的id。Session依据该cookie来识别是否为同一用户。用户第一次访问会产生一个记录,sessionId保存在session中。

总结一下上面的过程:

  1. 用户使用账号密码登录
  2. 服务端验证账号密码是否正确,若正确生成sessionId并以cookie的形式返回给前台
  3. 浏览器保存cookie,并在下次访问自动带上cookie
  4. 服务器在session中匹配前台传过来的cookie,有则不用再登录,否则提示未登录

上面的过程中,有一个弊端就是每一个用户连接都会在服务器端中产生一个sessionId,当用户很多时会导致服务器压力很大,另外当服务器有多台时还有考虑sessionid在这些服务器之间共享;为了解决这些问题

就有了: token (令牌)

当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

token不保存在session中,服务端在生成token时,加入少量的用户信息,比如用户的id,我们对数据使用算法加密生成签名添加到token中(加密的密钥只有自己知道)传递给客户端,客户端下次访问时带上token,服务器端通过密钥解析token生成签名,比较两次签名是否相同,若不相同则验证失败

简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。

image-20220730235253344

基于token机制的身份认证

使用token机制的身份验证方法,在服务器端不需要存储用户的登录记录。大概的流程:

\1. 客户端使用用户名和密码请求登录。
\2. 服务端收到请求,验证用户名和密码。
\3. 验证成功后,服务端会生成一个token,然后把这个token发送给客户端。
\4. 客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。
\5. 客户端每次向服务端发送请求的时候都需要带上服务端发给的token。
\6. 服务端收到请求,然后去验证客户端请求里面带着token,如果验证成功,就向客户端返回请求的数据。

a.用设备mac地址作为token: 客户端和服务端统一了唯一的标识,并且保证每一个设备拥有唯一的标识。缺点是服务器端需要保存mac地址;优点是客户端无需重新登录,只要登录一次以后一直可以使用

b.用sessionid作为token: 此方式的优点是方便,不用存储数据,缺点就是当session过期时,客户端必须重新登录才能请求数据。

应答报文

应答报文结构

响应报文也由三部分组成(响应行+响应头+响应体)

image-20220730235331216

响应行:

①报文协议及版本;
②状态码及状态描述;

响应头:

③响应报文头,也是由多个属性组成;

响应体:

④响应报文体,即我们真正要的“干货”

响应行

应答报文的响应行也包含了3个部分

协议类型及版本号
状态码
状态码的文字描述

状态码
在http协议中,状态码被分为了5大类

100~199(信息性状态码)
200~299(成功状态码)
300~399(重定向状态码)
400~499(客户端错误状态码)
500~599(服务器端错误状态码)

响应头

响应报文首部提供的额外信息:

Age:(从最初创建开始)响应持续时间
Public:服务器为其资源支持的请求方法列表
Retry-After:如果资源不可用的话,在此日期或时间重试
Server:服务器应用程序软件的名称和版本
Title:对HTML文档来说,就是HTML文档的源端给出的标题
Warning:比原因短语更详细一些的警告报文
Accept-Ranges:对此资源来说,服务器可接受的范围类型
Vary:服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端
Proxy-Authenticate:来自代理的对客户端的质询列表

LEANOTE_SESSION:
Set-Cookie:在客户端设置数据,以便服务器对客户端进行标识
Set-Cookie2:与Set-Cookie类似
WWW-Authenticate:来自服务器的对客户端的质询列表

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/NZXHJ/article/details/126079608
今日推荐