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.