报文和实体的差别
关于第三章中报文和实体的差别,书中讲得太简洁。
报文要么是一个请求报文,要么就是一个响应报文。
一次传输中,在应用层来看,就是一个传输的单位(客户端请求服务器,是发送一个“请求报文”,服务器响应客户端,则发送“响应报文”),即为书中说的:
报文是HTTP通信中的基本单位,通过HTTP通信传输 实体其实是报文的一部分,存在于报文主体内 如一个GET请求报文中,就没有报文主体。
那么这种情况下,也就不存在实体 实体是作为请求或响应的有效载荷数据被传输 那么在如响应报文中有:
1 | 200 OK |
那么1234就是实体。 实体的内容由实体首部和实体主体组成: 实体头部不一定会有。如上面“1234”这部分内容,就只有实体主体,没有实体头部。
实体主体也确实等同于报文主体:在没有实体头部的时候就是这样 需要实体头部的场合,则是“传输中需要进行编码操作”的时候,如传输表单内容:
1 | POST /upload HTTP/1.1 |
这个报文里有多个实体 实体里,也有实体头部、实体主体,同样是通过CR+LF分割。 在现在的http协议下,传输编码只有一种:Transfer-Encoding: chunked
在其他任何情况下,实体=实体主体
而这就刚好对应了上文的:编码提升效率 也就是说,当实体(像图片,文本这种数据的载体)不进行编码时,传输数据按照原貌直接传输,报文主体和实体主体是同一样东西.但是为了提高传输效率,要对实体进行编码 比如说:一个图片按原文传输需要5个字节,编码以后传输就是3个字节了,相当于主体内容已经改变了,但是报文主体是不变的,已经发生了变化
HSTS
HTTP Strict Transport Security(HSTS)告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP
配置:
1 | Strict-Transport-Security: max-age=<expire-time> |
简介
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com 或者直接 foo.com。
这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。
网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求
处理步骤
你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security
头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。
当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。
每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。
Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求