开发必备:HTTP 及 TLS

对于HTTP和TLS , 相信很多人都不陌生 , 特别是开发人员 , 这应该是平时经常接触的东西 。但大伙对于这块的知识可能比较零散 , 不是很全面 , 所以小编整理了一下 , 希望能帮助大伙更好的去巩固这方面的知识点 。
HTTP和HTTPSHTTP + 加密 + 认证 + 完整性保护 = HTTPS
我们知道HTTP是明文传输的 , 就必不可免存在如下问题:

  • 重要数据被明文获取
  • 通信双方可能被伪冒
  • 数据被篡改
  • 一般获取简单数据用于展示的 , 可能无所谓以上的安全缺陷 。但假如涉及类似银行密码的数据 , 就必须慎重考虑这一点了 。
  • 所以能够规避以上缺陷的HTTP就是HTTPS(HTTP Secure) 。
如何做到加密 + 认证 + 完整性保护
我们都知道OSI7层模型 , 其中HTTP属于应用层协议 , HTTP下一层是TCP(传输层协议) 。完全性是一个难题 , 专注于传输速率的传输层协议TCP为了单一职责的理念 , 自是不会多管闲事去保证安全性而降低自身的传输速率的 。
HTTP本身假如要去保证部分数据的安全性而去专注安全性的开发 , 也是得不偿失 。想到这里 , 很是有一些学JAVA感受到的职责单一、职责分离这样的思想 , 哈哈 。所以应该就是这样 , HTTP与TCP之间再加上一层SSL/TLS(Secure Sockets Layer/Transport Layer Security)协议 。
开发必备:HTTP 及 TLS

文章插图
 
HTTP 请求中的内容HTTP 请求由三部分构成 , 分别为:
  • 请求行
  • 首部
  • 实体
请求行大概长这样 GET /images/logo.gif HTTP/1.1 , 基本由请求方法、URL、协议版本组成 , 这其中值得一说的就是请求方法了 。
请求方法分为很多种 , 最常用的也就是 Get 和 Post 了 。虽然请求方法有很多 , 但是更多的是传达一个语义 , 而不是说 Post 能做的事情 Get 就不能做了 。如果你愿意 , 都使用 Get 请求或者 Post 请求都是可以的 。
问题:Post 和 Get 的区别?
首先先引入副作用和幂等的概念 。
副作用指对服务器上的资源做改变 , 搜索是无副作用的 , 注册是副作用的 。
幂等指发送 M 和 N 次请求(两者不相同且都大于 1) , 服务器上资源的状态一致 , 比如注册 10 个和 11 个帐号是不幂等的 , 对文章进行更改 10 次和 11 次是幂等的 。因为前者是多了一个账号(资源) , 后者只是更新同一个资源 。
在规范的应用场景上说 , Get 多用于无副作用 , 幂等的场景 , 例如搜索关键字 。Post 多用于副作用 , 不幂等的场景 , 例如注册 。
在技术上说:
  • Get 请求能缓存 , Post 不能
  • Post 相对 Get 安全一点点 , 因为Get 请求都包含在 URL 里(当然你想写到 body 里也是可以的) , 且会被浏览器保存历史纪录 。Post 不会 , 但是在抓包的情况下都是一样的 。
  • URL有长度限制 , 会影响 Get 请求 , 但是这个长度限制是浏览器规定的 , 不是 RFC 规定的
  • Post 支持更多的编码类型且不对数据类型限制
首部
首部分为请求首部和响应首部 , 并且部分首部两种通用 , 接下来我们就来学习一部分的常用首部 。
通用首部
开发必备:HTTP 及 TLS

文章插图
 
请求首部
开发必备:HTTP 及 TLS

文章插图
 
响应首部
开发必备:HTTP 及 TLS

文章插图
 
实体首部
开发必备:HTTP 及 TLS

文章插图
【开发必备:HTTP 及 TLS】 
常见状态码
状态码表示了响应的一个状态 , 可以让我们清晰的了解到这一次请求是成功还是失败 , 如果失败的话 , 是什么原因导致的 , 当然状态码也是用于传达语义的 。如果胡乱使用状态码 , 那么它存在的意义就没有了 。
状态码通常也是面试经常会被考的一道题 。
2XX 成功