一、HTTP响应报文结构
二、状态码
HTTP状态码分为5类:
1xx表示继续发送请求
2xx表示请求成功
3xx表示资源已找到但需要继续进行其他操作;
4xx表示客户端错误
5xx表示服务器错误
下面是一些常见的状态码
1.1xx
1xx表示请求已被接受,但需要后续处理。例如:
100(Continue)
客户端应继续发送请求。
101(Switching Protocols)
需要切换协议,服务器通过的Upgrade响应头字段通知客户端。
HTML5引入的WebSocket便是这样工作的。首先客户端请求websocket所在的URL,服务器返回101,然后便建立了全双工的TCP连接。注意Upgrade和Connection头字段属于Hop-by-hop字段,设置Websocket代理时需要继续设置这两个字段,而不是简单地转发请求。
2.2xx
请求已成功被服务器接收、理解、并接受。例如:
200(OK)
请求已成功,请求所希望的响应头或数据体将随此响应返回。
201(Created)
请求已经被实现,而且有一个新的资源已经依据请求的需要而创建。在RESTFul风格的URL设计中,通常用来响应POST请求。
202(Accepted)
服务器已接受请求,但尚未处理。比如POST一个资源应当返回201,但由于性能原因未能立即创建,可以返回202。
204(No Content)
服务器成功处理了请求,但不需要返回任何实体内容,204响应禁止包含任何消息体。浏览器收到该响应后不应产生文档视图的变化。
205(Reset Content)
服务器成功处理了请求,但不需要返回任何实体内容,205响应禁止包含任何消息体。 与204不同的是,返回此状态码的响应要求请求者重置文档视图。比如用户刚刚提交一个表单,返回205后页面重置,用户可以立即填写下一个表单。
206(Partial Content)
HTTP协议允许分片传输。请求头中包含Range
字段时,响应需要只返回Range
指定的那一段。响应中应包含Content-Range
来指示返回内容的范围。
3.3xx
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,重定向目标在本次响应的Location头字段中指明。例如:
301(Moved Permanently)
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果该请求不是GET/HEAD, 浏览器通常会要求用户确认重定向。
301通常用于网站迁移时,服务器对旧的URL进行301重定向到新的URL。这样搜索引擎可以正确地更新原有的页面排名等信息。
302(Found)
请求的资源现在临时从不同的URI响应请求。除非指定了Cache-Control或Expires,否则该响应不可缓存。如果当前请求非HEAD或GET,浏览器需取得用户确认,再进行重定向。
303(See Other)
对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。 这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。 303响应禁止被缓存。
注:303会使得浏览器直接GET那个资源,不需用户同意。这是Web应用中最常见的重定向方式。
4.4xx
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。 除非响应的是一个HEAD请求,否则服务器就应该返回一个解释当前错误状况的实体。例如:
400(Bad Request)
由于包含语法错误,当前请求无法被服务器理解。400通常在服务器端表单验证失败时返回。
401(Unauthorized)
当前请求需要用户验证,响应中会包含一个WWW-Authenticate字段来询问用户的授权信息。而客户端的下次请求需要提供包含Authorization头的请求。
HTTP Basic Auth就是这样实现的。当服务器返回401时浏览器会弹出窗口:
输入验证信息并点击确定,浏览器会根据你的输入填写Authorization
头并重新发送请求。
403(Forbidden)
服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助。
通常用于服务器已经知道用户的身份的情况。比如从请求的Cookie得到的Session中可以得知当前用户无权进行该操作。 通常的Web应用中,对于401的情况应当重定向至登录页面,403的情况应当直接告知错误(这属于前端Bug)。
404(Not Found)
请求所希望得到的资源未被在服务器上发现。
当通常用于当服务器不想揭示到底为何请求被拒绝时,比如应当返回500时服务器不愿透露自己的错误。
405(Method Not Allowed)
请求行中指定的请求方法不能被用于请求相应的资源。
5.5xx
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。 并且响应消息体中应当给出理由,除非是HEAD请求。例如:
500(Internal Server Error)
通常是代码出错,后台Bug。
502(Bad Gateway)
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
如果你在用HTTP代理来翻墙,或者你配置了nginx来反向代理你的应用,你可能会常常看到它。
504(Gateway Time-out)
作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器收到响应。
502是接收到了无效响应比如Connection Refused; 504是响应超时,通常是被墙了。
三、响应头
响应报文中有部分字段是和请求报文中通用的,此处不再列举
1.Server
告知客户端当前服务器上安装的http服务器应用程序信息。
2.Vary
对缓存进行控制,原服务器会向代理服务器传递本地缓存方法使用的指令。
3.X-Frame-Options
代表着浏览器是否能够将当前页面在 <frame>、<iframe>、<embed>、<object>中渲染。它主要是用来防止UI redressing 补偿样式攻击。
X-Frame-Options 响应头有三个可选的值
DENY:页面不能被嵌入到任何iframe或frame中;
SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中;
ALLOW-FROM:页面允许frame或frame加载。
// 正确的设置 DENY – 禁止所有的资源(本地或远程)试图通过frame来加载其他也支持X-Frame-Options 的资源。 SAMEORIGIN – 只允许遵守同源策略的资源(和站点同源)通过frame加载那些受保护的资源。 ALLOW-FROM http://www.example.com – 允许指定的资源(必须带上协议http或者https)通过frame来加载受保护的资源。 这个配置只在IE和firefox下面有效。其他浏览器则默认允许任何源的资源(在X-Frame-Options没设置的情况下)。 // 通常不正确的设置 ALLOW FROM http://example.com – ALLOW和FROM 之间只能通过连字符来连接,空格是错误的。 ALLOW-FROM example.com – ALLOW-FROM选项后面必须跟上一个URI而且要有明确的协议(http或者https)
4.X-XSS-Protection
此字段是用来防范XSS的。
X-XSS-Protection 响应头有三个可选的值
(1)X-XSS-Protection : 0
表示禁用 XSS 过滤这个功能
(2)X-XSS-Protection : 1
表示启用 XSS 过滤。一般浏览器中都是默认开启。如果检测到跨站脚本攻击,浏览器将清除在页面上检测到的不安全的部分
(3)X-XSS-Protection : 1;mode=block
表示启用XSS过滤器,如果检测到攻击,浏览器不会像上面的选项一样将不安全的部分删除,而是直接阻止整个页面的加载
5.X-Content-Type-Options
用于控制浏览器是否应该尝试 MIME 类型嗅探。如果启用了 X-Content-Type-Options,浏览器将遵循服务器提供的 MIME 类型,用于防止浏览器执行 MIME 类型错误的响应体(response body)。
如果在http响应头中指定的 Content-Type 与实际响应体返回的 MIME 类型不一致,这种情况下浏览器可能会忽略响应头中指定的Content-Type,执行实际响应体的 MIME 类型,造成安全风险,而设置 X-Content-Type-Options 就是为了避免这种类型的安全风险。
例:X-Content-Type-Options: nosniff
nosniff 只应用于以下两种情况的请求将被阻止:
- 请求类型是
style
但是 MIME 类型不是 text/css。 - 请求类型是
script
但是 MIME 类型不是 JavaScript MIME 类型。
即,只能执行 MIME 为 text/html 的响应内容,将阻止浏览器执行 JavaScript 代码。
6.Content-Security-Policy
简称CSP,即网页安全策略,主要用于防止XSS攻击。
以下为常见用例
(1)所有内容均来自站点的同一个源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
(2)允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
(3)确保网站的所有内容都要通过SSL方式获取,以避免攻击者窃听用户发出的请求
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
(4)只允许加载当前域的js
header("Content-Security-Policy: default-src 'self'; script-src 'self' ");
7.X-Download-Options
用于控制浏览器如何处理文件下载。当浏览器收到包含X-Download-Options头信息的HTTP响应时,如果该头信息的值为"noopen",表示浏览器不应该自动打开文件,而是应该将文件保存到本地。将X-Download-Options的值设置为"noopen"可以有效地防止文件被自动打开,从而提高Web应用程序的安全性。
8.Access-Control-Allow-Origin
用于定义在跨域访问中哪些源(域名、协议和端口)被允许访问目标资源。它是跨域资源共享(CORS)机制的一部分,确保客户端浏览器在跨域请求时能够获得服务器端的授权许可。
服务器接收到预检请求后,会检查请求中的Origin字段,如果服务器认可跨域请求,它会在响应头中添加Access-Control-Allow-Origin字段,并设置其为允许访问的源。
Access-Control-Allow-Origin有两个值可选,要么是请求时Origin字段的值;要么是一个通配符*,表示接受任意域名的请求。
9.X-Powered-By
web应用框架信息。
常见例子:PHP/7.2.1、Express、ASP.NET。这些头都表明了生成响应的服务器使用的技术。
10.X-Aspnetmvc-Version
asp.net版本,只要集成IIS的站点都有这样的header。
11.X-Aspnet-Version
asp.net mvc 版本使用asp.net mvc框架会有此字段。
12.Set-Cookie
由服务器在HTTP响应中发送给客户端的,用于在客户端存储一条新的Cookie。
它的一般格式如下:
Set-Cookie: `name=value` [; expires=`date`] [; domain=`domain`] [; path=`path`] [; secure] [; httponly] [; samesite=`strict`/`lax`/`none`]
其中,各个参数的含义如下:
name=value
: 表示要设置的Cookie的名称和值。expires=date
: 指定Cookie的过期时间,如果不设置,Cookie默认在浏览器关闭时过期。domain=domain
: 指定Cookie的有效域,控制哪些域可以访问该Cookie。path=path
: 指定Cookie的有效路径,控制哪些路径下的页面可以访问该Cookie。secure
: 如果设置了该选项,Cookie只能通过HTTPS协议传输。httponly
: 如果设置了该选项,Cookie将无法通过JavaScript脚本访问,有助于防止跨站脚本攻击(XSS)。samesite=strict/lax/none
: 该选项用于控制跨站请求伪造(CSRF)攻击。strict
表示仅在同站点请求时发送Cookie,lax
表示在导航到其他站点时不发送Cookie,仅在顶级导航时发送;none
表示总是发送Cookie。
13.Accept-Ranges
用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则 指定其为 none。
14.referrer-policy
用来规定什么情况下显示Referer字段及refer字段内显示多少信息。
(1)no-referrer
任何情况下都不发送referer
(2)no-referrer-when-downgrade
在同等安全等级下(例如https页面请求https地址),发送referer,但当请求方低于发送方(例如https页面请求http地址),不发送referer
(3)origin
仅仅发送origin,即protocal+host
(4)origin-when-cross-origin
跨域时发送origin
(5)same-origin
当双方origin相同时发送
(6)strict-origin
当双方origin相同且安全等级相同时发送
(7)unfafe-url
任何情况下都显示完整的referer
15.X-Permitted-Cross-Domain-Policies
提供了许多可选的安全相关功能与特性,这些功能与特性通常可以通过 HTTP 响应头来控制,使用这些功能,可以避免受到浏览器端的用户受到类似CSRF、XSS、Click Hijacking 等前端黑客攻击的影响。
(1)none:
不允许使用loadPolicyFile方法加载任何策略文件,包括此主策略文件。
(2)master-only:
只允许使用主策略文件[默认值]。
(3)by-content-type:
只允许使用loadPolicyFile方法加载HTTP/HTTPS协议下Content-Type 为text/x-cross-domain-policy的文件作为跨域策略文件。
(4)by-ftp-filename:
只允许使用loadPolicyFile方法加载FTP协议下文件名为 crossdomain.xml的文件作为跨域策略文件。
(5)all:
可使用loadPolicyFile方法加载目标域上的任何文件作为跨域策略文件,甚至是一 个JPG也可被加载为策略文件。
16.Strict-Transport-Security
严格传输安全策略(HSTS),旨在提高网站的安全性,防止恶意攻击者通过中间人攻击和SSL剥离等方式来劫持或劫持用户的连接。
(1)max-age=<expire-time>:
设置在浏览器收到这个请求后的 秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
(2)includeSubDomains :
可选,如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
(3)preload:
可选,加入预加载列表。