스크립트를 사용한 인증
이 섹션에서는 WinHttpRequest 개체를 사용하여 HTTP 인증이 필요한 서버의 데이터에 액세스하는 스크립트를 작성하는 방법을 보여 줍니다.
필수 구성 요소 및 요구 사항
이 예제에서는 Microsoft JScript에 대한 실무 지식 외에도 다음이 필요합니다.
- Microsoft SDK(Windows 소프트웨어 개발 키트)의 현재 버전입니다.
- 인터넷에 대한 연결이 프록시 서버를 통해 있는 경우 Microsoft Windows HTTP 서비스(WinHTTP)에 대한 프록시 설정을 설정하는 프록시 구성 도구입니다. 자세한 내용은 프록시 구성 도구인Proxycfg.exe 참조하세요 .
- 네트워크 용어 및 개념에 대해 잘 알고 있습니다.
인증을 사용하여 웹 사이트에 액세스
인증을 보여 주는 스크립트를 만들려면 다음을 수행합니다.
Microsoft 메모장과 같은 텍스트 편집기를 엽니다.
"[authenticationSite]"를 적절한 텍스트로 바꾼 후 다음 코드를 텍스트 편집기에 복사하여 HTTP 인증이 필요한 사이트의 URL을 지정합니다.
// Load the WinHttpRequest object. var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); function getText1( ) { // Specify the target resource. WinHttpReq.open( "GET", "https://[authenticationSite]", false; // Send a request to the server and wait for a response. WinHttpReq.send( ); // Display the results of the request. WScript.Echo( "No Credentials: " ); WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText); WScript.Echo( WinHttpReq.GetAllResponseHeaders); WScript.Echo( ); }; function getText2( ) { // HttpRequest SetCredentials flags HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0; // Specify the target resource. WinHttpReq.open( "GET", "https://[authenticationSite]", false ); // Set credentials for server. WinHttpReq.SetCredentials( "User Name", "Password", HTTPREQUEST_SETCREDENTIALS_FOR_SERVER); // It might also be necessary to supply credentials // to the proxy if you connect to the Internet // through a proxy that requires authentication. // Send a request to the server and wait for // a response. WinHttpReq.send( ); // Display the results of the request. WScript.Echo( "Credentials: " ); WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText ); WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) ); WScript.Echo( ); }; getText1( ); getText2( );
파일을 "Auth.js"로 저장합니다.
명령 프롬프트에서 "cscript Auth.js"를 입력하고 Enter 키를 누릅니다.
이제 두 가지 방법으로 리소스를 요청하는 프로그램이 있습니다. 첫 번째 메서드는 자격 증명을 제공하지 않고 리소스를 요청합니다. 서버에 인증이 필요함을 나타내기 위해 401 상태 코드가 반환됩니다. 응답 헤더도 표시되며 다음과 유사하게 표시됩니다.
Connection: Keep-Alive
Content-Length: 0
Date: Fri, 27 Apr 2001 01:47:18 GMT
Content-Type: text/html
Server: Microsoft-IIS/5.0
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
Cache-control: private
응답은 리소스에 대한 액세스가 거부되었음을 나타내지만 리소스에 대한 일부 정보를 제공하는 여러 헤더를 반환합니다. "WWW-Authenticate"라는 헤더는 서버에 이 리소스에 대한 인증이 필요했음을 나타냅니다. "Proxy-Authenticate"라는 헤더가 있는 경우 프록시 서버에 인증이 필요함을 나타냅니다. 각 인증 헤더에는 사용 가능한 인증 체계와 경우에 따라 영역이 포함됩니다. 영역 값은 대/소문자를 구분하며 동일한 자격 증명을 수락해야 하는 서버 또는 프록시 집합을 정의합니다.
여러 인증 체계가 지원됨을 나타내는 "WWW-Authenticate"라는 두 개의 헤더가 있습니다. GetResponseHeader 메서드를 호출하여 "WWW-Authenticate" 헤더를 찾는 경우 메서드는 해당 이름의 첫 번째 헤더 내용만 반환합니다. 이 경우 "NTLM" 값을 반환합니다. 헤더의 모든 발생이 처리되도록 하려면 GetAllResponseHeaders 메서드를 대신 사용합니다.
두 번째 메서드 호출은 동일한 리소스를 요청하지만 먼저 SetCredentials 메서드를 호출하여 인증 자격 증명을 제공합니다. 다음 코드 섹션에서는 이 메서드를 사용하는 방법을 보여 있습니다.
WinHttpReq.SetCredentials( "User Name", "Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
이 메서드는 사용자 이름을 "UserName"으로 설정하고 암호를 "암호"로 설정하고 권한 부여 자격 증명이 리소스 서버에 적용됨을 나타냅니다. 인증 자격 증명을 프록시로 보낼 수도 있습니다.
자격 증명이 제공되면 서버는 문서를 검색할 수 있음을 나타내는 200 상태 코드를 반환합니다.
상태 코드 확인
이전 예제는 지침이지만 사용자가 자격 증명을 명시적으로 제공해야 합니다. 필요할 때 자격 증명을 제공하고 필요하지 않은 경우 자격 증명을 제공하지 않는 애플리케이션이 더 유용합니다. 이 작업을 수행하는 기능을 구현하려면 예제를 수정하여 응답과 함께 반환된 상태 코드를 검사해야 합니다.
설명과 함께 가능한 상태 코드의 전체 목록은 HTTP 상태 코드를 참조하세요. 그러나 이 예제에서는 세 가지 코드 중 하나만 발생합니다. 상태 코드 200은 리소스를 사용할 수 있고 응답과 함께 전송되고 있음을 나타냅니다. 상태 코드 401은 서버에 인증이 필요했음을 나타냅니다. 상태 코드 407은 프록시에 인증이 필요했음을 나타냅니다.
"getText2" 함수를 다음 코드로 바꿔서 마지막 섹션에서 만든 예제를 수정합니다("[authenticationSite]"를 사용자 고유의 텍스트로 바꿔 HTTP 인증이 필요한 사이트의 URL을 지정합니다.)
function getText2() {
WScript.Echo( "Credentials: " );
// HttpRequest SetCredentials flags.
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;
// Specify the target resource.
var targURL = "https://[authenticationSite]";
WinHttpReq.open( "GET", targURL, false );
var Done = false;
var Attempts = 0;
do
{
// Keep track of the number of request attempts.
Attempts++;
// Send a request to the server and wait for a response.
WinHttpReq.send( );
// Obtain the status code from the response.
var Status = WinHttpReq.Status;
switch (Status)
{
// A 200 status indicates that the resource was retrieved.
case 200:
Done = true;
break;
// A 401 status indicates that the server
// requires authentication.
case 401:
WScript.Echo( "Requires Server UserName and Password." );
// Specify the target resource.
WinHttpReq.open( "GET", targURL, false );
// Set credentials for the server.
WinHttpReq.SetCredentials( "User Name",
"Password",
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
break;
// A 407 status indicates that the proxy
// requires authentication.
case 407:
WScript.Echo( "Requires Proxy UserName and Password." );
// Specify the target resource.
WinHttpReq.open( "GET", targURL, false );
// Set credentials for the proxy.
WinHttpReq.SetCredentials( "User Name",
"Password",
HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
break;
}
} while( ( !Done ) && ( Attempts < 3 ) );
// Display the results of the request.
WScript.Echo( WinHttpReq.Status + " " + WinHttpReq.StatusText );
WScript.Echo( WinHttpReq.GetAllResponseHeaders( ) );
WScript.Echo( );
};
다시 파일을 저장하고 실행합니다. 두 번째 메서드는 여전히 문서를 검색하지만 필요한 경우에만 자격 증명을 제공합니다. "getText2" 함수는 인증이 필요하지 않은 것처럼 Open 및 Send 메서드를 실행합니다. 상태 Status 속성을 사용하여 검색되고 switch 문은 결과 상태 코드에 응답합니다. 상태 401(서버에 인증 필요) 또는 407(프록시에 인증 필요)이면 Open 메서드가 다시 실행됩니다. 그 다음에는 사용자 이름과 암호를 설정하는 SetCredentials 메서드가 뒤따릅니다. 그런 다음 코드는 Send 메서드로 다시 반복됩니다. 세 번의 시도 끝에 리소스를 성공적으로 검색할 수 없는 경우 함수는 실행을 중지합니다.
관련 항목