1.HTTP协议的概述
2.加密方式
3.HTTPS的工作原理
4.RESTful与REST
5.REST设计原则
6.如何理解REST的无状态设计
6.RESTful的最佳设计
1.HTTP协议的概述
1)客户端和服务器端
2)资源
html/文本、word、avi电影、其他资源
3)媒体类型
MIME类型。 text/html、 image/jpeg
Content-Type告诉客户端资源的表述形式
4)URI和URL
URI:web服务器资源的名字。 index.html
http://www.gupaoedu.com:80/java/index.html[?query-string] #location
schema: http/https/ftp.
host: web服务器的ip地址或者域名
port: 服务端端口, http默认访问的端口是80
path: 资源访问路径
query-string: 查询参数
5)方法
GET/PUT/DELETE/POST/HEAD
6)报文
request参数、 response响应参数
request消息结构包含三部分: (起始行、首部字段、主体)
METHOD /path / http/version-number
Header-Name:value
空行
主体 optional request body
response
http/version-number status code message
header-name:value
body
7)状态码
http/1.1版本的协议里面定义了五种类型的状态码
1XX 提示信息
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器端的错误
8)缓存
max-age
9)HTTP协议的特点
1.无状态
cookie+session
2.多次请求
3.基于TCP协议
2.加密方式
可逆加密算法可分成三类:对称加密算法、非对称加密算法、基于算法
1)对称加密(AES,RC4,3DES)
客户端与服务器使用相同的密钥对消息进行加密
优点:
加密强度高,很难被破解
计算量小,仅为非对称加密计算量的 0.1%
缺点:
无法安全的生成和管理密钥
服务器管理大量客户端密钥复杂
2)非对称加密(RSA,DSA/DSS)
非对称指加密与解密的密钥为两种密钥。服务器提供公钥,客户端通过公钥对消息进行加密,并由服务器端的私钥对密文进行解密。私钥和公钥的作用一般分为两种:
公钥加密,私钥解密,主要用于通信;
私钥加密(签名),公钥解密(验证),主要用于数字签名。
优点:安全
缺点
性能低下,CPU 计算资源消耗巨大,一次完全的 TLS 握手,密钥交换时的非对称加密解密占了整个握手过程的 90% 以上。而对称加密的计算量只相当于非对称加密的 0.1%,因此如果对应用层使用非对称加密,性能开销过大,无法承受。
非对称加密对加密内容长度有限制,不能超过公钥的长度。比如现在常用的公钥长度是 2048 位,意味着被加密消息内容不能超过 256 字节。
3)基于算法的加密算法:MD5,SHA1,SHA256
基于算法的加密算法,也被称为古典加密算法,如 HTTP 认证中的 base64,比特币生成地址用的 base58(公开的算法也可称作编码方式)。这类算法主要对原始内容进行置换和替换得到密文,安全性依赖于算法是否外泄;
参考:
https://www.itcodemonkey.com/article/5466.html
https://www.jianshu.com/p/33feb2fadb15
3.HTTPS的工作原理
SSL/TLS
SSL3.0
ISOC 在SSL的基础上发布了升级版本 TLS1.2
第一步, 使用对称加解密
缺点:不安全
第二步,密钥是公开的,所有的客户端都可以拿到
第三步 针对不同的客户端使用不同的密钥
问题:协商过程是没有加密的,所以还会出现被截断的问题
第四步:使用非对称加密
非对称:公钥和私钥的概念
问题: 客户端如何拿到公钥
1.服务器端把公钥发送给每一个客户端
2.服务器端把公钥放到远程服务器,客户端可以请求到
3.让浏览器保存所有的公钥(不现实)
第五步 公钥被调包的问题按照上面的方案,永远存在。
第六步:使用第三方机构来解决
通过第三方机构,使用第三方机构的私钥对我们【需要传输的公钥】进行加密
第七部分
数字证里面包含的内容:
公司信息、网站信息、数字证书的算法、公钥
连接过程
1.客户端发起一个https请求
a)客户端支持的加密方式
b)客户端生成的随机数(第一个随机数)
2.服务端收到请求后,拿到随机数,返回
a)证书(颁发机构(CA)、证书内容本身的数字签名(使用第三方机构的私钥加密)、证书持有者的公钥、证书签名用到的hash算法)
b)生成一个随机数,返回给客户端(第二个随机数)
3.客户端拿到证书以后做验证
a)根据颁发机构找到本地的跟证书
b)根据CA得到根证书的公钥,通过公钥对数字签名解密,得到证书的内容摘要 A
c)用证书提供的算法对证书内容进行摘要,得到摘要 B
d)通过A和B的对比,也就是验证数字签名
4.验证通过以后,生成一个随机数(第三个随机数),通过证书内的公钥对这个随机数加密,发送给服务器端
5.(随机数1+2+3)通过对称加密得到一个密钥。(会话密钥)
6.通过会话密钥对内容进行对称加密传输
4.RESTful与REST
REST 含义为“表述性状态转移”。REST是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。
RESTful 遵守了REST 原则 的web服务
两者的区别 :就好比Beauty和Beautiful的关系
5.REST设计原则
1)通过 URI 来标识资源:
系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的 URI。
2)统一接口:
建立创建、检索、更新和删除操作与 HTTP 方法之间的一对一映射:
若要在服务器上创建资源,应该使用 POST 方法;
若要检索某个资源,应该使用 GET 方法;
若要更新或者添加资源,应该使用 PUT 方法;
若要删除某个资源,应该使用 DELETE 方法。
3)资源多重表述:
URI 所访问的每个资源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具体的表现形式取决于访问资源的客户端。在 REST 的世界中,资源即状态,每个网页是其一个状态;URI 是状态的表述;REST 风格的应用则是从一个状态迁移到下一个状态的状态转移过程。早期互联网只有静态页面的时候,通过超链接在静态网页间浏览跳转的 page->link->page->link… 模式就是一种典型的状态转移过程。
4)无状态:
客户端对服务器端的请求应该是无状态的,请求不要求服务器在处理请求时检索任何类型的应用程序上下文或状态。无状态约束使服务器的变化对客户端是不可见的,因为在两次连续的请求中,客户端并不依赖于同一台服务器。服务端不应该保存客户端状态
5)资源链接
超媒体即应用状态引擎
6.如何理解REST的无状态设计
每一个URI请求(例如网页)理解为一个状态,那么不同URI(网页)间的跳转可以理解为不同状态之间的转移。那么这个状态究竟如何实现转移的呢?
很关键的理解:
状态可以嵌入到应答消息里,这样一来状态在接下来的交互中仍然有效。
通过超链接实现有状态交互,请求消息的每次交互都包含完整的信息。有多种技术实现了不同请求间状态信息的传输,例如 URI ,cookies 和隐藏表单字段等。状态可以嵌入到应答消息里,这样一来状态在接下来的交互中仍然有效。
状态记录在服务端设计:
a, 用户user登陆后,user的上下文信息例如记录该user已登陆的标识保存在服务器端session中,当用户发生下一次的请求,服务端会根据userId查找该session是否标记了该用户已登录的状态
b, 用户浏览书签页,当前用户浏览的页面是第3页,这个第3页的信息保存在服务器端session中,当用户请求下一页nextPage,服务端从session拿出当前阅读状态为第3页,基于此状态计算出下一页是第4页
RESTful的设计:
a, 用户user登陆后,服务器生成验证信息token,该token标记该用户已经登陆的状态,服务端不保存该token信息,而是token返回给客户端,
当用户发生下一次的请求,客户端把该token重新发送给服务端,于是服务端就根据该token知道用户已经登陆的状态(具体实现是:第一次登陆,token信息在数据库端缓存下来,第二次请求时候从数据库缓存查询该用户token。这样用户状态的信息就不需要保存在服务器端,保存了在数据库端,数据库端一般采用redis类型的缓存数据库)
b, 用户浏览书签页,当前用户浏览的页面是第3页,服务器返回当前页第3页这个状态给客户端,服务端不保存当前阅读页数的状态,当用户发生下一页的请求,客户端把当前页第3页和下一页操作给服务端,服务端基于客户端的状态信息计算出下一页是第4页
由此可以看出,
REST 风格应用可以实现交互,但它却天然地具有服务器无状态的特征。在状态迁移的过程中,服务器不需要记录任何 Session,所有的状态都通过 URI 的形式记录在了客户端。更准确地说,这里的无状态服务器,是指服务器不保存会话状态(Session);而资源本身则是天然的状态,通常是需要被保存的;这里所指无状态服务器均指无会话状态服务器。
7.RESTful的最佳设计
在Restful之前的操作:
http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息
RESTful用法:(一看就明白)
http://127.0.0.1/user/1 GET 根据用户id查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息
1.域名([/]表示资源的层级关系)
http://api.gupaoedu.com
http://api/gupaoedu.com/api
2.版本
http://api.gupaoedu.com/v1/user/1
header里面维护版本
3.路径(使用_或者-让URI的可读性更好)
http://api.gupaoedu.com/v1/users_list //获取用户列表
http://api.gupaoedu.com/v1/goods-list //商品列表
http://api.gupaoedu.com/v1/users/{id}
4.过滤信息(?过滤资源)
https://api.github.com/user/repos?page=2&per_page=100
https://developer.github.com/v3/#rate-limiting
5. 状态码(服务端返回)
业务状态码
http状态码