AJAX応答でCookieを設定できますか?


266

AJAX応答でCookieを設定できますか?そうでない場合、私の代替ソリューションは何ですか?Javascriptなどで設定する必要がありますか?


node.js Expressを使用しています。その場合、サーバー側でもhttpOnlyフィールドをfalseに設定する必要があるようです。
Chong Lip Phang

回答:


247

はい、サーバーは通常のリクエストとAJAXリクエストを区別できないため、通常のリクエストと同じように、サーバー側コードのAJAXリクエストにCookieを設定できます。

AJAXリクエストはサーバーへのリクエストの特別な方法に過ぎず、サーバーは他のHTTPリクエストと同様に応答する必要があります。リクエストの応答では、Cookieを追加できます。


39
CookieがHTTPエージェントによって受け入れられるかどうかは別の話であることを覚えておいてください。
Franci Penov 2010

6
@Franci:同意した。しかし、この質問はcookieをサポートするhttpクライアントに対してのみ意味があると思います。したがって、すべての質問者は、クッキーがAJAXリクエストで記述できるかどうかを知りたいだけです。つまり、彼のUAがクッキーをサポートすることを意味します:)
これ。__curious_geek

10
If the user agent supports HTTP State Management it should persist, discard and send cookies (as received in the Set-Cookie response header, and sent in the Cookie header) as applicable.-w3.org/TR/XMLHttpRequest
smwikipedia

12
これは、サーバーがSet-Cookieヘッダーを使用してajaxリクエストに応答できる場合に応答します。もちろん可能ですが、問題は、その応答が実際にクライアントがajax応答で受信したCookieを読み取って設定することになるのか、それとも手動で行う必要があるのか​​ということです。これはその答えではありません。
Alex

2
@Legendsアヤックスは通常、これは彼らが識別することができますが、要求は、このヘッダーなしで行うことができ、この問題が発生した場合には、通常のページのロードと区別することはできませんどのように、X-要求-でのXMLHttpRequestのヘッダーが設定されている要求
T0M

292

XMLHttpRequestのw3仕様セクション4.6.3によると、ユーザーエージェントはSet-Cookieヘッダーを尊重する必要があります。したがって、答えは「はい」です。

引用:

ユーザーエージェントがHTTP状態管理をサポートしている場合は、必要に応じて、Cookieを永続化、破棄、および送信します(Set-Cookie応答ヘッダーで受信され、Cookieヘッダーで送信されます)。


1
XHR応答の場合、IEは応答でSet-Cookieヘッダーをサポートしますか?
detj 2012年

リダイレクトする必要があるため、一部のブラウザではそれが尊重されません。
Walter Macambira 2015

1
Chromeを使用している場合、ajaxリクエストで受信したヘッダーは自動的にクライアントに適用されます。
Alex

サーバー側で応答をgzipに戻すと、Cookieが設定されないことがわかりました。それは仕様の一部であるはずですか、それとも単なる実装上の問題ですか?
juminoz 2017年

89

参考までに、AJAX呼び出しが同じドメインで行われた場合にのみ、上記のすべてが(まだ)当てはまることに注意してください。AJAXを使用して別のドメインにCookieを設定することを検討している場合は、まったく異なるワームの缶を開いていることになります。ただし、クロスドメインCookieの読み取りは機能します(または、少なくともサーバーがそれらにサービスを提供します。クライアントのUAがコードにアクセスを許可するかどうかは、ここでも別のトピックです。2014年の時点では機能しています)。


26
クロスドメインCookieを送信するには、withCredentialsフラグを設定する必要があります
aeosynth 2013年

5
クロスドメインシナリオでは、3つのことが発生する必要があります。-(1)クライアントwithCredentials=truexhrオブジェクトを設定する必要があります(2)Access-Control-Allow-CredentialsOPTIONSプリフライトリクエストと実際のリクエストの両方に設定する(3)必要に応じてCookieを設定する
Kunal

6

また、サーバーがHTTP以外のリクエストで安全なCookieを設定していないことを確認してください。私のajaxリクエストが "secure"が設定されたphpセッションを取得していることがわかりました。私はhttpsを使用していなかったため、セッションCookieが返されず、セッションは各ajaxリクエストでリセットされていました。


Ajaxセキュアが設定されているかどうかを確認できる場所を教えてください。
Ziumper

1
これは本当にajax固有のものではありません。安全でないhttp://
Phil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.