HTTP协议详解
1、HTTP协议
HTTP:超文本传输协议,用以在网络上传输包括文本、图片等超文本数据的协议和规范。是我们最常使用的最常接触的协议之一,在我们浏览网站,学习Web开发的时候,总会使用到这个协议。
2、HTTP和HTTPS
HTTP使用的协议是明文传输,很容易被黑客或者恶意窃取数据,HTTPS则比HTTP多出了SSL,用以进行传输加密和身份认证,保证了传输数据的安全性,我们可以这么理解,HTTPS=HTTP+SSL。
HTTP使用的默认端口是80,HTTPS默认端口是443
3、HTTP协议的调用过程
这里假设请求,http://www.mybaby.cn/pigpig/baby.index
4、HTTP报文解析
在上面第三点我们解析了HTTP协议的请求过程,接下来我们对其中出现的报文的一些数据进行解析
HTTP协议报文主要由三大部分组成:主要是
- 起始行(start line):描述请求或响应的基本信息
- 头部信息(header):使用key-value形式更详细的说明报文
- 消息正文(entity):实际传输的数据
在我们通常的开发中,start line 和header统称为header,我们常见的token用户认证就是在这里实现的。
4.1、HTTP请求方法
HTTP请求方法总共有八种,分别是:
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主题 |
DELETE | 删除文件 |
PUT | 传输文件 |
HEAD | 获得报文头部 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINK | 断开连接关系 |
这里我们最常使用到的是GET和POST方法,一般来说,GET和POST都可以请求到资源,但是它们之间是有区别的,如下表:
GET | poST | |
---|---|---|
url可见性 | 参数可见 | 参数不可见 |
数据传输 | 通过拼接url进行传递参数 | 通过body体传输参数 |
缓存性 | 可以进行缓存 | 不可以进行缓存 |
后退页面反应 | 后退页面时不产生影响 | 后退页面重新请求资源 |
传输数据 | 大小在2K-4K | 根据php.ini文件设定,可以无限大 |
安全性 | 安全性略低 | 安全性略高 |
数据包 | 产生一个数据包,HTTP会把header和data一起发送,服务器响应200 | 产生2个数据包,HTTP先发送header响应100continue,浏览器在发送data,服务器响应200(这里有一个特例,火狐只发送一次) |
4.2、响应状态码解析
2xx开头:响应成功
3xx开头:表示需要进行附加操作用以完成请求
4xx开头:客户端错误
5xx开头:服务端错误
状态码 | 描述 |
---|---|
200 | 请求成功 |
204 | 请求成功,但是没有资源可以返回 |
206 | 对资源莫一部分进行响应,由Content-Range指定范围的实习内容 |
301 | 永久性重定向,表示请求的资源已经重新分配URI,以后应该使用资源现有的URI |
302 | 临时性重定向,表示请求的资源已重新分配URI,希望本次使用新的URI |
303 | 表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源 |
304 | 表示客户端发送附带条件的请求时,服务端允许请求访问资源,但未满足条件的情况 |
307 | 临时重定向,与302相同 |
400 | 表示请求报文中存在语法错误 |
401 | 表示发送的请求需要HTTP认证的认证信息 |
403 | 表示请求访问资源被服务器拒绝了 |
404 | 表示服务器上无法找到请求的资源 |
500 | 表示服务器端在执行请求时发生错误 |
503 | 表示服务器暂时处于超负载或者正在停机维护,无法处理请求 |
5、Cookie、Session、Token的区别
这里简单给出定义,后续文章会给出更多的详细实现
Session是什么:在互联网Web初步兴起的时候,浏览器的作用仅仅只是文档浏览等,但随着各类购物,系统的出现,用户越来越多。但是计算机网络的http协议是无状态的,无法记录用户信息,此时就出现了SessionID。服务器给每一个用户发送一个特定的SessionID,用户在请求时将SessionID带上,这样就可以用来区分用户了。
Cookie是什么:Cookie是浏览器实现的用于保存用户数据的功能,我的理解是如同谷歌等浏览器保存我们进入某个网站的密码等,同时浏览器提供了功能为我们的Cookie数据进行了加密,保证不会泄露。
在之前的开发中,使用的都是Cookie+Session的认证方式,即用户初次登录时,在服务器端生成SessionID,并且将其返回给客户端,客户端的浏览器将其保存到Cookie中,在之后的访问中将Cookie中的数据加入到Http请求头中发送给服务器端验证,服务器端将发送来的认证信息和自身保存的SessionID进行比对,从而判断是否时合法的请求。
这样就造成了一些问题:
1、Cookie很容易被截获,容易遭受到跨站伪造请求攻击(CSRF)。具体可以看一下
2、服务器端需要保存每个用户的SessionID,当用户量很多时,例如几个亿或者几十个亿的用户ID,就造成了很大的内存开销。同时由于Session可能保存在不同服务器之间,在比对时就出现查找不到的问题。这是不能让用户接受的。这也造成了开发分布式服务器端的困难性,难以拓展。
随后的发展中,就诞生了Token,Token让客户端来保存数据。Token由服务器端生成并发送,但数据保存在客户端中。Token需要解码,需要使用CPU资源,即使用CPU资源换取内存资源,同时,这样子就解决了上述的跨域、难拓展的问题。
en,Token让客户端来保存数据。Token由服务器端生成并发送,但数据保存在客户端中。Token需要解码,需要使用CPU资源,即使用CPU资源换取内存资源,同时,这样子就解决了上述的跨域、难拓展的问题。
Token具体实现:客户端首次登录,服务端进行验证,并且生成Token,返回给客户端,客户端保存Token,并且每次请求中都会带上Token,服务端验证Token后则返回数据给客户端。