programing

AJAX 리디렉션 딜레마, 리디렉션 URL을 가져오는 방법 또는 리디렉션 요청에 대한 속성을 설정하는 방법

skycolor 2023. 8. 5. 10:00
반응형

AJAX 리디렉션 딜레마, 리디렉션 URL을 가져오는 방법 또는 리디렉션 요청에 대한 속성을 설정하는 방법

먼저, 도움이 된다면 구글 크롬에서 일하고 있습니다.동작은 다음과 같습니다.

xhr 요청을 jQuery를 통해 원격 사이트로 보냅니다(이것은 Chrome Extension이며, 교차 사이트 설정을 모두 설정했습니다...):

$.ajax({
    type: "POST",
    contentType : "text/xml",
    url: some_url,
    data: some_xml,
    username: user,
    password: pass,
    success: function(data,status,xhr){
        alert(data);
    },
    error: function(xhr, status, error){
        alert(xhr.status);
    }
});

설정 중인 URL은 302를 반환하고(이것은 예상됨), Chrome은 리디렉션을 따릅니다(또한 예상됨).

새 URL은 원래 요청에서 가져오지 않은 자격 증명에 대한 프롬프트를 반환하므로 Chrome에는 로그인 대화 상자가 표시됩니다.원본 자격 증명을 입력하면 잘못된 요청이 전송된 것에 대한 응답을 받습니다(유효한 HTTP 요청입니다. -- 200 -- 원격 서버는 헤더 중 하나를 좋아하지 않습니다.

크롬에서 개발자 창을 볼 때 두 가지 요청이 전송됩니다.첫 번째는 AJAX 요청에 모든 설정이 설정된 원래 URL에 대한 것입니다.두 번째는 리디렉션 URL에 대한 것으로, "GET" 메서드는 "POST" 필드에 아무것도 없고 자격 증명도 없습니다.

제가 무엇을 할 수 있을지 막막합니다.다음 중 하나가 필요합니다.

  1. 두 번째 수 URL을 가져옵니다(" URL").xhr.getResponseHeader("Location")하지 않음), 사용할수 없음,

  2. 새 리디렉션 요청이 원래 요청의 설정을 유지하도록 하십시오.

  3. 다른 요청을 보낼 수 있도록 오류가 발생한 최종 URL을 가져옵니다.

이상적으로는 사용자가 이 대화 상자에 자격 증명을 두 번 입력하지 않아도 되지만, 최종 URL만 얻을 수 있다면 얻을 수 있는 것을 가져올 것입니다.

당신의 질문에 따르면, 당신이 HTTP 인증을 말하는 것인지 아니면 양식 기반 인증 체계를 말하는 것인지 완전히 확신할 수 없기 때문에, 저는 두 가지 모두를 다룰 것입니다.

두 번째 요청을 보낼 수 있도록 리디렉션 URL을 가져옵니다(xhr.getResponseHeader("위치")가 작동하지 않음).

XHR이 일반적으로(특히 Chrome에서) 구축되는 방식: XHR은 매우 유연하지 않으며 브라우저가 다른 모든 요청(주소 표시줄 URL, 이미지 소스 URL, 내장된 스크립트 URL)에서 수행하는 것과 동일한 동작으로 비교적 높은 수준의 API를 제공합니다. 즉, 리디렉션이 투명하게 처리됩니다.JavaScript에서 이 리디렉션 또는 중간 302/301 상태 코드에 대해 경고하는 이벤트는 발생하지 않으며 최종 상태 코드와 데이터만 수신됩니다.따라서 최종 응답에 "위치" 헤더가 포함되지 않으므로 응답에서 "위치" 헤더를 검색할 수 없습니다.

새 리디렉션 요청이 원래 요청의 설정을 유지하도록 합니다.

XHR은 이 옵션을 옵션으로 제공하지 않으므로 잘못된 기본 동작입니다.기본값에 대해 이 문제가 발생하거나 발생하지 않아야 하는 이유에 대한 예:

Acme corp은 직원들을 위해 URL 바로 연결 서비스를 제공합니다.저는 동료로부터 받은 짧은 링크를 클릭하고 Acme의 짧은 링크 서비스로 HTTP 인증을 요청합니다.이 인증 후 리디렉션이 발생합니다.리디렉션되는 사이트에 내 자격 증명이 필요할 이유가 없으며, 따라서 브라우저가 이 정보를 전달하는 것은 잘못된 동작이며 실제로는 보안 문제입니다.마찬가지로 POST 데이터는 사전 직접 URL에서만 사용할 수 있으므로 전달해서는 안 됩니다.

다른 요청을 보낼 수 있도록 오류가 발생한 최종 URL을 가져옵니다.

안타깝게도 보안상의 이유와 표준 정의 때문에 표준 XHR 개체(Chrome이 확장자의 교차 사이트 요청에 사용하는 개체 포함)는 오류가 있는 최종 URL에 액세스할 수 있는 방법을 제공하지 않습니다.최종 HTTP 상태 및 최종 URL에서 반환된 모든 데이터에만 액세스할 수 있습니다.

--

이를 고려할 때 상황을 얼마나 제어할 수 있는지에 따라 다음과 같은 몇 가지 옵션이 옵션은 다음과 같습니다.

리디렉션 서버를 제어할 수 있는 경우 정보를 포함하는 것이 좋습니다.AJAX 클라이언트를 나타내는 AJAX 요청에서 서버가 리디렉션을 수행해야 함을 나타내는 데이터(즉, json 개체)를 반환하도록 합니다.

또는 항상 인증 데이터를 전달하려는 경우 세션 전달 또는 인증 정보를 포함하는 몇 가지 메커니즘을 구현하는 것이 좋습니다.대상 URL이 이 정보를 사용할 수 있도록 리디렉션되는 URL입니다.

리디렉션의 대상을 제어할 수 있는 경우 인증 실패 페이지를 생성할 때 대상의 URL을 포함하는 것이 좋습니다.XHR 개체는 이 응답 데이터에 액세스할 수 있으며 이를 구문 분석하여 새 요청을 진행할 수 있습니다.

리디렉션 사이트 또는 대상 사이트에 대한 제어 권한이 없는 경우, 요청을 처리하고 302의 요청을 수신하기 위해 프록시 서버를 호스팅하는 것이 좋습니다.

http://myserver/?url=http://redirectsite.com&user=...&pass=...

위의 옵션이 모두 없는 경우 가장 바람직하지는 않지만 실행 가능한 옵션은 네이티브 코드를 실행하는 Chrome용 NPAPI 확장을 구축하는 것입니다.이렇게 하면 요청을 완전히 제어할 수 있으며 거의 모든 작업을 수행할 수 있습니다.그러나 이는 더 복잡한 개발, 잠재적인 보안 문제 및 사용자 만족도 저하를 초래합니다.

안타깝게도 xhr이 리디렉션을 자동으로 따르는 것을 방지하거나 리디렉션 대상에 대한 자격 증명을 설정하는 방법은 없습니다(첫 번째 사이트가 자격 증명을 원하는 사이트뿐만 아니라 다른 사이트로도 리디렉션할 수 있기 때문에 어쨌든 안전하지 않습니다).

여기에 설명된 솔루션 유형을 사용해 볼 수 있습니다.jQuery Ajax 호출 후 리디렉션 요청 관리 방법

즉, 실제로 HTTP 프로토콜을 대체하므로 서버도 제어해야 합니다.모든 Ajax 응답은 json 개체가 아닌 코드 200(또는 401/403이 아닌 3xx 응답)입니다.그리고 이 json 객체에서 당신은 몇 가지 특별한 오류 코드를 제공할 수 있습니다 (왜 재사용하지 않습니까?

그런 다음 jQuery.jax 함수를 확장하여 json 응답에 이러한 특수 코드를 캡처하고 필요한 새 요청을 작성합니다.실제로 자동 jQuery 리디렉션 호출은 jQuery가 아닌 사용자가 수행합니다.

처음에 이것은 보기 흉하게 보이지만, 링크에서 제안된 문제(세션 종료, 로그인 페이지에서 리디렉션)와 같은 문제를 처리할 때 클라이언트와 서버 간의 통신에서 Ajax json에서 완전한 프로토콜 처리를 하는 것은 나쁜 생각이 아닌 것 같습니다.

서버를 제어하는 경우, 리디렉션 주소 자체에 손실된 데이터를 포함할 수 있습니다.따라서 xhr은 POST를 수행한 다음 GET 매개 변수로 (서버에 의해) 다시 인코딩되는 일부 POST 데이터를 사용하여 GET를 수행합니다.다른 해결책은 제시되지 않습니다...

Rajiv M.이 위에서 언급했듯이, 당신은 XHL Object 또는 AJAX 요청을 사용하여 302개의 리디렉션을 잡을 수 없습니다.

가장 좋은 방법은 PHP/ASP 또는 서버 측 스크립팅 언어로 프록시를 설정하는 것입니다.PHP 스크립트는 최종 목적지에 도달할 때까지 302개의 리디렉션을 따라갑니다.그런 다음 최종 URL을 JavaScript 페이지로 다시 보낼 수 있습니다.이제 향후 AJAX 요청을 알려진 최종 URL로 직접 전송할 수 있습니다.

아니면...

PHP 스크립트는 프록시 역할을 할 뿐입니다.모든 요청은 이 PHP 스크립트로 전송됩니다.

아니면...

가능하면 최종 URL을 JavaScript 응용 프로그램에 하드코드하십시오(당신의 경우에는 불가능하다고 생각합니다).

죄송합니다. "당신은 이것을 할 수 없습니다"라는 대답도 싫지만, 아직 해결되지 않은 자바스크립트 제한이 있습니다.

리디렉션에 사용하던 windows.location="newURL"을 사용할 수 없습니까?

언급URL : https://stackoverflow.com/questions/2800982/ajax-redirect-dilemma-how-to-get-redirect-url-or-how-to-set-properties-for-redi

반응형