了解web和网络基础
- 使用http协议访问web
---根据web浏览器地址栏中指定的url,web浏览器从web服务器获取文件资源等信息,从而显示出web页面。
---像这种发送请求获取服务器资源的,例如浏览器,都可以称为客户端,可以说web是建立在http协议上通信的。
- 网络基础TCP/IP
---通常使用的网络,是在tcp/ip协议族的基础上运行的,包括互联网,而http协议只是整个协议族的子集。
- TCP/IP协议族
---tcp/ip是互联网相关协议的总称
- TCP/IP的分层管理
---按协议族进行分层可以分为四层:应用层,传输层,网络层,数据链路层。
优点:各层之间互不影响,每层协议的变动只需要修改对应层即可,其次设计也更为简单,各个层的任务分工更为简单,比如应用层只需要考虑分配给自己的任务,不需要考虑谁传输的,传输线路等等等~
---应用层
应用层向用户提供应用服务时的通信活动,比如ftp,dns,http。
---传输层
传输层提供两台相互连接的计算机的数据传输,传输层有TCP协议和UDP协议
---网络层
网络层用来处理网络上流动的数据包,数据包是网络传输的最小数据单元。
该层计算了以怎样的路径的到达对方的计算机,并把数据包传给对方。
---链路层
用来处理链接网络的硬件部分,例如网卡,光纤之类物理可见的都属于链路层的作用范畴。
- 与http密切相关的三个协议:ip/tcp/dns
---负责传输的ip协议
ip协议位于网络层,几乎所有的系统网络都会用到ip协议。
ip协议的主要作用就是将数据包传送给对方,其中mac地址和ip地址是重要条件,IP地址指明了节点被分配的地址,mac地址指向所致网卡的所属的固定地址。
---使用ARP协议凭借mac地址进行通信
在网络中,通信双方在同一局域网内的情况是很少的,通常是多台计算机和网络设备中转才能链接到对方,而在中转是通常需要下一站的中转设备进行中转才能连接到对方。这个时候就需要用到ARP协议,ARP是一种地址解析协议,可以根据通信方的ip地址反查到mac地址。
---确保可靠的TCP协议
TCP协议位于传输层,提供可靠的字节流服务,所谓的字节流服务就是将大块的数据分割成以报文段为单位的数据包进行管理,准确是TCP协议采用三次握手策略, 保证数据准确无误送达目标处。
---三次握手
发送端首先发送一个带SYN的标志的数据包给对方,接收端接收之后,回传一个带有SYN/ACK标志的数据包以确认信息,最后回传一个ACK标志的数据包,代表握手结束。(若握手期间某个阶段断开,TCP协议会在以相同的顺序发送相同的数据包)
---负责域名解析的DNS协议
DNS位于应用层的协议,负责解析域名到ip地址之间提供服务。
简单的http协议
- http协议用于客户端和服务端之间的通信
---请求访问的文本或图像的等资源的一端称为客户端,而提供资源响应的一端称为服务端。
- 通过请求和响应的交换达成通信
---http协议规定,请求从客户端发出,最后服务端响应该请求并返回,换句话说,肯定先是客户端开始建立通信,服务端在没有收到请求前不会发送响应。
---请求报文请求方法,URL,协议版本,首部和内容实体构成。
---返回会以响应的形式返回,即响应报文;响应报文由协议版本,状态码,以及状态码的解释,首部和实体构成。
- http协议是不保存状态的协议
---http协议不对请求响应之间的通信状态做任何保存,这样保证了http协议可以更快的处理大量事务。
但是随着web的发展,在跳转到其他页面,仍然需要保存当前页面的信息,这个后就有了cookie技术。
- 请求URI定位资源
---http协议使用URI定位资源,可以保证互联网上的任何资源都可以被访问到。
- 告知服务器意图的http方法
---Get: 获取资源
get方法用来请求访问已被URI识别的资源,指定的资源经过服务器端解析后返回响应内容,
---post:传输实体主体
---put:传输文件
put方法用来传输文件,就像ftp协议文件上传一样,要求请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
---Head:获得报文首部
Head方法和get方法一样,只是不返回报文的主体部分,用于确认URI的有效性以及资源更新的日期时间等。
---delete:删除文件
delete方法用于删除文件,是与put相反的方法,delete是按请求URI删除指定的资源。
---options:询问支持的方法
options方法用来询问针对对URI指定的资源支持的方法。
trace:追踪路径
trace方法是让web服务端将之前的请求通信环回给客户端的方法
connect:要求用隧道协议连接代理
connect方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要是用SSL和TLS协议把通信内容加密后经网络隧道传输
- 使用方法下达命令
---向请求URI指定的资源发送请求报文的时候,称为方法的命令。
方法的作用在于,可以指定请求的资源按期望产生某种行为,方法中有get,post,head等
- 持久连接节省通信量
---背景:在http协议的初代版本中,每进行一次http通信就要断开一次TCP连接。但是以多年前的通信量,都是一些小文本的传输,而现在传输所需也丰富起来,这就造成,每次要多次获取图片资源,导致增加无用的通信量。
为了解决上述问题,提出了持久连接的想法:即如果没有任何一端提出断开连接,那么久一直保持TCP连接。
---持久连接的好处在于,减少了TCP的建立连接,断开连接所造成的额外开销,减轻服务端的负载,同时在用户体验上,由于http协议能够更快的请求并完成响应,web的访问速度也变快。
- 管线化
----持久连接使得多数请求以管线化发送成为了可能,从前发送请求要等并接收到响应才能发送下一个请求。
管线化的作用就是同时并行的发送多个请求,而不需要一个接一个的等待响应了。
eg:同一个页面需要十张图片的web页面,相比持久连接,时间上更为简短。
- 使用cookie的状态管理
http协议是无状态协议,它不对之前发生过的请求和响应的状态进行管理。换句话说,它无法根据之前的状态进行本次的请求。
---这样就造成如果我们每次访问页面无法保存登录信息,那么我们每次访问都要登录一次,这样也就是无状态协议的缺点,但是无状态的优点可以减少cpu的内存资源损耗,当然正是因为http协议的本身比较简单,它才会被应用到各种场景中。
为了保留http无状态协议的特征,又要解决上述的矛盾,于是引入cookie技术。
cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
---cookie会根据服务端发送的响应报文内的一个set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端在往服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去。
---服务端接收到带有cookie的请求后,会检查是哪个客户端发来的,并对比服务端的记录,得到之前的状态信息。
请求报文(没有Cookie信息的状态):
响应报文(服务端生成Cookie信息):
请求报文(自动保存着Cookie信息):
http报文内的http信息
http通信包括从客户端发往服务端的请求以及服务端返回给客户端的响应。
- http报文
用于http协议交互的信息叫做http报文
---客户端(请求端)的报文叫做请求报文
---服务端(响应端)的报文叫做响应报文
http报文 = 报文首部 + 报文主体
- 请求报文以及响应报文的结构
---请求行:包含用于的请求方法,请求URI,http版本
---状态行:包含表明响应结果的状态码,原因短句合http版本
---首部字段:包含表示请求和响应的各个条件和属性的各类首部(通用首部,请求首部,响应首部,实体首部)
---其他:一些未定义的首部(比如Cookie等)
- 编码提升传输速率
http在传输数据时候可以直接按照数据原貌传输,也可以在传输过程中通过编码提升传输速率。(编码工作可以有效的处理大量的请求,但是编码需要计算机来完成,会消耗更多的cpu等资源)
报文主体和实体主体的差异
*报文:
是http通信的基本单位,由八位的组字节流组成,通过http通信传输。
*实体:
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
http报文主要用于传输请求或响应的实体主体
通常,报文主体等于实体主体,只有当传输过程中进行编码操作时,实体主体才会发生变化。
压缩传输的内容编码
内容编码的功能类似于我们在发送邮件时候将文件进行压缩的操作。
内容编码后的实体由客户端接收并负责解码。
常见的内容编码的几种格式:
gzip(gnu的zip)
comperss(unix系统的标准压缩)
deflate(zlib)
identity(不进行编码)
分割发送的分块传输编码
在http通信过程中,请求编码的实体资源未全部传输完成之前,浏览器无法显示请求页面,在传输大容量数据时,通过数据分割成多块,能够让浏览器逐步显示。这种把实体主体分割成块的功能称为分块传输编码
发送多种数据的多部分对象集合
发送邮件时我们可以添加各种类型的附件,同样的,http协议中也可以包含多种类型的实体
多部分对象集合包含的对象如下:
获取部分内容的范围请求
以前的网络并不像现在这么高速,有时候下载一个很大的文件或者是图片需要很长的时间,如果此时网络中断或者其他什么原因导致的中断,那就必须从头开始,为了可以从中断处恢复下载,就要指定一个需要下载的范围实体,那么这个请求就是范围请求。
执行范围请求时,会用到指定范围的range来指定资源byte的范围
内容协商返回最合适的内容
同一个web网站可能存在多份相同内容的页面,比如说英文版和中文版的内容相同,只是语言不同。
当浏览器的默认语言是中文或者是英文,访问相同的URI访问页面时,则会显示对应的中英文的web页面,这种机制称为内容协商。
内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最合适的资源。
报文中包含如下的请求字段为判断基准:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下三种类型:
服务器驱动协商
由服务端进行内容协商,以请求首部字段为参考,在服务端自动处理。
客户端驱动协商
由客户端进行内容协商的方式
透明协商
由客户端和服务端共同协商的一种方法
返回结果的http状态码
http状态码的职责:
客户端http请求的返回结果
标记服务端的处理是否正常
通知出现的错误
等。。。。
- 状态码告知从服务端返回的请求结果
状态码的主要作用就是当客户端向服务端发送请求时,借助状态码可以得知请求的状态。
状态码的类别:
首位数字代表响应类别,只要遵守这个分类的标准,状态码也可以在服务端自行定义.
- 2XX成功
2XX表示响应被正常处理了
200 OK
在响应报文中,和状态码一起返回的信息会因为方法的不同而发生改变。
比如get方法对应请求资源的实体会作为响应返回,而head方法只返回首部,不返回实体部分
204 No Content
该状态码表示服务端接收的请求已成功的处理,但是在返回响应的报文中没有实体部分,且不允许返回任何实体的主体。
比如,浏览器发送请求,服务端返回204响应,那么浏览器显示的页面不发生变化。
适用场景:一般适用于需要客户端往服务端发消息,而客户端不需要更新的情况。
206 Partial Content
该状态码表示客户端的范围请求,服务器成功执行这部分get请求。
响应报文中包含content-range 指定范围的实体内容。
- 3XX重定向
3XX响应表明浏览器需要执行某些特殊的处理才能正确处理该请求。
301 Moved Permanently
永久性重定向,该状态码表示请求的资源已被分配到新的URI,以后应该使用新的URI,也就是说,如果浏览器已经把对应的URI保存为书签,这个时候应该按Location的首部进行重新保存。
302 Found
临时重定向,该状态码表示请求的资源已被分配了新的URI,这个和301状态码类似,但302的状态码代表的资源不是被永久移动,只是临时性质的。
比如URI保存为书签,301会去更新书签,而302则不会。
303 See Other
该状态码表示由于请求对应资源存在另外一个URI,应该使用GET方法定向获取请求资源。
303和302的功能相同,只不过303指定要用get请求。
其实当301,302,303状态码返回时,几乎所有的浏览器都会把post改成get,并删除请求报文中的主体,之后请求会再次发送。
尽管301,302是禁止将post改为get
304 Not Modify
该状态码表示客户端发送附带请求(If-Match, If-ModifiedSince, If-None-Match, If-Range, If-Unmodified-Since)中的任意一个首部,服务端允许访问资源,但是未满足情况。
304状态码返回时,不包含任何响应主体的部分,304虽然是3xx系列的,但是和重定向没有任何关系。
307 Temporary Redirect
临时重定向,307与302类似,不会从post变为get。(其他的后续补充,现在我也不知道)
- 4XX 客户端错误
4XX响应表示客户端发生的错误是原因的所在。
400 Bad Request
该状态码表示请求报文中存在语法错误。
401 Unauthorized
403 Forbidden
该状态码表示请求的资源访问被服务器拒绝了(未获和访问的权限)
404 Not Found
该状态码表明服务器无法找到请求的资源,当然也可以在服务端拒绝之后不想给任何理由的时候使用
- 5XX 服务器错误
该状态码服务端在执行请求的时候发生错误,也有可能是web存在的bug或者是某些临时的故障。
503 Service Unavailable
该状态码表示服务器暂时处于超负载或者是正在停机维护,无法处理请求。
与http协作的web服务器
一台web服务器可以搭建多个独立域名的web网站,也可以作为通信路径上中转服务器用来提高传输效率
- 用单台虚拟主机实现多个域名
意思就是提供web托管服务的供应商,可以用一台服务器为多为用户服务,也可以每个客户 持有的域名运行在各自不同的网站。
这就是利用虚拟主机(虚拟服务器)的功能。
- 通信数据转发程序:代理、网关、隧道
在http通信时,除了客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关、隧道,用于配合服务器工作。
代理
是一种具有转发功能的应用程序,它扮演着服务器与客户端中间人的角色,接收由客户端发送的请求并转发给服务器,同时接收服务器返回的响应并转发给客户端。
代理服务器的基本行为就是接收客户端发送的请后转发给其他服务器,并且代理不改变请求的URI,会直接发送给对应资源的服务器。
如上图,每次通过代理服务器转发请求或响应,会追加写入Via的首部信息。
使用代理服务器的理由:
利用缓冲技术减少网络带宽的流量,组织内部针对特定网络的访问控制,以获取访问日志为主要目的等等。
代理的基本使用方法:
一是否使用缓存,另一个是否修改报文
缓存代理:
代理转发响应时,缓存代理会预先将资源副本(缓存)保存在代理服务器上。
当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
代理透明:
转发或者响应时,不对报文做任何加工处理的代理类型称为透明代理。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发来的请求时,它自身就像服务器那样处理这个请求。有时候客户端都察觉不到,自己通信的是一个网关。
网关和代理十分相似,而主要区别就是网关可以在通信线路上提供非http协议服务。
利用网关能提供通信的安全性,可以在客户端与网关之间的通信线路上加密以确保连接安全,例如网关可以连接数据库,可以进行数据库查询;再比如在web网站购物结算时,网关可以接银行卡的结算系统。
隧道
隧道是在客户端和服务器相隔甚远的客户端和服务器进行中转,并保持双方通信连接的方式。
隧道协议可按要求随时建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信,隧道的目的是确保客户端与服务器进行安全的通信。
同理,隧道不会解析http请求,对于客户端和服务端是透明的,请求会保持原样转给服务器。
- 保存资源的缓存
缓存是指代理服务器或客户端本次磁盘内保存的副本,利用缓存可减少对源服务器的访问,因此就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,当代理转发服务器返回的响应时,代理服务器会保存一份资源副本。
缓存的优先期限
缓存是有时效性的,即使缓存服务器有缓存,也不能保证每次对同资源的请求都能正常返回。
客户端的缓存
缓存不仅可以存放在服务端,也可以存放在客户端,以浏览器为例,客户端存储的称为临时网络文件。
网络临时文件的作用是,当浏览器中的缓存有效,那么就不需要向服务端请求相同的资源了,可以从本地磁盘内读取。
和服务端的缓存类似,客户端的缓存也会过期,所以同样会向服务端判断资源的有效性,如果无效则会重新申请。
http的首部
http协议中的请求报文和响应报文必定包含http的首部。
- http报文首部
http请求报文由方法,URI,http版本,http首部字段所构成。
http响应报文由http版本,状态码,http首部字段组成:
- http首部字段
http首部字段传递重要信息
首部字段传递一些额外的重要信息~
http首部字段结构
首部字段由首部字段名加字段值组成,中间用冒号分隔:
四种类型的http首部字段:
通用首部字段(请求报文和响应报文都会使用的首部)
请求首部字段(客户端向服务端发送请求时的首部,补充请求的附加内容)
响应首部字段(从服务端向客户端返回响应报文时的首部,补充响应的附加内容)
实体首部字段(针对请求报文和响应报文的实体部分使用的首部)
按缓存代理行为和非缓存代理行为分类:
端到端首部(End-to-end Header)
分在此类的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,且规定必须被转发。
逐跳首部(Hop-by-hop Header)
此类中的首部只对单次转发有效,会因通过缓存或代理而不在转发。如果使用hop-by-hop首部,需要提供connect首部字段。
- http通用首部字段
通用首部字段是指请求报文和响应报文都会使用的首部。
Cache-Control
通过指定的首部字段Cache-Control的指令,就能够操作缓存的工作机制。
缓存请求指令:
缓存响应指令:
Connection
connection首部字段具有两个作用:
-
控制不再转发给代理的首部字段
即Hop-by-hop首部 -
管理持久连接
当服务器明确想断开的时候,需要将Connection字段设置为close;反之如果想要保持持久连接,那么需要指定Connection字段为keep-alive。
Date
首部字段date表明创建http报文的时间和日期。
Trailer
作用是事先说明报文主体记录了哪些首部字段。
Transfer-Encoding
规定传输报文主体采用什么编码方式
Upgrade
用于检测http协议及其他协议是否可使用更高的版本进行通信。
Via
使用首部字段Via是为了追踪客户端和服务端之前的请求和响应报文的传输路径。
Warning
该首部通常会告诉用户一些与缓存相关的问题的警告。
- 请求首部字段
请求首部字段顾名思义就是客户端往服务端发送请求报文所使用的字段,用于补充请求的附件信息,客户端信息,对响应处理的优先级等。
Accept
accept字段能够通知服务器,用户能够处理的媒体类型以及相应的优先级。
其中优先级可以用q的权重来表示。
Accept-Charset
字符集及字符优先顺序,和Accept相同的是同样需要用q来表示权重。
Accept-Encoding
可一次指定多种格式的内容编码
Accept-language
向服务器提交能够处理的语言集,同样用q表示优先级的权重
Authorization
Authorization字段用来告知服务器用户代理的认证信息(证书值)
Expect
客户端使用Expect字段来告知服务器,期望得到某种特定的行为。
From
告知服务器使用用户代理的电子邮件地址。
Host
Host字段告知服务器请求资源所在的主机名和端口号。
If-Match
像这种if-xxx的形式的请求首部字段,都称为条件请求,当服务器接收到请求时,只要判断条件为真,就会执行请求。
If-Modified-Since
指定日期时间后发生的更新,服务器会接受请求。
If-None-Match
与If-Match作用相反,当与E-tag值不同的时候,则可以处理该请求。
If-Range
若告知服务器的时间或者是e-tag值的范围和请求资源的时间或e-tag值相同,那么则处理该请求,否则返回全体资源。
如果不使用If-Range发送请求的情况,服务端的资源如果更新,那么客户端持有的一部分也会随之失效,那么客户端就会再次发送请求,这样一来,与If-Range比起来,就需要花费两倍的时间。
If-Unmodified-Since
在指定时间日期之后请求资源未发生更新的情况下,才能请求处理。
Max-Forwards
这个首部字段的主要作用是在我们定位问题的时候,当客户端进行http通信时,经过多个代理服务器,但是如果中途某个代理服务器出现异常,客户端无法得到响应,我们也无法得知是哪个代理服务器出现的异常,这个时候使用该字段,可以准确判断是哪里出了问题。
Proxy-Authorization
告知服务器所需要的认证信息。
Range
只获取部分资源的请求范围。
Referer
用于告知服务器请求资源的URI,也就是浏览器直接输入的地址,但出于安全考虑,不应该发送首部字段。
TE
首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相应的优先级。和Accept-Encoding的功能很像,但是用于传输编码。
User-Agent
该首部字段会将创建请求的浏览器和用户代理名称等信息传给服务器。
- 响应首部字段
响应首部字段是由服务端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息,服务器信息等,以及对客户端的附加要求等。
Accept-Ranges
用来告知客户端服务器能够处理的请求范围,以获取服务端某部分资源。
Age
首部字段age能告诉客户端服务器多久前创建了响应,单位为秒。
Etag
将资源作为字符串作为唯一标识的方式,服务器会为每份资源分配E-tag值,当资源更新时,E-tag值也随之更新。
Location
使用首部字段location可以将响应收方引导至某个与请求URI位置不同的资源。
与3xx的状态码配合使用,提供重定向的URI。
Proxy-Authenticate
首部字段Proxy-Authenticate会将代理服务器的认证信息发送给客户端。
Retry-After
首部字段Retry-After告知客户端应该多久之后再次发送请求。
Server
首部字段server告知客户端当前服务器安装的http服务器应用程序的信息。
Vary
当代理服务器收到带有Vary首部字段指定获取资源的请求时,如果使用的accept-language的字段相同时,那么就直接从缓存返回响应,反之要从服务器获取资源后才能作为响应返回。
WWW-Authenticate
该字段用于HTTP访问认证,用于告知客户端适合访问的请求URI的认证方案等等。
- 实体首部字段
实体首部字段是包含请求报文和响应报文的实体部分所使用的首部,用于补充内容的更新时等与实体相关的信息。
Allow
用于通知客户端能够支持的http方法,当服务器接收到不支持的http方法时,会以405状态码返回,并且把支持的http方法写入首部字段allow返回。
Content-Encoding
告知客户端服务器对实体主体部分选用的内容编码方式,内容编码是指在不丢失实体信息的前提下所进行的压缩。
主要采用的是,gzip/compress/deflate/identity
Content-Language
告知客户端实体主体所使用的语言。
Content-length
表明实体主体的大小,单位是字节。
Content-Location
给出与报文主体部分相对应的URI,和首部字段的location不同,该报文主体返回资源对应的URI。
Content-MD5
该首部字段是由一串MD5算法生成的值,其目的在于检查报文主体在传输过程中是否完整,以确认传输到达。
Content-Range
针对范围请求,可以告知客户端作为响应返回的实体的哪个部分符合范围要求。字段值以字节为单位。
Content-Type
该首部字段说明实体主体内对象的媒体类型。
Expires
该首部字段会将资源失效的日期告知客户端。
Last-Modified
该字段指明资源最终的修改时间。
- 为Cookie服务的首部字段
Cookie的工作机制是用户识别及状态管理,web网站为了管理用户状态,会通过web浏览器将一些数据临时写进用户的计算机内,接着用户在访问该web网站时,可通过通信的方式取回之前发放的Cookie.
Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息。
expires属性
该字段指定浏览器可以发送Cookie的有效期。
如果不设置该字段,那么有效期仅限于浏览器的session之内,通常是浏览器被关闭之前。
Path属性
用于限定Cookie的发送范围的文件目录。
domain属性
指定的域名可做到与结尾匹配一致。
secure属性
用于限制web页面仅在https安全连接时,才可以发送Cookie。
HttpOnly属性
该属性可以使javascript脚本无法获得cookie,其主要目的是防止跨站脚本的攻击对cookie的窃取。
Cookie
首部字段Cookie会告知服务器,当客户端想要获取http的状态管理支持时,就会在请求中包含从服务器接收的Cookie,接收多个cookie,会以多个cookie形式发送。
- 其他首部字段
HTTP首部字段是可以自行扩展的,所以在web服务器和浏览器之间会出现各种非标准的首部字段。
X-Frame-Options
用于控制网站内容在其他web网站的Frame标签的显示问题,主要目的是防止点击劫持攻击。
Deny:拒绝
Sameorigin:仅同源域名下的页面
X-Xss-Protection
针对跨站脚本的攻击
DNT
do not track,拒绝个人信息被收集
P3P
p3p技术,可以让web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
确保web安全的HTTPS
在http协议中可能存在信息窃听或者身份伪装等安全问题,使用https通信机制可以有效的防止这些问题。
- HTTP的缺点
通信使用明文(不加密),内容可能会被窃听
由于http本身不带有加密的功能,所以无法做到对通信整体进行加密。
- TCP/IP可能是被窃听的网络
- 加密处理防止被窃听
一种方式是通信加密,http协议本身没有加密机制,但是可以通过SSL或者TLS的组合使用,加密http的通信内容。
也就是现在的所说的https。
另外一种方式是将参与通信的内容本身加密的方式,即把http报文中所包含的内容进行加密。
当然,内容进行加密就要求客户端和服务器同时具备加密和解密的机制。
不验证通信方的身份就可能遭遇伪装
http协议中的请求和响应不会对通信方进行确认,也就是存在服务器是否就是真正发送URI的主机,返回的请求是否真正发送给了实际提出请求的客户端等这类问题。
-
任何人都可以发起请求
这样的问题就会造成不管对方是谁,服务器都会返回一个响应,那么就容易造成:
返回的响应的服务器可能是已经伪装的web服务器,
接收响应的客户端可能是已经伪装的客户端,
无法确认正在通信的对方是否具备访问权限,
无法确定请求是出自何方,出至谁手, -
查明对手证书
ssl可以提供加密手段,并且还使用一种称为证书的手段,用于确认对方。
无法验证报文的完整性,可能已遭篡改 -
接收的内容可能有误
由于http协议无法验证报文的完整性,因此在请求或响应送出之后直到对方接收之前的这段时间,请求或响应的内容可能遭到篡改。
-
如何防止篡改
最常用的是MD5和SHA-1等散列值校验的方法。
- HTTP + 加密 + 认证 + 完整性保护 = HTTPS
-
http加上加密处理和认证以及完整性保护后即是https
-
https是身披ssl外壳的http
通常,http与tcp通信,当使用ssl时就变成先于ssl通信,然后再由ssl和tcp通信。
-
相互交换密匙的公开密匙加密技术
ssl是采用一种公开密匙加密的一种加密处理方式。
共享密匙加密的困境
使用两把密匙的公开密匙加密
公开密匙加密方式就很好的解决了共享密匙加密的困难。
公开密匙的加密方式使用两把密匙,一把私有的,一把共有的,发送密文的一方使用共有的密匙进行加密发送,接收方在使用私有的密匙进行解密。
HTTPS使用混合的加密方式
证明公开密匙正确性的证书
为了防止在公开密匙传输过程中,真正的密匙已经被替换掉。
-
可证明组织真实性的EV SSL证书
该特性的证书用于验证服务器是否规范,另外是服务器背后运行的企业是否真实存在。 -
用客户端确认的客户端证书
-
认证机构信誉第一
-
由自认证机构颁发的证书称为自签名证书
确认访问用户身份的认证
某些页面只需要特定的人访问,或者仅本人可见,这就需要认证功能。
- 何为认证
当然,计算机无法判断坐在电脑面前的人是谁,所以就需要客户端进行自报家门,为了核对身份,通常需要一些核对信息:密码/动态令牌/数字证书/生物认证/IC卡。
HTTP使用的认证方式:
basic认证(基本认证)
digest认证(摘要认证)
ssl认证(客户端认证)
FromBase认证(基于表单认证)
另外还有windows的统一认证
-
basic认证
当请求的资源需要basic请求时,服务器端将状态码返回,客户端接收到之后会将用户名和密码经过base64编码处理,然后发送给服务端,服务端进行验证做出回应。此加密并非是加密,容易被窃听,另外没有注销操作,不常用。 -
DIGEST认证
DIGEST弥补了basic认证的缺陷,降低了密码泄露的可能性.
质询响应方式:接收方使用质询码的计算方式生成响应码
-
ssl客户端认证
ssl客户端主要用来避免用户id密码被盗登录。
ssl是通过客户端证书完成认证方式。
证书认证步骤:服务端发送对应的报文给客户端,客户端将证书信息发送给服务端,服务端接收到证书内的公开密匙,然后进行https加密。
一般来说会和表单认证形成双因素的认证方式,通过这种方式,不仅需要保证ssl客户端证书是来源于客户端计算机,还要用认证因素的密码确认是本人的行为。
- 基于表单的认证
多数情况下,输入id和密码会发送给web程序,基于认证结果来判断认证是否成功。
大多数: 认证大多数都是基于表单的认证,由于前两种的不安全性以及ssl证书收费的标准,所以web应用的基本实现都是基于表单的验证。
但是不同的网站在不同的表单验证的实现方式上有所不同~
session及cookie:
当基于表单的基本验证暂无标准的情况下,一般会使用cookie来管理session,另外http也是无状态协议~故使用
客户端将id和密码等信息存入实体部分,通常以post方式发送给服务器,服务器会发送用于识别用户的sessionid,通过客户端发来的身份信息进行身份验证,把用户状态和seeionid绑定记录在服务端并将sessionid返回给客户端,当客户端接收到sessionid后,会将将其作为cookie保存在本地,下次发送请求会自动发送,服务端 通过接收到的sessionid进行验证。
基于HTTP协议功能的追加协议
-
基于http协议
由于基于一些网站应用程序的使用,一些功能似乎已经达到要求,但是性能未能达到最优,但是http协议的应用广泛导致无法完全弃用http协议,所以一些新的协议是基于http协议的,并在此基础上添加了新的功能。 -
消除http瓶颈的spdy
开发此功能的目的是为了消除http的性能瓶颈,缩短web页面的加载时间。
ajax的解决方法:
利用javasript和dom的文档操作模型的操作,以达到局部web页面替换加载的异步通信手段。
Comet的解决方法:
一旦有服务端的内容更新,comet不会等待请求等待,而是直接给客户端返回响应,这是一种通过延迟应答,模拟实现服务器向客户端推送的功能。通常情况是服务端接收到请求在处理响应后会立刻返回,但为了推送功能,comet会将响应置于挂起,当服务端有内容更新时,在返回该响应。
spdy的设计
-
使用浏览器进行全双工通信的websocket
利用ajax和comet技术可以提升web的浏览速度,websocket是为了http协议的一些瓶颈问题。
当建立websocket通信连接,不论是服务器还是客户端,任意一方都可以向对方发送报文。
推送功能:
支持服务器向客户端推送数据的功能,这样服务器可以直接向客户端发送数据,而不需要客户端发出请求。
减少通信量:
一旦建立起websocket连接,那么就会一直保持连接状态,相比http,减少了每次连接的开销。
构建web内容的技术
-
HTML
html是为了发送web页面上的超文本而开发的标记语言。
超文本是一种文档系统,可以将文档种的任意位置的信息与其他信息关联起来,如图片之类的,即超文本。
标记语言是指通过文档某部分穿插特别的字符串标签,用来修饰文档语言。(这种特殊的字符串称为标签) -
设计应用css
css 层叠样式表 可以指定如何展示html内的各种元素。即使相同的html通过改变应用的css,用浏览器观察到的页面也会随之改变。 -
动态html
所谓动态就是客户端脚本语言将静态的html内容变为动态的技术总称。
动态html是通过客户端脚本语言javascript实现对html的动态改造。利用DOM 文档对象模型指定预发生动态变化得html元素。 -
DMO
DMO是操作html文档和xml文档的api,使用DMO可以将html内的元素当作对象操作,如取出元素内的字符串或者改变css的属性,使页面的设计发生改变。 -
web应用
-
CGI
是指web服务器接收客户端发送过来的请求后转发给程序的一组机制。
-
servlet
java编写的接口
-
数据发布的格式及语言
xml 可扩展标记语言
xml文档比html读取更为简单,因为xml的结构是标签分割成的树形结构,更容易对数据进行读取。
应用:用在两个不同的应用之间的交换数据格式化。 -
json
json是以javascript的对象为基础的轻量级数据标记语言。
能够处理false/null/true/对象/数组/数字/字符串七种类型。
web的攻击技术
- 针对web的攻击技术
HTTP协议不具备必要的安全功能
在客户端即可篡改请求
针对web应用的攻击
主动攻击:
主动攻击代表:sql注入,os命令注入
被动攻击:
因输出值转义不完全引发的安全漏洞
跨站脚本攻击
利用虚假表单获取用户个人信息。
利用脚本恶意窃取用户cookie值,在被害者不知情的情况下发送恶意请求。
显示伪造的文章或者图片。
sql注入攻击
通过运行非法sql而进行的攻击。
OS命令注入攻击
通过执行非法的操作系统命令执行的攻击。
HTTP首部注入攻击
通过在http首部添加一些内容,主要会造成的影响有:
设置任何的cookie信息,重定向至任意的url,显示任意的主体。
-
因设计缺陷引发的安全漏洞
强制浏览:公布一些浏览器并非自愿公开的文件。
不正确的错误消息处理了:通过错误消息进行下一步的攻击 -
开放重定向
指定任意url的作为重定向的跳转功能。 -
因会话管理疏忽造成的安全漏洞
会话劫持:伪装成用户id进行非法操作
会话固定攻击:
跨站点请求伪造:
-
其他安全漏洞
密码破解
点击劫持
利用透明按钮或者链接作为陷阱,覆盖在web页面之上。
dos攻击
一种让运行中的服务停止的攻击。