服务器如何知道使用凭据发送的请求?

时间:2018-11-11 09:35:07

标签: http cors xmlhttprequest http-headers

当我通过网站从另一台服务器请求资源时,我遇到了一个问题。

我请求资源(通过“范围请求”请求的PDF文件)。 浏览器(在这种情况下为Chrome)将OPTIONS请求发送到服务器。 服务器从OPTIONS返回200,但是标头之一是-Access-Control-Allow-Credentials: true 由于服务器为*响应标头公开了通配符Access-Control-Allow-Origin,因此Chrome(我认为)从服务器抛出以下响应,并给我一个错误,指出服务器无法公开通配符如果请求是withCredentials = 'include'

现在,我没有在我可以看到的代码中的任何地方设置withCredentials标志,并且我似乎无法找出服务器如何知道是否使用凭据发送请求。我的Cookie不会随OPTIONS或以下GET / PARTIAL CONTENT请求一起发送。我可以看到请求中没有其他特殊的标头。

所以

  1. 服务器如何知道以及如何在客户端告诉凋零凭证设置为包括?

  2. 如果我没有设置凭据,是什么原因导致Chrome认为我使用的模式是withCredentials = 'include'

  3. 在选项之后,服务器是否应在所有请求上发回Access-Control-Allow-Credentials: true标头?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 服务器如何知道?如何在客户端告知凋谢凭证设置为包括?
  2.   

接收服务器对客户端withCredentials设置一无所知。服务器只是在请求中接收某种形式的凭据,或者没有。而且就CORS协议而言,接收服务器不会根据请求是否包含凭据来更改其行为。接收服务器只是发送回Access-Control-Allow-Credentials: true响应标头,还是没有。

  
      
  1. 如果我没有设置凭据,是什么原因导致Chrome认为我使用的模式是withCredentials = 'include'
  2.   

答案是,这是主观的-它取决于服务器管理员希望响应的对象。但是最佳实践是,您可能只想将Access-Control-Allow-Credentials: true发送回您知道并明确希望允许的特定来源。因此,CORS协议有一个限制,即如果请求具有凭据并且响应具有Access-Control-Allow-Origin: *(通配符)标头值,则不允许您的前端代码访问响应。

  
      
  1. 在选项之后,服务器是否应在所有请求上发回Access-Control-Allow-Credentials: true标头?
  2.   

Chrome只会认为该模式实际上是 withCredentials = 'include'。因此,您的客户代码的某些部分实际上是在设置withCredentials = 'include' —否则,withCredentials = 'include' 并不是在实际上设置了所有,但是您为某些原因就是这样。