通过 HTTPS 的 HTTP Cookie 和 Ajax 请求

Posted

技术标签:

【中文标题】通过 HTTPS 的 HTTP Cookie 和 Ajax 请求【英文标题】:HTTP Cookies and Ajax requests over HTTPS 【发布时间】:2012-05-01 02:25:47 【问题描述】:

我知道以前曾以各种形式提出过这个问题,但我似乎无法解决这个问题。 我尝试过使用 jQuery 和原生 JS API 来发出 Ajax 请求。

我的情况如下(见附图):

    浏览器发出 HTTP 请求 服务器响应并设置持久性 Cookie 浏览器发出 HTTP Ajax 请求,Cookie 就在那里 服务器按预期响应,更新 Cookie 浏览器发出 HTTPS Ajax 请求,Cookie 不再存在 (?!) 服务器给出“默认”响应,因为没有 Cookie(意外行为)

在任何人开始关于跨域请求的讲座之前,让我先声明几件事:

我知道这是一个跨域请求(不同的协议),这就是为什么服务器在响应中设置Access-Control-Allow-Origin标头(我使用的是Chrome和Firefox,两者都支持CORS) 不过,我还知道 HTTP cookie 应该可以通过 HTTPS 进行管理(请参阅 here),因为主机是相同的 (编辑)为通用域(例如 .domain.ext)正确设置了 cookie,并且没有设置 HttpOnly 和 Secure 标志

那么,为什么,为什么,为什么浏览器在进行 HTTPS Ajax 调用时不传递 cookie?有任何想法吗?我快疯了……

     +-----------+ HTTP Request     +-----------+
     |Browser    |+---------------->|Server     |
     +-----------+                  +-----------+

                   HTTP Response
                  <----------------+
                   Set-cookie

                   Ajax HTTP Req.
                  +---------------->
                   Cookie (OK)

                   HTTP Response
                  <----------------+
                   Set-cookie (OK)

                   Ajax HTTPS Req.
                  +---------------->
                   No Cookie (!!!)

【问题讨论】:

捕获 HTTP 请求转储并检查 Set-Cookie 语句中是否设置了任何 securehttp-only 标志。这至少是一个不错的起点。 ***.com/questions/5441836/… 看起来这是一个故意的限制。 谢谢,我已经读过了,但一点帮助都没有。首先,它说 https cookie 是加密的,这仅在传输过程中是正确的(否则浏览器将无法访问其数据)。给出的解释也违反了 cookie 规范,AFAIK。 【参考方案1】:

好的,找到cookie问题的解决方案了。

请参阅XHR specs、jQuery docs 和 ***。

在切换协议和/或子域时发送 cookie 的解决方案是将 withCredentials 属性设置为 true

例如(使用 jQuery)

 $.ajax( 
   /* Setup the call */
   xhrFields: 
     withCredentials: true
   
 );

【讨论】:

太棒了。你自己找到了答案。感谢分享。当人们找到答案并且不分享时,会有很多帖子。荣誉 NeXuS。 不幸的是我仍然无法让它工作......:D 谢谢,经过 2 天的尝试找出原因后,这​​对我有用【参考方案2】:

Document.cookie 和 Ajax Request 不共享 cookie。否则,ajax 无法从 document.cookie 或响应标头访问 cookie。它们只能由远程域控制。

如果您首先通过 ajax 从服务器获得包含 cookie 的响应,那么您可以请求通过 cookie 与服务器进行 ajax 通信。

对于这种情况,您可以编写如下代码(jQuery)

 $.ajax(
      xhrFields : 
           withCredentials : true
      
 );

见this article和demo

【讨论】:

以上是关于通过 HTTPS 的 HTTP Cookie 和 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中跨 HTTP 和 HTTPS 的 Cookie

HTTP 各种特性应用

强制 Tomcat 通过 http 使用安全的 JSESSIONID cookie

使用安全会话 cookie 在 HTTP 和 HTTPS 页面之间切换

HTTP和HTTPS

HTTP和HTTPS