WinHTTP의 Passport 인증

WinHTTP(Microsoft Windows HTTP 서비스)는 Microsoft Passport 인증 프로토콜의 클라이언트 쪽 사용을 완벽하게 지원합니다. 이 항목에서는 Passport 인증과 관련된 트랜잭션 및 처리 방법에 대한 개요를 제공합니다.

참고

WinHTTP 5.1에서는 Passport 인증이 기본적으로 사용하지 않도록 설정됩니다.

 

Passport 1.4

Passport는 Microsoft .NET 빌딩 블록 서비스의 핵심 구성 요소입니다. 이를 통해 기업은 광범위한 애플리케이션에서 분산 웹 서비스를 개발하고 제공할 수 있으며, 구성원이 참여하는 모든 웹 사이트에서 하나의 로그인 이름과 암호를 사용할 수 있습니다.

WinHTTP는 Passport 1.4 인증에 대한 클라이언트 쪽 프로토콜을 구현하여 Microsoft Passport 1.4에 대한 플랫폼 지원을 제공합니다. Windows XP의 Passport 인프라 및 저장된 사용자 이름 및 암호와 상호 작용하는 세부 정보에서 애플리케이션을 해제합니다. 이 추상화는 Passport를 개발자의 관점에서 사용하는 것이 기본 또는 다이제스트와 같은 기존 인증 체계를 사용하는 것과 다르지 않습니다.

Windows XP:HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Passport\NumRegistrationRuns 레지스트리 키는 PassPort 인증이 필요할 때 Passport 인증 마법사가 표시되는 횟수를 식별합니다. 이 키의 값을 5보다 큰 숫자로 설정하면 마법사가 표시되지 않습니다.

다음 섹션에서는 클라이언트 애플리케이션의 관점에서 Passport 인증과 관련된 트랜잭션에 대해 설명합니다. 서버 쪽 Passport 개발은 Passport SDK 설명서 개요를 참조하세요.

초기 요청

클라이언트가 Passport 인증이 필요한 서버에서 리소스를 요청하는 경우 서버는 티켓의 존재에 대한 요청을 확인합니다. 요청과 함께 유효한 티켓을 보내면 서버는 요청된 리소스로 응답합니다. 티켓이 클라이언트에 없는 경우 서버는 302 상태 코드로 응답합니다. 응답에는 "WWW-Authenticate: Passport1.4"라는 챌린지 헤더가 포함됩니다. Passport를 사용하지 않는 클라이언트는 Passport 로그인 서버로의 리디렉션을 따를 수 있습니다. 고급 클라이언트는 일반적으로 Passport nexus에 문의하여 Passport 로그인 서버의 위치를 확인합니다.

참고

Microsoft Passport 네트워크의 중앙에는 Passport Nexus가 있으며, Passport 참가자 사이트의 동기화를 용이하게 하여 각 사이트에 네트워크 구성 및 기타 문제에 대한 최신 세부 정보가 있는지 확인합니다. 각 Passport 구성 요소(Passport Manager, 로그인 서버, 업데이트 서버 등)는 정기적으로 Nexus와 통신하여 Passport 네트워크의 다른 구성 요소를 찾고 적절하게 통신하는 데 필요한 정보를 검색합니다. 이 정보는 구성 요소 구성 문서 또는 CCD라는 XML 문서로 검색됩니다.

 

다음 이미지는 Passport 계열사에 대한 초기 요청을 보여줍니다.

이미지는 여권 계열사에 대한 초기 요청을 보여줍니다.

Passport 로그인 서버

Passport 로그인 서버는 Passport 도메인 기관의 모든 리소스에 대한 티켓에 대한 모든 요청을 처리합니다. Passport를 사용하여 요청을 인증하려면 먼저 클라이언트 애플리케이션이 로그인 서버에 연결하여 적절한 티켓을 가져와야 합니다.

클라이언트가 Passport 로그인 서버에서 티켓을 요청하면 로그인 서버는 일반적으로 401 상태 코드로 응답하여 사용자 자격 증명을 제공해야 함을 나타냅니다. 이러한 자격 증명이 제공되면 로그인 서버는 원래 요청된 리소스가 포함된 서버의 지정된 리소스에 액세스하는 데 필요한 티켓 으로 응답합니다. 로그인 서버는 요청된 리소스를 제공할 수 있는 다른 서버로 클라이언트를 리디렉션할 수도 있습니다.

이미지는 Passport 로그인 서버에 대한 클라이언트 티켓 요청을 보여줍니다.

인증된 요청

클라이언트에 지정된 서버에 해당하는 티켓 이 있는 경우 해당 티켓 은 해당 서버에 대한 모든 요청에 포함됩니다. Passport 로그인 서버에서 티켓이 검색된 이후 티켓 이 수정되지 않았고 티켓 이 리소스 서버에 유효한 경우 리소스 서버는 요청된 리소스와 사용자가 향후 요청에 대해 인증되었음을 나타내는 쿠키를 모두 포함하는 응답을 보냅니다.

응답의 추가 쿠키는 인증 프로세스 속도를 높이기 위한 것입니다. 동일한 Passport 도메인 기관의 서버에 있는 리소스에 대한 동일한 세션의 추가 요청에는 모두 이러한 추가 쿠키가 포함됩니다. 쿠키가 만료될 때까지 자격 증명을 다시 로그인 서버로 보낼 필요가 없습니다.

이미지는 Passport 로그인 서버에 대한 인증된 요청을 보여줍니다.

WinHTTP에서 Passport 사용

WinHTTP의 Passport 인증은 다른 인증 체계와 매우 유사합니다. WinHTTP의 인증 개요는 WinHTTP의 인증을 참조하세요.

WinHTTP 5.1에서 Passport 인증은 기본적으로 사용하지 않도록 설정되며 사용하기 전에 WinHttpSetOption 을 사용하여 명시적으로 사용하도록 설정해야 합니다.

WinHTTP는 Passport 인증을 위해 내부적으로 많은 트랜잭션 세부 정보를 처리합니다. 초기 요청 중에 서버는 인증이 필요할 때 302 상태 코드로 응답합니다. 302 상태 코드는 실제로 리디렉션을 나타내며 이전 버전과의 호환성을 위한 Passport 프로토콜의 일부입니다. WinHTTP는 302 상태 코드를 숨기고 Passport nexus와 로그인 서버에 연결합니다. WinHTTP 애플리케이션은 사용자 자격 증명을 요청하기 위해 로그인 서버에서 보낸 401 상태 코드에 대해 알림을 받습니다. 그러나 애플리케이션에는 401 상태 리소스가 요청된 서버에서 시작된 것처럼 보입니다. 이러한 방식으로 WinHTTP 애플리케이션은 다른 서버와의 상호 작용을 인식하지 못하며 다른 인증 체계를 처리하는 동일한 코드로 Passport 인증을 처리할 수 있습니다.

일반적으로 WinHTTP 애플리케이션은 인증 자격 증명을 제공하여 401 상태 코드에 응답합니다. 여권 인증 을 위해 WinHttpSetCredentials 또는 SetCredentials 와 함께 자격 증명을 제공하는 경우 자격 증명은 실제로 요청에 표시된 서버가 아닌 로그인 서버로 전송됩니다.

그러나 407 상태 코드에 응답할 때 WinHTTP 애플리케이션은 WinHttpSetCredentials 대신 WinHttpSetOption을 사용하여 프록시 자격 증명을 제공해야 합니다. WinHttpSetOption은 자격 증명을 제공하는 덜 안전한 방법이기 때문에 일반적으로 피해야 합니다.

검색되면 티켓 은 내부적으로 관리되며 향후 요청에서 해당 서버로 자동으로 전송됩니다.

참고

WinHTTP를 사용하면 WINHTTP_OPTION_DISABLE_FEATURE 플래그에 대해 WinHttpSetOption 함수를 호출하고 WINHTTP_DISABLE_REDIRECTS 값을 지정하여 자동 리디렉션을 사용하지 않도록 설정할 있습니다. 리디렉션을 사용하지 않도록 설정해도 WinHTTP가 Passport 트랜잭션에 대해 내부적으로 처리하는 리디렉션을 방해하지 않습니다.

 

애플리케이션에서 자동 리디렉션을 사용하지 않도록 설정하더라도 WinHTTP는 Passport 인증을 성공적으로 완료할 수 있습니다. 그러나 Passport 인증이 완료되면 Passport 로그인 서버 URL에서 원래 URL로 다시 암시적 리디렉션이 발생해야 합니다. 이 리디렉션은 302 HTTP 응답에 의해 트리거되지 않지만 Passport 프로토콜에서 암시적입니다.

WinHTTP는 이 암시적 리디렉션을 특별히 처리합니다. 애플리케이션이 자동 리디렉션을 사용하지 않도록 설정한 경우 WinHTTP는 이 특수한 경우 애플리케이션이 WinHTTP에 자동으로 리디렉션할 수 있는 "권한"을 부여해야 합니다.

인증 후 WinHTTP가 원래 URL로 다시 리디렉션되도록 하려면 애플리케이션이 WinHttpSetStatusCallback을 사용하여 콜백 함수를 등록해야 합니다. 그런 다음 WinHTTP는 애플리케이션이 리디렉션을 취소할 수 있는 WINHTTP_CALLBACK_STATUS_REDIRECT 콜백을 사용하여 애플리케이션에 알릴 수 있습니다. 애플리케이션은 콜백 함수의 기능을 제공할 필요가 없습니다. 콜백 등록은 WinHTTP가 이 특수 사례 리디렉션을 따르도록 하기에 충분합니다.

애플리케이션에서 콜백 함수를 설정하지 않으면 ERROR_WINHTTP_LOGIN_FAILURE 메시지가 생성됩니다.

Passport Cobranding

WinHTTP에서 지원하는 기존 인증 체계와 달리 Passport는 광범위하게 공동 브랜딩할 수 있습니다. 챌린지를 나타내는 401 상태 코드를 받으면 애플리케이션에서 공동 브랜드 그래픽 및 텍스트를 검색할 수 있습니다. WINHTTP_OPTION_PASSPORT_COBRANDING_URL 플래그를 사용하여 WinHttpQueryOption을 호출하여 공동 브랜딩 그래픽의 URL을 검색합니다. WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT 플래그를 사용하여 WinHttpQueryOption을 호출하여 공동 브랜딩 텍스트를 검색합니다. 이러한 항목을 사용하여 자격 증명 수집 대화 상자를 사용자 지정할 수 있습니다.

저장된 사용자 이름 및 암호

Windows XP는 저장된 사용자 이름 및 암호 개념을 도입했습니다. 사용자의 Passport 자격 증명이 Passport 등록 마법사 또는 표준 자격 증명 대화 상자를 통해 저장되면 저장된 사용자 이름 및 암호에 저장됩니다. Windows XP 이상에서 WinHTTP를 사용하는 경우 자격 증명이 명시적으로 설정되지 않은 경우 WinHTTP는 저장된 사용자 이름 및 암호의 자격 증명을 자동으로 사용합니다. 이는 NTLM/Kerberos에 대한 기본 로그온 자격 증명 지원과 유사합니다. 그러나 기본 Passport 자격 증명 사용은 자동 로그온 정책 설정의 적용을 받지 않습니다.

Passport 인증을 사용하지 않도록 설정

일부 애플리케이션에는 Passport 인증을 사용하지 않도록 설정하는 기능이 필요할 수 있습니다. 예를 들어 Passport 계열사가 초기 302 상태 코드로 응답하는 경우 WinHTTP가 내부적으로 인증을 처리하도록 허용하는 대신 표시된 리디렉션을 따르고 HTML Passport 인증 페이지를 렌더링하는 것이 좋습니다. WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH 옵션을 사용하여 WinHttpSetOption 함수를 호출하고 값을 WINHTTP_DISABLE_PASSPORT_AUTH 전달하여 WinHTTP에서 Passport 인증을 사용할 수 없습니다. 나중에 WINHTTP_ENABLE_PASSPORT_AUTH 사용하여 다시 사용하도록 설정할 수 있습니다.

WinHttpRequest 개체를 사용하는 경우 Passport 인증을 사용하지 않도록 설정할 수 없습니다.

이 섹션의 앞부분에서 설명한 대로 Passport 인증은 WinHTTP 5.1에서 기본적으로 사용하지 않도록 설정되며 사용하기 전에 WinHttpSetOption 을 사용하여 명시적으로 사용하도록 설정해야 합니다.

테스트에 사용되는 Passport 구성 재정의

WinHTTP는 Passport 1.4 인증을 지원하기 위해 Passport nexus 서버에서 다운로드하는 구성 정보를 사용합니다. 기본적으로 이 SSL(보안) 서버는 nexus.passport.com 구성 리소스는 rdr/pprdr.asp이며 이를 "라이브" Passport 구성이라고 합니다. 정보의 형식은 사용자 지정 HTTP 헤더 "PassportURLs"이며 그 뒤에 쉼표로 구분된 특성-값 쌍이 있습니다.

예: "https://nexus.passport.com/rdr/pprdr.asp" 는 다음 구성 정보를 반환합니다.

PassportURLs: DARealm=Passport.net,
DALogin=login.passport.com/login2.asp,
DAReg=https://register.passport.com/defaultwiz.asp,
Properties=https://memberservices.passport.com/ppsecure/MSRV_EditProfile.asp,
Privacy=https://www.passport.com/consumer/privacypolicy.asp,
GeneralRedir=https://nexusrdr.passport.com/redir.asp,
Help=https://memberservices.passport.com/UI/MSRV_UI_Help.asp,
ConfigVersion=2
\r\n

WinHTTP와 관련된 부분은 DARealm, DALogin 및 ConfigVersion입니다. 성능상의 이유로 WinHTTP 세션의 수명 동안 캐시됩니다. 이러한 세 가지 값은 에서 적절한 레지스트리 설정을 변경하여 "라이브" 프로덕션 설정 이외의 다른 Passport 인프라로 작업하는 데 필요한 애플리케이션에 의해 재정의될 수 있습니다.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Internet Settings
                  WinHttp
                     Passport Test
LoginServerRealm (REG_SZ)    For example: abc.net
LoginServerUrl (REG_SZ)      For example: https://private-login.passport.com/login2.asp
ConfigVersion (REG_DWORD)    For example: 10

LoginServerUrl이 레지스트리에 있는 경우 WinHTTP는 다른 구성 값을 위해 nexus 서버에 연결하지 않습니다. 이 경우 LoginServerRealm 및 ConfigVersion도 레지스트리를 통해 설정하여 값을 수정해야 합니다.

애플리케이션은 테스트를 위해 프라이빗 nexus 서버에서 Passport 구성을 다운로드해야 할 수 있습니다. 이 작업은 아래의 두 레지스트리 값을 재정의하여 수행할 수 있습니다.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Internet Settings
                  WinHttp
                     Passport Test
NexusHost (REG_SZ)    e.g. private-nexus.passport.com
NexusObj(REG_SZ)      e.g. config/passport.asp

WinHTTP의 인증