服务器如何知道使用凭据发送的请求?
Posted
技术标签:
【中文标题】服务器如何知道使用凭据发送的请求?【英文标题】:How does a server know a request is sent with credentials? 【发布时间】:2019-04-14 07:18:51 【问题描述】:当我通过我的网站从另一台服务器请求资源时,我遇到了一个问题。
我请求资源(通过 Range Requests 请求的 PDF 文件)。
浏览器(本例中为 Chrome)向服务器发送一个 OPTIONS 请求。
服务器从 OPTIONS 返回 200,但其中一个标头是 - Access-Control-Allow-Credentials: true
由于服务器为Access-Control-Allow-Origin
响应标头公开了通配符*
,因此(我认为)Chrome 会从服务器抛出以下响应并给我一个错误,指出如果请求是服务器无法公开通配符发withCredentials = 'include'
。
现在,我没有在我可以看到的代码中的任何地方设置withCredentials
标志,并且我似乎无法找出服务器如何知道是否使用凭据发送请求。我的 cookie 不会随 OPTIONS 或 GET/PARTIAL CONTENT 请求一起发送。我可以看到请求中没有其他特殊标头。
所以,
服务器如何知道以及我如何知道客户端的 wither 凭据是否设置为包含?
如果我没有设置凭据,是什么导致 Chrome 认为我正在使用的模式是 withCredentials = 'include'
?
Access-Control-Allow-Credentials: true
标头?
【问题讨论】:
@sideshowbarker 在回答你的最后一点时,我都不能,也没关系。我将 withCredentials 明确设置为 false,但请求在实际发送之前确实通过了一些供应商代码。该代码是缩小的 JS 和/或 WASM C 代码。我会接受 cmets 作为有效答案,因为它强化了我期望听到的内容。我的猜测是供应商代码以某种方式设置它,我只是找不到它并将与他们联系。如果我不能以编程方式检查“withCredentials”,那么我不确定我还能做什么。 【参考方案1】:服务器如何知道以及我如何知道客户端的 wither 凭据是否设置为包含?
接收服务器对客户端withCredentials
设置一无所知。服务器只是在请求中接收某种形式的凭据,或者不接收。就 CORS 协议而言,接收服务器不会根据请求是否包含凭据而改变其行为。接收服务器要么只发回 Access-Control-Allow-Credentials: true
响应头,要么不发回。
如果我没有设置凭据,是什么导致 Chrome 认为我正在使用的模式是
withCredentials = 'include'
?
答案是,它是主观的——这取决于服务器管理员打算将响应发给谁。但最佳实践是,您可能只想将Access-Control-Allow-Credentials: true
发送回您知道并明确允许的特定来源。这就是为什么 CORS 协议有这样的限制:如果请求具有凭据并且响应具有 Access-Control-Allow-Origin: *
(通配符)标头值,它将不允许您的前端代码访问响应。
服务器是否应该在 OPTIONS 之后的所有请求中发回
Access-Control-Allow-Credentials: true
标头?
Chrome 只会认为该模式实际上是 withCredentials = 'include'
。因此,要么您的客户端代码的某些部分 实际上设置了 withCredentials = 'include'
— 否则,withCredentials = 'include'
没有 实际上全部设置,但您出于某种原因只是认为它是。
【讨论】:
以上是关于服务器如何知道使用凭据发送的请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中发送带有 XML 数据的 HTTPS POST 请求