很早就被推荐这本书了,但是一直没看,后来发现才200多页,于是下定决心花几天时间看完,同时做备忘。
http不难,难的是要主动去学习
本书讲的是HTTP/1.1
该版本具有的方法有如下
方法 | 说明 | 支持的http版本 | 个人注释 |
GET | 获取资源 | 1.0 1.1 | 客户端想要服务器的数据请求 |
POST | 传输实体主体 | 1.0 1.1 | 客户端向服务器发送数据 |
PUT | 传输文件 | 1.0 1.1 | 客户端向服务器发送文件 |
HEAD | 获得报文首部 | 1.0 1.1 | 客户端想要服务器的首部信息,即通信状态 |
DELETE | 删除文件 | 1.0 1.1 | 客户端想要删除某个文件 |
OPTIONS | 询问支持的方法 | 1.1 | 客户端询问服务器支持哪些方法 |
TRACE | 追踪路径 | 1.1 | 询问客户端到服务器的路径信息,是否有代理之类的 |
CONNECT | 要求用隧道协议连接代理 | 1.1 | 要求用隧道进行连接 |
LINK | 建立和资源之间的联系 | 1.0 | |
UNLINE | 断开连接关系 | 1.0 |
HTTP报文由报文首部,报文主体组成,用空行隔开(CR+LF),报文主体不是必须的
HTTP状态码,一共有60多种,只介绍重要的14种
首先将其分类
1XX | 信息性,接收到的请求正在处理 |
2XX | 成功,请求正常处理完毕 |
3XX | 重定向,相应进行附加操作才能完成,比如说信息在其他位置 |
4XX | 客户端错误,客户端发送的请求有问题,服务器不知道怎么去处理,比如说语法错了 |
5XX | 服务器错误,客户端发来的请求没问题,但是服务器提交处理时出错了,比如说服务器内部出bug了 |
200 OK | 请求正常处理完成, 如果是GET请求,会带上实体,如果是HEAD请求,则没有实体(因为不需要) |
204 No content | 请求正常处理完成,但是相应报文中没有实体,且不允许返回实体。用于确认收到客户端的数据用 |
206 Partial Content | 请求正常处理完成,且客户端进行了范围请求,即要了指定范围的数据Content-Range指定了范围 |
301 Moved Permanently | 请求的资源被永久分配到其他URI了,例如忘记加/,可以根据Location提示进行重新保存 |
302 Found | 请求的资源临时分配到其他URI了,这一次用新URI访问 |
303 See Other | 请求的资源临时分配到其他URI了,同时要求其用GET进行获取 |
304 Not Modified | 客户端发送请求但附带了条件,而服务器允许访问,但条件未满足,条件是If-Match,If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since中任意一个 |
307 Temporary Redirect | 客户端发送post请求返回307时,浏览器询问用户是否再次post |
400 Bad Requeset | 客户端发送的报文有语法错误 |
401 Unauthorized | 发送的请求需要通过HTTP认证,或者认证失败了,初次收到会弹出认证窗口 |
403 Forbidden | 请求的资源拒绝访问 |
404 Not Found | 服务器没有请求的资源 |
500 Internal Server Error | 执行请求时发生错误,是服务器存在的问题 |
503 Service Unavailable | 服务器暂时处于超负荷或正在停机维护 |
通信转发程序
代理 网关 隧道
客户端是请求报文,服务器是响应报文
请求报文首部, 请求首部字段,通用首部字段,实体首部字段统称首部字段
首部字段提供报文主体大小,所使用的语言,认证信息等
首部字段由首部字段名和字段值组成,用冒号:隔开,
例如Content-Type:text/html 或者 Keep-Alive:timeout=15,max=100
请求行 | 方法 URI http版本, 客户端想要做什么,找谁,版本是什么? |
请求首部字段 | 补充请求的附加内容,客户端信息,相应内容相关优先级等 |
通用首部字段 | 请求和响应都会用到的首部 |
实体首部字段 | 补充资源内容更新时间等实体相关的信息 |
其他 |
相应报文首部
状态行 | |
响应首部字段 | 从服务器段向客户端返回响应报文时使用,补充响应的附加内容,或要求客户端附加内容 |
通用首部字段 | 请求和响应都会用到的首部 |
实体首部字段 | 补充资源内容更新时间等实体相关的信息 |
其他 |
详细的各个首部字段的内容
略
HTTP的缺点
通信使用明文,内容会被窃听
不验证身份,可能遭遇伪装
无法证明报文完整,可能篡改
可以通过SSL或TLS的组合使用,加密HTTP的通信内容。
与SSL组合使用的HTTP就是HTTTPS
内容的加密,对http协议内部传输的内容进行假名
HTTP+加密+认证+完整性保护=HTTPS
http采用共享密钥加密和公开密钥加密两者并用的混合加密机制
1,首先使用公开密钥加密方式安全地交换 之后要用的共享密钥加密中要用的密钥
2,交换了共享密钥后,使用贡献密钥加密方式进行通信
但还是存在问题。在第一步时,需要证明收到的公开密钥就是原本服务器发行的公开密钥。这是引入由数字证书认证机构CA和其相关机关颁发的公开密钥证书。
1,首先服务器向数字证书认证机构提出公开密钥的申请。
2,数字证书认证机构在判明提出申请者的身份之后,对已申请的公开密钥做数字签名,分配已签名的公开密钥,并将这个公开密钥放入公钥证书后绑定。
3,服务器将数字证书认证机构颁发的公钥证书发给客户端。已进行公开密钥加密方式通信,公钥证书(数字证书,证书)
4,客户端接收到证书,利用数字证书认证机构的公开密钥,对证书的数字签名进行验证,验证通过。
说明认证服务器的公开密钥是真实的,公开密钥是值得信赖的。
在上述过程中,认证机关的公开密钥必须安全转交给客户端,所有浏览器会先在内部存好常用的认证机关的公开密钥。
HTTPs安全通信流程
1,客户端发送Client Hello报文开始SSL通信,报文中包含客户端支持的SSL的版本,加密组件(Cipher Suite)列表(加密算法,密钥长度等)
2,服务器,以Server Hello报文作为回应,报文中包含了SLL版本以及加密组件,就是根据客户端的内容选出来的
3,服务器发送Certificat报文,报文中包含公开密钥证书
4,服务器发送Server Hello Done报文通知客户端,最初阶段的SSL保守协商部分结束。
5,客户端以Client Key Exchange报文作为回应。报文中包含通信要用的随机密码串Pre-mastersecret,这个报文是用步骤3中的公开密钥加密过的。
6,客户端发送是Change Cipher Spec报文。报文提示服务器,这个报文之后会采用Pre-Master secret密钥加密
7,客户端发送Finished报文,该报文包含连接至今全部报文的整体校验值。
8,服务器同样发送Change Cipher Spec报文
9,服务器同样发送Finished报文。
10,客户端服务器都发了Finished报文,SLL连接建立了。接着就是客户端发送HTTP请求了
11,服务器发送HTTP响应
12,由客户端发送断开连接,发送close_notify报文。之后就是tcp fin关闭tcp连接
在以上流程中,应用层发送数据时会附带MAC报文摘要,差知报文是否被篡改。
HTTPS比HTTP慢2-100倍。
认值机制
http/1.1使用的认证方式
BASIC认证-基本认证
DIGEST认证-摘要认证
SSL客户端认证
FormBase认证-基于表单认证
BASIC认证
1,当请求的资源需要BASIC认证时,服务器会随状态码401返回带WWW-Authenticate首部字段的响应。
2,客户端接收到后,将用户id和密码发送给服务器,以冒号隔开,经过Base64编码处理,写入首部字段Authorization
3,服务器接受到首部字段Authorization请求后,验证通过,返回包含Request_URI资源的响应
DIGEST认证
采用质询响应方式进行认证。
一方发送认证要求给另一个方,使用从另一方接收到的咨询码计算生成响应码,
将响应码返回,进行认证
过程如下
1,客户端发送请求,服务器接受到后,发送临时咨询码,状态码401
2,客户端发送摘要以及由咨询码计算出来的响应码
3,认证成功后,返回状态码200,失败则401.
SSL客户端认证
要iu去客户端安装证书。
1,接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
2,用户选择将发送的客户端证书后,会把客户端证书信息以Client Certificate报文形式放个服务器
3,服务器验证客户端证书,领取证书内容的公开密钥,开始https加密通信。
注,在多数情况下SLL客户端认证会与基于表单认证组合形成双因素认证。
即用SSL认证客户端计算机,表单认证缺点用户本人行为。
表单认证
基于表单认证的规范尚未统一,一般使用Cookie来管理Session。
1,客户端把用户di和密码放入报文实体,以post方式发送给服务器,会使用https
2,服务器会发放用来识别用户的sessiong id,通过验证从客户端发送来的登录信息认证,把用户的认证状态与session id绑定
3,客户端接收到服务器发来的session id后,将其作为cookie存入本地,下次发送数据给服务器,将会带上session id。
WebSocket协议
web服务器和客户端建立websocket协议的通信连接之后,所有的通信都依靠这个专用协议来通信,
可以互相发送json,xml,html或图片等任意格式的数据。
特点:
1,推送功能
支持由服务器向客户端推送数据的推送功能,服务器可直接发送数据,而不必等待客户端的请求。
2,减少通信量
建立起websocket连接后,就一直保存连接状态。
为了实现websocket通信,需要用到http的upgrade首部字段,告知服务器通信协议改变,达到握手
成功握手确立WebSocket连接后,采用WebSocket独立的数据帧通信。
HTTP/2.0
2014年实现标准化
http2.0的目的是改善用户使用web时的速度体验,其围绕7项技术进行讨论,但后续可能会改变
压缩 | SPDY,Friendly |
多路复用 | SPDY |
TLS义务化 | Speed+Mobility |
协商 | Speed+Mobility, Friendly |
客户端拉拽(Client Pull)/服务器推送(Server Push) | Speed+Mobility |
流量控制 | SPDY |
WebSocket | Speed+Mobility |
HTTP speed + Mobility由微软起草的标准,建立在谷歌提出的SPDY与WebSocket的基础上。
Network-Frendly HTTP Upgrade主要是在移动端通信改善性能。
Web服务器管理文件的WebDAV
略
构建Web内容的技术
web使用各种技术,来呈现丰富的内容。
1,HTML超文本标记语言
web页面是由html写成的,经过浏览器解析构成网页
html版本尚未统一
2,CSS层叠样式表
指定html内各个原始
3,动态html
利用javascript实现动态改造,利用DOM可指定欲发生动态变化的html元素
dom是用以操作html文档和xml文档的api。
4,web应用
5,与web服务器及程序协作的cgi
cgi通用网关接口是指web服务器在接收到客户端发送过来的请求后转发给程序的一组机制。
使用cgi的程序叫做cgi程序,通常是用perl,php,ruby,c等编程语言实现。
6,servlet
能在服务器上创建动态内容的程序,是用java实现的接口。
7,可扩展标记语言xml
8,javascript衍生的轻量级应用json
json是一种以javascript的对象表示法为基础的轻量级数据标记语言,
Web的攻击技术
http协议本身没问题,大多数攻击冲着web站点来的
1,http不具备必要的安全功能
目前的web网站都会使用会话管理,而http不具备安全,加密的功能,因此开发协议自行设计管理会话的web应用,会存在很多bug。
2,客户端篡改请求
在http请求报文内加载攻击代码,就能发起对web应用的攻击,
通过url查询字段或表单,HTTP首部,cookie等途径把攻击代码传入,若web应用存在安全漏洞,那内部信息就会遭到窃取,或被攻击者拿到管理权限。
3,针对web应用的攻击模式有两种
主动攻击,通过直接访问web应用,把攻击代码传入的攻击模式。
SQL注入,OS命令注入
被动攻击,利用圈套策略执行攻击代码,攻击者不直接对目标web应用访问发起攻击
1,感觉真诱使用户触发已设置好的陷阱,陷阱会启动发送已嵌入攻击代码的http请求
2,当用户不知不觉中招之后,用户的浏览器或邮件客户端就会出发这个陷阱。
3,中招后的用户浏览器会把含有攻击代码的http请求发送给作为攻击目标的web应用,运行攻击代码
4,执行完攻击代码,存在安全漏洞的web应用会成为攻击者的跳板,可能导致用户所持有的cookie等个人信息被窃取,用户权限遭恶意滥用。
跨站脚本攻击XSS 跨站点请求伪造CSRF
Dos攻击
让运行中的服务器呈停止状态的攻击,右视也叫做服务器停止攻击或拒绝服务攻击。
集中利用访问请求,造成资源过载
通过攻击安全漏洞使服务停止。