Programing

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

lottogame 2020. 3. 7. 00:16
반응형

왜 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"플래그 일 수 있습니다.


위의 답변에 설명 된 단계 외에도 localhost로컬 호스트 에서 또는 포트와 같은 포트를 개발하는 localhost:8080경우 Set-Cookie 헤더의 도메인 값을 전달하지 않아야합니다. Set-Cookie 헤더에서
도메인을 설정할 수 없습니다. localhost올바르지 않습니다. 도메인을 생략하면됩니다.

명시 적 도메인이 있는 localhost의 쿠키asp.net이 localhost에서 쿠키를 생성하지 않는 이유를 참조하십시오 .


localhost 및 dev 환경에서 PHPSESSID 쿠키 문제를 설정하는 데 2 ​​센트. locahost에서 REST API 엔드 포인트에 대한 AJAX 호출을 작성합니다. 주소가 mysite.localhost/api/member/login/(내 개발 환경의 가상 호스트) 라고 말하십시오 .

  • Postman 에서이 요청을 수행하면 문제가 없으며 PHPSESSID가 응답으로 설정됩니다.

  • Browsersync 프록시 페이지 (예 : 122.133.1.110:3000/test/api/login.php브라우저 주소 표시 줄)에서 AJAX를 통해이 엔드 포인트를 요청하면 mysite.localhost쿠키간에 PHPSESSID가 나타나지 않습니다.

  • 같은 도메인의 페이지에서 직접 요청하면 (예 : mysite.localhost/test/api/login.phpPHPSESSID) 제대로 설정됩니다.

따라서 이것은 위의 @flu answer 에서 언급 한 출처 간 요청 쿠키 문제입니다.


다른 사람을 도울 수 있도록 시나리오와 솔루션을 추가하십시오. RESTful API를 사용할 때 비슷한 경우가 발생했습니다. HTML / Script / CSS 파일을 호스팅하는 웹 서버와 API를 노출하는 Application Server가 동일한 도메인에서 호스팅되었습니다. 그러나 경로는 달랐습니다.

웹 서버 -mydomain / webpages /abc.html

mycookie 라는 쿠키를 설정 하는 abc.js사용 했습니다.

앱 서버 -mydomain / webapis / servicename

API 호출을 한 사람

mydomain / webapis / servicename의 쿠키를 예상하고 그것을 읽으려고했지만 전송되지 않았습니다. 답변에서 의견을 읽은 후 브라우저 개발 도구에서 mycookie의 경로가 "/ webpages " 로 설정 되어 서비스 호출에서 사용할 수 없음을 확인했습니다.

mydomain / webapis / servicename

jquery에서 쿠키를 설정하는 동안 이것이 내가 한 일입니다.

$.cookie("mycookie","mayvalue",{**path:'/'**});

아마도 100 % 질문에 대답하지는 않았지만 innovastudio 편집기의 자산 관리자에서 파일 업로드를 아약스 게시 할 때 세션 문제를 해결하기 위해이 스레드를 우연히 발견했습니다. 결국 솔루션은 간단했습니다. 플래시 업 로더가 있습니다. 비활성화 (설정

var flashUpload = false;   

in asset.php)와 표시등이 다시 깜박이기 시작했습니다.

이러한 문제를 디버깅하기가 매우 어려울 수 있으므로 업로드 핸들러에 다음과 같은 것을 넣으면 올바른 트랙에 당신을 설정할 수 있습니다.

$sn=session_name();
error_log("session_name: $sn ");

if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");

로그에 뛰어 들었고 쿠키가 전송되지 않은 누락 된 세션을 빠르게 발견했습니다.

참고 URL : https://stackoverflow.com/questions/2870371/why-is-jquerys-ajax-method-not-sending-my-session-cookie



반응형