在 CORS 中,POST 请求是否带有凭据 pre-flighted?
In CORS, Are POST request with credentials pre-flighted ?
在 MDN Access Cotrol doc 中,不预检带有凭据的 GET 请求。但是如果响应 headers 不包含 Access-Control-Allow-Credentials: true 那么调用客户端将无法使用响应。如果此行为与 POST 相同(简单 POST 请求凭据 - 内容类型可能是 form-data)请求,则存在 POST 可能会更改服务器状态的风险客户可能无法获得响应。这个假设正确吗?
或 POST 请求凭据 pre-flighted?
预检请求旨在阻止浏览器向服务器发送某些类型的请求,除非服务器明确允许。但是,在 CORS 支持出现之前,浏览器已经可以将经过认证的 POST 请求直接发送到服务器。
"Security Considerations" part of the CORS spec 说(强调我的):
Simple cross-origin requests generated outside this specification (such as cross-origin form submissions using GET or POST or cross-origin GET requests resulting from script elements) typically include user credentials, so resources conforming to this specification must always be prepared to expect simple cross-origin requests with credentials.
换句话说,无需预检就可以让经过认证的 POST 请求到达服务器并不是什么新鲜事:自从浏览器支持 <form>
以来,开发人员就已经能够做到这一点。因此,要求 Ajax 包含经过认证的 POST 请求的预检没有任何好处。
在 MDN Access Cotrol doc 中,不预检带有凭据的 GET 请求。但是如果响应 headers 不包含 Access-Control-Allow-Credentials: true 那么调用客户端将无法使用响应。如果此行为与 POST 相同(简单 POST 请求凭据 - 内容类型可能是 form-data)请求,则存在 POST 可能会更改服务器状态的风险客户可能无法获得响应。这个假设正确吗?
或 POST 请求凭据 pre-flighted?
预检请求旨在阻止浏览器向服务器发送某些类型的请求,除非服务器明确允许。但是,在 CORS 支持出现之前,浏览器已经可以将经过认证的 POST 请求直接发送到服务器。
"Security Considerations" part of the CORS spec 说(强调我的):
Simple cross-origin requests generated outside this specification (such as cross-origin form submissions using GET or POST or cross-origin GET requests resulting from script elements) typically include user credentials, so resources conforming to this specification must always be prepared to expect simple cross-origin requests with credentials.
换句话说,无需预检就可以让经过认证的 POST 请求到达服务器并不是什么新鲜事:自从浏览器支持 <form>
以来,开发人员就已经能够做到这一点。因此,要求 Ajax 包含经过认证的 POST 请求的预检没有任何好处。