왜 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의 버그 (또는 적어도 다음 버전의 기능)처럼 보입니다.
최신 정보:
쿠키가 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"
.
답변 : 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.php
PHPSESSID) 제대로 설정됩니다.
따라서 이것은 위의 @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
'Programing' 카테고리의 다른 글
Ruby의 문자열 보간에 해당하는 Python이 있습니까? (0) | 2020.03.07 |
---|---|
다른 지점으로 커밋 푸시 (0) | 2020.03.07 |
파이썬에서 문자열 끝에서 부분 문자열을 어떻게 제거합니까? (0) | 2020.03.07 |
Date.parse가 왜 잘못된 결과를 줍니까? (0) | 2020.03.06 |
파이썬 : '사전'이 비어 있는지 확인하면 작동하지 않는 것 같습니다. (0) | 2020.03.06 |