HTTP 和 HTTPS
HTTP
http是超文本传输协议,最开始是为了方便传输html而创建的,传输的信息都是没经过加密的,并且是无状态的,连接通过TCP连接,端口为80,安全性很差,但是连接很简单,速度快减少界面加载延时
HTTP协议的特点?
- HTTP允许传输任意类型的数据。传输的类型由Content-Type加以标记。
- 无状态。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。
- 支持客户端/服务器模式。
http缺点
1、无法验证报文的完整性
2、无法验证发送人,所以可能被伪装
3、通信使用明文,可能信息被窃听


http常见状态码
| http状态码 | 解释 |
|---|---|
| 200 OK | 请求成功完成 |
| 301 Moved Permanently | 永久移动,永久重定向 |
| 302 Found | 临时移动,临时重定向 |
| 400 Bad Request | 客户端请求错误,服务器理解不了 |
| 403 Forbidden | 服务器收到并且理解请求,但是拒绝提供服务 |
| 404 Not Found | 客户端所要找的资源找不到 |
| 499 client has closed connection | nginx 自定义状态码,两次post提交过快或者服务器端处理的时间过长 |
| 500 Internal Server Error | 服务器错误 |
| 503 Service Unavailable | 服务器尚未处于可以请求状态,服务器停机或者已超载 |
介绍下http2.0
HTTP2.0
HTTP和HTTPS的区别
安全的基础是ssl协议,连接方式不同(待补充),https是http+ssl协议进行构建的加密传输、身份认证的网络协议,比http协议安全很多,连接方式通常也是tcp,也有可能是SCTP。
ssl由权威机构颁发,ssl是一个非对称加密,有一个公钥,和一个私钥,用公钥加密后的信息只能由私钥解密,用私钥加密的数据只能公钥解密,公钥放在服务器,私钥放在个人主机。
HTTPS
https是经过ssl证书认证并且在传输过程加密的一种传输方式,端口为443安全性大大增加,https = http+ssl加密
什么是数字证书?
服务端可以向证书颁发机构CA申请证书,以避免中间人攻击(防止证书被篡改)。证书包含三部分内容:证书内容、证书签名算法和签名,签名是为了验证身份。

服务端把证书传输给浏览器,浏览器从证书里取公钥。证书可以证明该公钥对应本网站。
数字签名的制作过程:
- CA使用证书签名算法对证书内容进行hash运算。
- 对hash后的值用CA的私钥加密,得到数字签名。
浏览器验证过程:
- 获取证书,得到证书内容、证书签名算法和数字签名。
- 用CA机构的公钥对数字签名解密(由于是浏览器信任的机构,所以浏览器会保存它的公钥)。
- 用证书里的签名算法对证书内容进行hash运算。
- 比较解密后的数字签名和对证书内容做hash运算后得到的哈希值,相等则表明证书可信。
首先是TCP三次握手,然后客户端发起一个HTTPS连接建立请求,客户端先发一个Client Hello的包,然后服务端响应Server Hello,接着再给客户端发送它的证书,然后双方经过密钥交换,最后使用交换的密钥加解密数据。
协商加密算法 。在
Client Hello里面客户端会告知服务端自己当前的一些信息,包括客户端要使用的TLS版本,支持的加密算法,要访问的域名,给服务端生成的一个随机数(Nonce)等。需要提前告知服务器想要访问的域名以便服务器发送相应的域名的证书过来。
服务端响应
Server Hello,告诉客户端服务端选中的加密算法。
接着服务端给客户端发来了2个证书。第二个证书是第一个证书的签发机构(CA)的证书。

客户端使用证书的认证机构CA公开发布的RSA公钥对该证书进行验证,下图表明证书认证成功。

验证通过之后,浏览器和服务器通过密钥交换算法产生共享的对称密钥。
RSA密钥交换算法:
(1)任意客户端对服务器发起请求,服务器首先发回复自己的公钥到客户端(公钥明文传输)。
(2)客户端使用随机数算法,生成一个密钥S,使用收到的公钥进行加密,生成C,把C发送到服务器。
(3)服务器收到C,使用公钥对应的私钥进行解密,得到S。
(4)上述交换步骤后,客户端和服务器都得到了S,S为密钥(预主密钥)。


开始传输数据,使用同一个对称密钥来加解密。

https被中间人攻击了怎么办
攻击人先使用DNS劫持把请求都到他的服务器,再用伪造的证书与客户端进行交互
解决办法:
第一步需要验证CA证书的时候去验证他是不是权威机构,使用权威机构的CA证书的公钥解密验证和原来的证书是否一致,如果不是就不信任他不与他进行https连接。
Get和Post的区别
1、get请求表示的意思是要得到信息,并且get请求参数都放header或者url上面,安全性较差放url上面有长度限制,最多1024个字符,不适合传大长度信息。
2、post请求表示添加信息 ,请求参数作为键值对放在http请求中,不会出现在url中,安全性较get较好
3、get请求在url不可加入中文字符,会乱码,post可以
Restful风格的接口
1、请求头
get 表示请求数据 ,一般数据放header里面
post 表示增加数据 ,一般数据放body里面
put 表示修改数据,一般数据放body里面
delete 表示删除数据,一般数据放body里面
2、url的复用,比如work这块,写一个group里面,然后get “/”表示获取工作信息,post“/”增加工作信息
3、状态码,详情看上面
4、制作一个统一的返回信息的格式,写一个可以多处用的success return和error return,返回结果统一json
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!