[jquery] 왜 jquery의 .ajax () 메소드가 세션 쿠키를 보내지 않습니까?

$.ajax()사이트 를 통해 로그인 한 후 $.ajax()해당 사이트에 두 번째 요청 을 보내려고합니다. 그러나 FireBug를 사용하여 전송 된 헤더를 확인하면 요청에 세션 쿠키가 포함되지 않습니다.

내가 뭘 잘못하고 있죠?



답변

호출하는 URL이 호출 스크립트와 동일한 도메인에있는 경우 AJAX 호출은 쿠키를 보냅니다.

도메인 간 문제 일 수 있습니다.

www.domain-a.com호출 스크립트가 켜져있는 동안 URL을 호출하려고 시도했을 수 있습니다 www.domain-b.com(즉, 크로스 도메인 호출을 한 경우 브라우저는 개인 정보를 보호하기 위해 쿠키를 보내지 않습니다).

이 경우 옵션은 다음과 같습니다.

  • 도메인 b에 상주하고 요청을 도메인 a로 전달하는 작은 프록시를 작성하십시오. 브라우저는 프록시가 호출 스크립트와 동일한 서버에 있기 때문에 프록시를 호출 할 수 있습니다.
    그런 다음이 프록시를 도메인 a로 보낼 수있는 쿠키 이름 및 값 매개 변수를 승인하도록 구성 할 수 있습니다. 그러나 이것이 작동하려면 쿠키의 이름과 도메인의 서버 가치를 알아야합니다. 인증을 원합니다.
  • JSON 객체를 가져 오는 경우 대신 JSONP 요청을 사용하십시오. jQuery는이를 지원합니다. 그러나 유효한 JSONP 응답을 반환하도록 도메인 a에서 서비스를 변경해야합니다.

그것이 조금이라도 도움이된다면 기쁘다.


답변

도메인 간 시나리오에서 작업하고 있습니다. 로그인하는 동안 원격 서버는 Set-Cookie 헤더 Access-Control-Allow-Credentials를 true 로 설정하여 반환 합니다.

원격 서버에 대한 다음 ajax 호출은이 쿠키를 사용해야합니다.

CORS Access-Control-Allow-Credentials는 도메인 간 로깅을 허용합니다. 예는 https://developer.mozilla.org/En/HTTP_access_control 을 확인 하십시오 .

나에게 그것은 JQuery의 버그 (또는 적어도 다음 버전의 기능) 인 것 같습니다.

최신 정보:

  1. 쿠키가 AJAX 응답에서 자동으로 설정되지 않습니다 (인용 : http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/ )

    왜?

  2. 응답에서 쿠키 값을 가져와 수동으로 설정할 수는 없습니다 ( http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader )

    혼란 스러워요 ..

    매개 변수 jquery.ajax()설정 을 요청하는 방법이 있어야합니다 XMLHttpRequest.withCredentials = "true".

답변 : http://api.jquery.com/jQuery.ajax/의xhrFields 매개 변수를
사용해야합니다

설명서의 예는 다음과 같습니다.

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

서버가이 요청에 올바르게 응답하는 것도 중요합니다. @ Frédéric 및 @Pebbl의 훌륭한 의견을 여기에 복사하십시오.

Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *

따라서 요청이 다음과 같은 경우

Origin: http://foo.example
Cookie: pageAccess=2

서버는 다음과 같이 응답해야합니다.

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true

[payload]

그렇지 않으면 페이로드가 스크립트로 반환되지 않습니다. 참조 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials


답변

사용

xhrFields: { withCredentials:true }

내 jQuery ajax 호출의 일부로 솔루션의 일부였습니다. 또한 리소스에서 OPTIONS 응답으로 헤더를 반환해야했습니다.

Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true

단지 것이 중요 하나 “출처”를 허용하는 옵션이 호출의 응답 헤더에 있었고, 하지 “*”. 요청의 출처를 읽고 응답에 다시 입력하여이를 달성했습니다. 아마도 제한의 원래 이유를 피할 수는 있지만 사용 사례에서는 보안이 가장 중요하지 않습니다.

W3C 표준은 공백으로 구분 된 목록을 허용하기 때문에 하나의 원점에 대한 요구 사항을 명시 적으로 언급 할 가치가 있다고 생각했지만 Chrome은 그렇지 않습니다!
http://www.w3.org/TR/cors/#access-control-allow-origin-response-header
NB “실제”비트.


답변

이것을 init 함수에 넣으십시오.

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});

작동합니다.


답변

이미이 질문에 대한 좋은 답변이 많이 있지만 쿠키 도메인이 일치하기 때문에 세션 쿠키가 전송 될 것으로 예상되는 경우를 명확히하는 것이 도움이 될 수 있다고 생각했지만 AJAX 요청이 있기 때문에 전송되지 않습니다. 다른 하위 도메인으로 만들어지고 있습니다. 이 경우 * .mydomain.com 도메인에 할당 된 쿠키가 있으며 different.mydomain.com ” 에 대한 AJAX 요청에 포함 시키려고 합니다 . 기본적으로 쿠키는 전송되지 않습니다. 이 문제를 해결하기 위해 세션 쿠키에서 HTTPONLY를 비활성화 할 필요는 없으며, 제안 된 작업 ( https://stackoverflow.com/a/23660618/545223 ) 만 수행하고 다음을 수행하면됩니다.

1) 아약스 요청에 다음을 추가하십시오.

xhrFields: { withCredentials:true }

2) 다른 하위 도메인의 리소스에 대한 응답 헤더에 다음을 추가하십시오.

Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true


답변

다른 솔루션을 시도했지만 여전히 작동하지 않는 경우 문제가 무엇인지 알아 냈습니다. contentType을 “application / json”에서 “text / plain”으로 변경했습니다.

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});


답변

나는이 같은 문제가 있었고 스크립트가 단순히 sessionid 쿠키를 얻지 못하고 있는지 확인했습니다.

내 프레임 워크 (Django)가 기본적으로 HttpOnly를 사용하여 sessionid 쿠키를 전달하고 있음을 브라우저에서 sessionid 쿠키 값을 확인하여 알아 냈습니다. 이는 스크립트가 sessionid 값에 액세스 할 수 없으므로 요청과 함께 전달하지 않았 음을 의미합니다. 많은 것들이 액세스 제한이 필요한 Ajax를 사용할 때 HttpOnly가 기본값이 될 것이라는 것은 우스운 일입니다.

이 문제를 해결하기 위해 설정 (SESSION_COOKIE_HTTPONLY = False)을 변경했지만 다른 경우 쿠키 경로에서 “HttpOnly”플래그 일 수 있습니다.