AJAX 응답이 쿠키를 설정할 수 있습니까?


266

AJAX 응답이 쿠키를 설정할 수 있습니까? 그렇지 않은 경우 대체 솔루션은 무엇입니까? Javascript 또는 이와 유사한 것으로 설정해야합니까?


node.js Express를 사용하고 있습니다. 그렇게하면 서버 쪽에서 httpOnly 필드를 false로 설정해야합니다.
Chong Lip Phang

답변:


247

, 서버는 일반 요청과 AJAX 요청을 구별 할 수 없으므로 일반 요청과 마찬가지로 서버 측 코드에서 AJAX 요청에 쿠키를 설정할 수 있습니다.

AJAX 요청은 서버에 요청하는 특별한 방법이므로 서버는 모든 HTTP 요청에서와 같이 응답해야합니다. 요청에 대한 응답으로 쿠키를 추가 할 수 있습니다.


39
HTTP 에이전트가 쿠키를 사용할 것인지의 여부는 또 다른 이야기입니다.
Franci Penov

6
@Franci : 동의했습니다. 그러나 쿠키를 지원하는 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 요청에 응답 할 수 있으면 응답합니다. 물론 그럴 수는 있지만, 그 응답이 실제로 클라이언트가 아약스 응답으로 수신 된 쿠키를 읽고 설정하는지 또는 수동으로 수행해야하는지의 여부입니다. 이것은 답이 아닙니다.
Alex

2
@Legends 아약스는 일반적으로는 X-요청-으로 XMLHttpRequest의에 헤더 설정이 그들이 식별 할 수있는 방법이지만,이 그것이 정상적인 페이지로드 구별 할 수없는 발생할 경우 요청이이 헤더없이 할 수있다하는 요청
T0m

292

XMLHttpRequest대한 w3 사양 섹션 4.6.3에 따르면 사용자 에이전트는 Set-Cookie 헤더를 준수 해야합니다. 대답은 '그렇다'입니다.

인용:

사용자 에이전트가 HTTP 상태 관리를 지원하는 경우 쿠키를 유지하고 버리고 쿠키를 보내십시오 (Set-Cookie 응답 헤더에서 수신되고 쿠키 헤더에서 전송 됨).


1
XHR 응답의 경우 IE가 응답에서 Set-Cookie 헤더를 지원합니까?
detj

리디렉션 중이어야하며 일부 브라우저에서는 그렇지 않습니다.
Walter Macambira

1
Chrome을 사용하는 경우 ajax 요청으로 수신 된 헤더가 자동으로 클라이언트에 적용됩니다.
Alex

서버 측에서 응답을 gzip으로 다시 설정하면 쿠키가 설정되지 않습니다. 그것이 사양의 일부로 간주됩니까? 아니면 구현 문제입니까?
juminoz

89

기록을 위해, AJAX 호출이 동일한 도메인에서 이루어진 경우에만 위의 모든 사항이 (아직도) 참임을 명심하십시오. AJAX를 사용하여 다른 도메인에서 쿠키를 설정하려는 경우 완전히 다른 웜 캔을 여는 것 입니다. 그러나 도메인 간 쿠키를 읽는 것은 효과가 있습니다 (또는 최소한 서버에서 쿠키를 제공합니다. 클라이언트의 UA가 코드에 액세스하도록 허용하는지 여부는 2014 년 현재 다른 주제입니다).


26
도메인 간 쿠키를 보내려면 withCredentials 플래그
aeosynth를

5
도메인 간 시나리오의 경우 3 가지 상황이 발생해야합니다 .- (1) 클라이언트가 객체에 withCredentials=true대해 설정해야 xhr합니다. (2) Access-Control-Allow-CredentialsOPTIONS 프리 플라이트 요청과 실제 요청 모두에 설정 합니다. (3) 쿠키를 필요에 따라 설정합니다
Kunal

6

또한 서버가 http가 아닌 요청에 보안 쿠키를 설정하지 않았는지 확인하십시오. 내 아약스 요청에 "보안"이 설정된 PHP 세션이 있다는 것을 알았습니다. https를 사용하지 않았기 때문에 세션 쿠키를 다시 보내지 않고 각 아약스 요청에서 세션이 재설정되었습니다.


어디에서 아약스 보안이 설정되어 있는지 확인할 수 있습니까?
Ziumper

1
실제로 아약스와 관련이 없습니다. 안전하지 않은 http : //
Phil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.