스크립트를 사용한 인증

이 섹션에서는 WinHttpRequest 개체를 사용하여 HTTP 인증이 필요한 서버의 데이터에 액세스하는 스크립트를 작성하는 방법을 보여 줍니다.

필수 구성 요소 및 요구 사항

이 예제에서는 Microsoft JScript에 대한 실무 지식 외에도 다음이 필요합니다.

  • Microsoft SDK(Windows 소프트웨어 개발 키트)의 현재 버전입니다.
  • 인터넷에 대한 연결이 프록시 서버를 통해 있는 경우 Microsoft Windows HTTP 서비스(WinHTTP)에 대한 프록시 설정을 설정하는 프록시 구성 도구입니다. 자세한 내용은 프록시 구성 도구인Proxycfg.exe 참조하세요 .
  • 네트워크 용어 및 개념에 대해 잘 알고 있습니다.

인증을 사용하여 웹 사이트에 액세스

인증을 보여 주는 스크립트를 만들려면 다음을 수행합니다.

  1. Microsoft 메모장과 같은 텍스트 편집기를 엽니다.

  2. "[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( );
    
  3. 파일을 "Auth.js"로 저장합니다.

  4. 명령 프롬프트에서 "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" 함수는 인증이 필요하지 않은 것처럼 OpenSend 메서드를 실행합니다. 상태 Status 속성을 사용하여 검색되고 switch 문은 결과 상태 코드에 응답합니다. 상태 401(서버에 인증 필요) 또는 407(프록시에 인증 필요)이면 Open 메서드가 다시 실행됩니다. 그 다음에는 사용자 이름과 암호를 설정하는 SetCredentials 메서드가 뒤따릅니다. 그런 다음 코드는 Send 메서드로 다시 반복됩니다. 세 번의 시도 끝에 리소스를 성공적으로 검색할 수 없는 경우 함수는 실행을 중지합니다.

WinHTTP의 인증

WinHttpRequest

SetCredentials

HTTP/1.1 주석 요청(RFC 2616)