http 首行的方法描述了这次请求想干啥GET 从服务器拿一个东西过来读操作POST 往服务器放一个东西过去写操作在实际开发中完全可以用 POST 从服务器拿数据也可以用 GET 往服务器放数据完全可以不按说明来POST 经常使用的场景1.登录2.上传我们可以在登录后抓包到这个信息GET 通常没有bodyPOST 通常由 bodyGET 会把需要给服务器补充信息放到 querystring 中url中POST 会把这些信息放到 body 中一些不太准确的观点1.POST 比 GET 更安全论据登录的时候如果使用 GET用户名密码就会显示在 url 上此时就会被别人直接看到所以就不安全即使是 POST数据没有显示在 URL也是可以通过抓包获取到的真正保证安全性关键在于加密2.GET 传输的数据量小存在上限POST 传输的数据量更大实际上 HTTP 标准文档上说了对于 GET URL 的长度不做限制3.GET 只能携带文本数据POST 则可以携带二进制数据URL 通过 query string 来携带数据query string 是只能包含文本的但是可以对二进制数据进行 urlencode自然成了文本了到了服务器自然进行 urldecode就能把数据还原成二进制POSt 请求 body 中也经常不是携带二进制有很多时候是对二进制进行 urlencode / base64 等方式进行转码HOST表示服务器主机的地址和端口URL 已经有 HOST 了这里的 HOST 和 URL 中的 ip 地址 端口 绝大部分情况下都是一样的和 body 密切相关如果这个数据包没有 body也就不会有这两个字段Content-Type: text/html正常来说响应都得有 Content-Type只要有 body实际上如果响应确实没有 Content-Type也没有 body这个时候有些浏览器也能自己猜一猜浏览器容错能力很强即使返回的数据有问题也尽可能正确显示出来Content-Type: text/html; charsetutf-8后面写的服务器程序返回网页发现乱码就可以检查一下是否这里的编码方式没有设置或者设置的有问题CookieCookie 本质上是一个浏览器这边本地持久化存储数据的机制浏览器作为一个程序可以调用 api 来读写本地磁盘文件浏览器上运行的网页能否通过浏览器提供的 api 来读写本地磁盘文件呢浏览器禁止禁止了这种方法(浏览器没有给 网页提供这样的 api一个网页不能直接读写 我们自己的硬盘文件浏览器给网页提供这样的 API能够有限度的存储数据按照键值对的格式而不能随意的访问文件系统就诊卡本身就是客户端手里拿着的持久化存储数据的机制就是 cookie关于 cookie 几个重要结论1.Cookie 从哪里来服务器返回给浏览器的通常都是首次访问 / 登录成功之后2.Cookie 到哪里去Cookie 会存储在浏览器本地主机的硬盘上后续每次访问都会带上 Cookie不同客户端保存的 Cookie 是不同的即使是同一个主机使用不同的浏览器Cookie 大概率不同3.Cookie 中存什么键值对格式的数据这里的内容都是程序员自定义的和 query string 一样不同网站的 Cookie 都是不一样的4.Cookie 在浏览器这边如何组织在硬盘本地保存是按照不同的域名为维度分别存储5.Cookie 的用途是什么用来在客户端保存数据最为主要的是保存用户的身份标识服务器就可以通过标识来区分用户了一些其他的业务数据一般不会存储在 cookie中cookie 随时可以删除掉把业务数据存储在服务器通过 cookie 中的身份标识找到对应的数据浏览器的另一个保存机制一般账号密码不会在 cookie 中保存cookie 是要传输给服务器的一般浏览器保存的密码都是明文密码明文密码放到 cookie 是不合适虽然 https 能加密https 侧重于是“不能被篡改”而不是“不能被解密”状态码用于响应中的表示响应的结果如何1.200 OK2.404 NOT Found 访问的资源没找到url 中的路径3.403 Forbidden请求的资源没有权限访问4.405你的服务器只支持 GET 请求但是你只发了个 POST5. 500 Internal Server Error服务器内部错误了6.504 Gateway Timeout访问服务器超时了可能是服务器挂了也可能是网挂了7.302 Move temporarily 重定向临时重定向明明访问的是网站 AA就会让浏览器帮你跳转到 B状态码还有一个 特殊了418418 在 HTTP 协议的标准文档是存在的但是没有实际意义如何构造出 HTTP 请求1.通过代码构造任何一种编程语言只要能够操作网络都可以构造 HTTP 请求对于 Java 来说需要使用 ServerSocket / Socket Tcp 的 socket api 来编程本质上就是基于 Socket 写一个 TCP 客户端然后往 socket 中按照 HTTP 协议的格式写入字符串即可OkHttpClient比较知名的 Java 的 HTTP 客户端库2.通过第三方工具构造构造 HTTP 请求的第三方工具postman可以填写一些属性通过send就可以发送请求到目标服务器了还可以找到相应语言的代码网页中构造 HTTP 请求需要通过 HTML / JS 来构造 HTTP 请求了比较经典的方式1.form 表单2.ajax解决安全问题最核心的要点就是“加密”引入加密是保证数据安全的有效手段这样破解的成本就很高加密的成本很低破解的成本很高HTTPS 工作过程只要针对 HTTPS 的数据进行解密了就能得到 HTTP 格式的数据上述的运营商劫持无论是修改 referer 还是修改返回的 链接body本质上都是 明文传输惹的祸需要引入加密对上述传输的数据进行保护主要就是要针对 header 和 body 进行加密1.引入对称加密通过对称加密的方式针对传输的数据进行加密操作2.引入非对称加密使用非对称加密主要目的就是为了对称密钥进行加密确保对称密钥的安全性不能全使用非对称加密针对后续传输的各种 header body 等进行加密而是只能使用非对称加密去加密对称密钥非对称加密的加密解密成本消耗的 CPU 资源要远远高于对称加密如果大规模使用就难以承担了SSL 内部完成工作使用 HTTPS 的时候底层也是 TCP先进行 TCP 三次握手TCP 连接打通之后就要进行 SSL 的握手了交换密钥的过程后面才是真正传输业务数据完成的 HTTPS 的请求/ 响应上述操作下仍然存在重要的安全漏洞黑客仍然是有办法获取到对称密钥 key的服务器可以创建出一对公钥 和 私钥黑客也可以按照同样的方式创建出一对 公钥 和 私钥冒充自己是服务器针对上述问题如何解决最关键的一点客户端拿到公钥的时候要能有办法验证这个公钥是否是真的而不是黑客伪造的要求服务器这边要提供一个“证书”证书是一个结构化的数据里面包含很多属性最终以字符串的形式提供证书中会包含一系列的信息比如服务器的主域名公钥证书有效期证书是搭建服务器的人要从第三方的公正机构进行申请的证书验证的过程证书服务器的域名证书的有效时间服务器的公钥公正机构的信息。。。。。证书的签名此处所谓的“签名”本质上是一个经过加密的校验和把证书中其他的字段通过一系列的算法CRCMD5等得到一个较短的字符串 校验和如果两份数据内容一样此时校验和就一定是相同的如果校验和不同两份数据的内容则一定不同客户端拿到证书之后主要做两件事1.按照同样的校验和算法把证书的其他字段都重新算一遍得到 校验和12.使用系统中内置的公正机构公钥对证书中的签名进行解密得到校验和2此时就可以对比看这俩校验和是否一致如果一致说明证书是没有被修改过的就是原版证书如果不一致说明证书被别人篡改过了此时客户端就能识别出来了黑客无法修改证书的内容1.如果黑客直接修改公钥不修改签名此时客户端验证的校验和是一定不一样的就是别出来了2.如果黑客修改公钥也尝试重新生成签名由于黑客不知道公正机构的私钥所以黑客无法重新生成加密的签名如果黑客拿自己的私钥加密呢客户端这边拿着公正机构的公钥也会解密失败上述操作就把黑客篡改证书的行为堵死了3.黑客能不能自己也去公正机构申请个证书然后把自己的证书替换掉服务器的证书呢还是不行域名是唯一的黑客申请的证书的域名和服务器的域名肯定不同客户端拿到证书之后一看域名都不一样直接就知道证书是假冒的了都不用验证校验和