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의 버그(또는 적어도 다음 버전에서는 기능)인 것 같습니다.
갱신:
쿠키는 AJAX 응답에서 자동으로 설정되지 않습니다(http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)).
왜요?
수동으로 설정하기 위해 응답에서 쿠키 값을 가져올 수 없습니다(http://www.w3.org/TR/XMLHttpRequest/ #dom-xmlhttprequest-getresponseheader).
헷갈리네요.
예요.
jquery.ajax()
XMLHttpRequest.withCredentials = "true"
파라미터를 지정합니다.
답변: 다음을 사용하십시오.xhrFields
http://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 헤더에 도메인 값을 전달하지 않도록 해야 합니다.
도메인을 다음과 같이 설정할 수 없습니다.localhost
Set-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.php
PHPSESSID는 정상적으로 설정되어 있습니다.
이것은 위의 @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
'source' 카테고리의 다른 글
비활성 JSON 문자열을 자동으로 수정하려면 어떻게 해야 합니까? (0) | 2023.03.05 |
---|---|
상위 구성 요소의 하위 구성 요소 참조에 액세스하는 방법 (0) | 2023.03.05 |
Chai: '해야' 구문을 사용하여 정의되지 않았는지 테스트하는 방법 (0) | 2023.03.05 |
wordpress 관리 사이드바에 사용자 정의 링크를 추가하는 방법 (0) | 2023.03.05 |
현재 상태를 새로고침하려면 어떻게 해야 합니까? (0) | 2023.03.05 |