web-dev-qa-db-ja.com

HTTPSを介したHTTP CookieとAjaxリクエスト

これはさまざまな形で以前に尋ねられたことを知っていますが、問題を回避することはできないようです。 jQueryとネイティブJS APIの両方を使用してAjaxリクエストを作成しようとしました。

私の状況は次のとおりです(添付図を参照):

  1. ブラウザがHTTPリクエストを行います
  2. サーバーが応答し、永続的なCookieを設定します
  3. ブラウザはHTTP Ajaxリクエストを行いますが、Cookieは大丈夫です
  4. サーバーは期待どおりに応答し、Cookieを更新します
  5. ブラウザはHTTPS Ajaxリクエストを行い、Cookieはもう存在しません(?!)
  6. Cookie(意図しない動作)がないため、サーバーは「デフォルト」応答を返します

クロスドメインリクエストに関する講義を開始する前に、いくつかのことを説明します。

  • これはクロスドメインリクエスト(異なるプロトコル)であり、サーバーがAccess-Control-Allow-Origin応答のヘッダー(およびChromeとFirefox、どちらも [〜#〜] cors [〜#〜] をサポートしています)
  • ただし、ホストが同じであるため、HTTP CookieはHTTPS経由で管理できる必要があります( here を参照)
  • (編集)Cookieは一般的なドメイン(.domain.extなど)に対して適切に設定されており、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 (!!!)
43
NeXuS

OK、クッキーの問題の解決策を見つけました。

XHR仕様jQuery docs および StackOverflow を参照してください。

プロトコルやサブドメインを切り替えるときにCookieを送信する解決策は、withCredentialsプロパティをtrueに設定することです。

例えば。 (jQueryを使用)

 $.ajax( {
   /* Setup the call */
   xhrFields: {
     withCredentials: true
   }
 });
72
NeXuS