1.HTTP协议是一种应用层的传输协议,用于客户端和服务器之间的通信
2.HTTP协议处于TCP/IP模型中的应用层,基于TCP传输协议,常用端口80
3.当使用TLS加密TCP的载荷(即HTTP内容)时,这个就是目前常见的HTTPS,常用端口443
协议栈结构如下
4.HTTP传输的资源:网络上一切内容即资源,包括:html css js 图片 视频等
5.HTTP协议版本历史:
6.WEB上常见组件:
7.HTTP特性:
URL(统一资源定位符)是URI(统一资源标识符)的一个子集,结构如下:
协议protocol: 表示当前使用的协议,如HTTP,HTTPS,FTP,WS(websocket)
主机host:表示server主机在网络上的地址,可以是ip或者域名
端口post:表示服务进程使用或监听的端口(传输层),一般http使用80端口,https使用443端口
资源路径path:网络资源在服务器中的指定路径
查询query:由?表示查询,后面跟键值对参数,每个参数由&隔开
片段fragment:指定到达网页中不同的片段位置,类似书签,不会与请求一起发送到服务器
HTTP报文主要分为请求报文与响应报文,结构如下
请求报文
响应报文
报文的第一行就是起始行,在请求报文中表示要做什么,在响应报文中表示出现了什么情况
1.请求行
请求方法
GET:GET方法用于获取服务器的资源数据.
HEAD:HEAD方法请求一个与GET请求的响应相同的响应,但没有响应主体.
POST:POST方法用于向服务器端发送数据
PUT:PUT方法用于向服务器端修改、插入数据
DELETE:DELETE方法删除指定的资源。
CONNECT:CONNECT方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS:OPTIONS方法用于请求服务器告知其支持什么功能
TRACE:TRACE方法沿着到目标资源的路径执行一个消息环回测试。
PATCH:PATCH方法用于对资源应用部分修改。
2.状态行
状态码主要分为5大类:
100-199 信息性状态码
200-299 成功状态码
300-399 重定向状态码
400-499 客户端错误状态码
500-599 服务端错误状态码
常见的有:
100 Continue :这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
101 Switching Protocol :该代码是响应客户端的 Upgrade 标头发送的,并且指示服务器也正在切换的协议,如websocket。
200 OK:请求成功,实体的主体部分包含了所请求的资源
204 Not Content :正常响应,没有实体
206 Partial Content :范围请求,返回部分数据,响应报文中由Content-Range指定实体内容
301 Moved Permanently: 永久重定向,被请求的资源已永久移动到新位置
302 Found: 临时重定向,请求的资源现在临时从不同的 URI 响应请求
303 See Other:和302类似,但必须用GET方法
304 Not Modified:状态未改变, 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307 Temporary Redirect:临时重定向,不该改变请求方法
400 Bad Request: 请求报文语法错误
401 unauthorized :需要用户认证
403 Forbidden:服务器拒绝访问对应的资源
404 Not Found: 服务器上无法找到资源
500 Internal Server Error:服务器遇到了不知道如何处理的情况
503 Service Unavailable:服务器处于超负载或正在停机维护
原因短语就是给人看的简单解释语句
通用首部指的是请求报文与响应报文都会使用的首部
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐挑首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求首部是客户端往服务端发送请求报文中使用的首部字段,用于补充请求的附加信息,客户端信息,对响应内容相关的优先级信息等
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与 If-Macth 相反) |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与 If-Modified-Since 相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中 URI 的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
响应首部就是服务端向客户端返回响应报文中使用的字段,用于补充响应的附加信息,服务器信息,以及对客户端的一些要求等
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定 URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP 服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段是包含在请求报文与响应报文中实体部分使用的首部,用于补充实体相关信息
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的 HTTP 方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
由于HTTP的内容在网络上实际是明文传输,并且也没有身份验证之类的安全措施,所以容易遭到挟持与攻击
HTTPS是通过SSL(安全套接层)和TLS(安全传输协议)的组合使用,加密TCP载荷即HTTP报文内容,同时通过不对称密钥方式认证身份,保证传输的安全可靠
即:HTTP+加密+认证+完整性保护=HTTPS
HTTPS在进行传输HTTP报文数据前,需要经过TLS握手,完成加密,大致流程如下:
详细过程可以参考另一篇文章:https://www.cnblogs.com/fengf233/p/11775415.html
首先HTTP是无状态,即这一次请求跟上一次请求是没有关联的,虽然这种无状态行为能减小服务器压力,但是在某些需要保持用户登录或者保持上下文的情况(如网站购物等,如果没有保持状态服务器就不知道谁买的)就会很不方便,所以创建了一种session机制,用来保持状态。
主要方法就是客户端向服务器端请求后,服务端生成session,并向客户端发送一个session标识,此标识指向服务端保存的session。之后,客户端再次请求的时候,就会带上此session标识,服务端识别后,就会指向上次保存的session,以此实现保持状态的会话。
即:
session保存在服务端(数据库,内存等),其包含上下文,登录信息,用户信息等;session标识类似于数据库的键,指向对应session。
session机制可以通过cookie实现,也可以通过URL参数实现,目前主要是通过cookie实现
HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
Cookie主要用于以下三个方面:
cookie的属性主要有:
domain : cookie的域
allh : 那些主机可以使用此cookie
path :那些路径能使用cookie
secure : 是否在发送https报文的时候使用cookie
expires : 过期时间
name : cookie的名字
value : cookie的值
cookie的使用原理:
用户第一次请求服务器时,服务器返回一个带Set-Cookie(Set-Cookie1)首部的报文,值为键值对,描述了cookie的名字、值、域、路径等信息,然后客户端接下来每次访问服务器的时候都会带上一个Cookie首部的报文,它的值刚好是前面响应报文返回的名字键值对,从而达到验证用户身份的信息。
cookie和session:
从上面可以看出管理session只是cookie的一个作用,只需要在Set-Cookie时设置sessionID(session标志)即可。
使用session管理登录信息的时候,上面说过,服务端会根据用户cookie中所带的sessionID去"查询"保存在服务端本地的对应session,来保持登录状态。但是,当用户量非常大的时候,频繁的"查询"(一般是查询保存session的数据库)操作会消耗大量资源。所以出现了一种令牌机制,就是Token
Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
Token与session不同的是:
Token组成:
Token存放:token在客户端一般存放于localStorage,cookie,或sessionStorage中。
Token验证的过程:
1.跨站脚本攻击
跨站脚本攻击(Cross-Site Scripting, XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或者 JavaScript 代码的一种攻击方式。动态创建的 HTML 可能存在安全漏洞。
该攻击可能造成以下影响:
2.SQL 注入攻击
SQL 注入(SQL Injection)是指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。该安全隐患有可能引发极大的安全威胁,有时会直接导致个人信息及机密信息的泄露。
SQL 注入可能会导致如下影响:
3.会话劫持
会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。
具备认证功能的 Web 应用,使用会话 ID 的会话管理机制,作为管理认证状态的主流方式。会话 ID 中记录客户端的 Cookie 等信息,服务器端将会话 ID 与认证状态进行一对一匹配管理。
攻击者可能通过以下方式获得会话 ID:
通常情况下攻击者在发现网站存在的 XSS 攻击漏洞之后,会注入一段 JavaScript 代码,通过document.cookie盗取到会话 ID,之后植入到自己的浏览器,就可以伪装成被盗窃的用户访问被攻击的网站。
4.跨站点请求伪造
跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
跨站点请求伪造可能会造成以下影响:
5.DoS 攻击
DoS 攻击(Denial of Service Attack)是一种让运行中的服务呈停止状态的攻击。有时也叫作停止服务攻击或者拒绝服务攻击。DoS 攻击的对象不仅限于 Web 网站,还包括网络设备及服务器等。
DoS 主要有以下两种攻击方式:
HTTP的内容很多很杂,涉及的安全内容也非常多,但作为现今互联网的载体,基本是必懂的基础,这里记录了一些来源于书上网上以及自己的总结
参考:
1.《图解HTTP》
2.《HTTP权威指南》
原文:https://www.cnblogs.com/fengf233/p/10980034.html