source

jQuery의 .ajax() 메서드가 세션쿠키를 송신하지 않는 이유는 무엇입니까?

nicesource 2023. 3. 5. 09:54
반응형

jQuery의 .ajax() 메서드가 세션쿠키를 송신하지 않는 이유는 무엇입니까?

에서 한 후$.ajax() 번째 .$.ajax()해당 사이트에 대한 요청 - 그러나 FireBug를 사용하여 전송된 헤더를 확인해보니 요청에 세션 쿠키가 포함되어 있지 않습니다.

내가 뭘 잘못하고 있지?

저는 교차 도메인 시나리오로 작업하고 있습니다. 중 를 Set-Cookie 헤더와 반환하고 .Access-Control-Allow-Credentials true로 합니다.

리모트 서버에의 다음의 Ajax 콜에서는, 이 cookie 를 사용합니다.

의 CORSAccess-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"파라미터를 지정합니다.

답변: 다음을 사용하십시오.xhrFieldshttp://api.jquery.com/jQuery.ajax/의 param

이 문서의 예는 다음과 같습니다.

$.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]

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

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

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

에서 수 .www.domain-a.com가 「」로 있는 .www.domain-b.com (의 프라이버시를 하기 위해 크로스 도메인 호출을 했습니다.이 경우 브라우저는 사용자의 개인 정보를 보호하기 위해 쿠키를 보내지 않습니다.)

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

  • domain-b로 합니다.프록시는 호출 스크립트와 동일한 서버에 있으므로 브라우저에서 프록시를 호출할 수 있습니다.
    cookie name 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값 값.이 파라미터를 도메인 a로 송신할 수 있습니다.그러나 이 작업을 수행하려면 도메인에서 서버가 인증에 원하는 쿠키 이름과 값을 알아야 합니다.
  • JSON 개체를 가져오는 경우 대신 JSONP 요청을 사용하십시오.jQuery는 이러한 기능을 지원합니다.그러나 도메인 a에서 서비스를 변경하여 유효한 JSONP 응답을 반환해야 합니다.

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

사용.

xhrFields: { withCredentials:true }

jQuery ajax 콜의 일부로서, 그것은 솔루션의 일부에 지나지 않습니다.OPTIONS 응답으로 리소스에서 헤더를 반환해야 했습니다.

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

OPTIONS 콜의 응답 헤더에는 「*」가 아닌, 허가된 「origin」이 1개만 있는 것이 중요했습니다.요청에서 발신지를 읽고 응답에 다시 입력함으로써 이를 달성했습니다.제한의 원래 이유를 회피했을 가능성이 높지만, 제 사용의 경우 보안이 가장 중요한 것은 아닙니다.

W3C 표준에서는 공백 구분 목록을 허용하기 때문에 하나의 오리진에만 대한 요구사항을 명시적으로 언급할 가치가 있다고 생각합니다. 그러나 Chrome에서는 그렇지 않습니다! http://www.w3.org/TR/cors/ #access-control-allow-allow-response-bit NB는 "실행 중" 비트입니다.

이것을 init 함수에 넣습니다.

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

그건 작동할 것이다.

이 질문에는 이미 좋은 답변이 많이 있습니다만, 쿠키 도메인이 일치하기 때문에 세션 쿠키가 전송될 것으로 예상되지만, AJAX 요청이 다른 서브도메인으로 전송되고 있지 않은 경우를 명확하게 하는 것이 도움이 될 것 같습니다.이 경우 *.mydomain.com 도메인에 할당된 쿠키를 가지고 있으며, different.mydomain.com에 대한 AJAX 요청에 포함시키고 싶습니다."기본적으로는 cookie는 전송되지 않습니다.이 문제를 해결하기 위해 세션쿠키에서 HTTPONLY를 디세블로 할 필요는 없습니다.당신은 https://stackoverflow.com/a/23660618/545223)에서 제안한 대로만 하면 되고 다음을 하면 됩니다.

1) Ajax 요청에 다음 항목을 추가합니다.

xhrFields: { withCredentials:true }

2) 다른 서브도메인의 리소스에 대한 응답 헤더에 다음 항목을 추가합니다.

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

다른 솔루션을 시험해 보고도 제대로 작동하지 않아 제 케이스의 문제가 무엇인지 알게 되었습니다.내용을 변경했습니다."application/json"에서 "text/plain"으로 입력합니다.

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

저도 같은 문제가 있어서 몇 가지 확인을 해봤지만 sessionid cookie를 얻을 수 없었습니다.

브라우저의 sessionid cookie 값을 보고 프레임워크(Django)가 Http Only를 기본값으로 사용하여 sessionid cookie를 전달하고 있음을 알 수 있었습니다.즉, 스크립트는 sessionid 값에 액세스할 수 없으므로 요청과 함께 sessionid 값을 전달하지 않았습니다.접근제한이 필요한 Ajax를 사용하는 경우가 많은데 HttpOnly가 기본값이라는 것은 말도 안 됩니다.

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

을 개발 중인 경우localhost또는 localhost 상의 포트(예:localhost:8080위의 답변에서 설명한 절차 외에 Set-Cookie 헤더에 도메인 값을 전달하지 않도록 해야 합니다.
도메인을 다음과 같이 설정할 수 없습니다.localhostSet-Cookie 헤더에서 도메인을 생략합니다.

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

로컬 호스트 및 개발 환경에서 PHPSESSID 쿠키 문제를 설정하는 데 2센트만 있으면 됩니다.로카호스트의 REST API 엔드포인트에 AJAX 콜을 발신합니다.주소는 다음과 같습니다.mysite.localhost/api/member/login/(개발 환경의 추가 호스트).

  • Postman에서 이 요청을 하면 PHPSESSID가 응답으로 설정됩니다.

  • Browsersync 프록시 페이지에서 AJAX 경유로 이 엔드포인트를 요구할 때(예: 에서)122.133.1.110:3000/test/api/login.php내 브라우저 주소 줄에서 도메인이 다른지 확인합니다.mysite.localhost) 쿠키 사이에 PHPSESSID가 표시되지 않습니다.

  • 같은 도메인의 페이지에서 직접 이 요청을 하는 경우(즉,mysite.localhost/test/api/login.phpPHPSESSID는 정상적으로 설정되어 있습니다.

이것은 위의 @flu answer에서 설명한 바와 같이 원산지 간 요청 쿠키 문제입니다.

다른 사람에게 도움이 될 경우를 대비해서 시나리오와 솔루션을 추가합니다.RESTful API를 사용할 때도 비슷한 경우가 있었습니다.HTML/Script/CSS 파일을 호스팅하는 웹 서버와 API를 노출하는 응용 프로그램 서버가 동일한 도메인에서 호스팅되었습니다.하지만 그 길은 달랐다.

웹 서버 - mydomain/mydomain/mydomain.my

mycookie라는 쿠키 세트를 사용한 abc.cookie

app server - mydomain/webapis/myname.

api 호출이 이루어진 대상

mydomain/webapis/servicname에 쿠키가 있을 것으로 예상되어 읽으려고 했지만 전송이 되지 않았습니다.답변의 코멘트를 읽은 후 브라우저 개발 툴에서 mycookie의 경로가 "/webpages"로 설정되어 서비스 콜에서 사용할 수 없는 것을 확인했습니다.

mydomain/webapis/filename

그래서 jquery에서 쿠키를 설정하는 동안 이렇게 했습니다.

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

이 오류는 사이트 간 요청을 전송하려고 할 때 발생합니다.이 문제를 어떻게 해결할까요?

nginx 구성 파일에서 추가

add_header Access-Control-Allow-Origin '*.domain.com'
add_header Access-Control-Allow-Credentials 'true';

그리고 'domain.com'에서 Ajax 요청을 보내려고 합니다.

$.ajax({
   url: sub.domain.com,
   xhrFields: {
      withCredentials: true
   }
});

질문에 100% 대답하지는 못할지도 모르지만, 저는 세션 문제를 해결하기 위해 이노바스티오 에디터의 자산 관리자로부터 파일을 업로드 할 때 우연히 이 스레드를 발견했습니다.결국 솔루션은 간단했습니다. 플래시 업로더가 있습니다.디세이블화(설정)

var flashUpload = false;   

표시등이 다시 점멸하기 시작했습니다.

이러한 문제를 디버깅하는 것은 매우 어려울 수 있기 때문에 업로드 핸들러에 다음과 같은 것을 넣으면, 고객(이 경우는 저)이 올바른 방향으로 나아갈 수 있습니다.

$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

반응형