Katana에서 Windows 인증 사용하기

등록일시: 2015-08-03 08:00,  수정일시: 2016-09-02 08:45
조회수: 4,515
이 문서는 OWINKatana 프로젝트를 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 Katana를 IIS에서 호스팅하거나 HttpListener를 이용해서 사용자 지정 프로세스에서 자체 호스팅 할 때 Windows 인증을 사용하는 방법에 관해서 살펴봅니다.

본문에서는 Katana에서 Windows 인증을 사용하는 방법에 관해서 살펴보려고 합니다. 전체적으로 두 가지 시나리오를 살펴보게 될텐데, 먼저 Katana를 IIS에서 호스팅하는 경우와 HttpListener를 이용해서 사용자 지정 프로세스에서 자체 호스팅 하는 경우가 바로 그것입니다. 그리고 본 자습서를 검토해준 Barry Dorrans, David Matson, 그리고 Chris Ross에게 감사의 뜻을 전합니다.

Katana는 OWIN(Open Web Interface for .NET) 추상화를 Microsoft가 직접 구현한 프로젝트입니다. OWIN과 Katana에 대한 기본적인 정보들은 Katana 프로젝트 기사에서 확인하실 수 있으므로 참고하시기 바랍니다. OWIN 아키텍처는 다음과 같은 몇 가지 논리적 계층으로 구성됩니다:

  • 호스트: OWIN 파이프라인이 실행되는 프로세스를 관리합니다.
  • 서버: 네트워크 소켓을 열고 요청을 수신 대기합니다.
  • 미들웨어: HTTP 요청 및 응답을 처리합니다.

그리고 현재 Katana에서는 다음과 같은 두 가지 유형의 서버를 제공해주고 있으며, 두 서버 모두 Windows 통합 인증을 지원합니다:

  • Microsoft.Owin.Host.SystemWeb. IIS에서 ASP.NET 파이프라인을 이용합니다.
  • Microsoft.Owin.Host.HttpListener. System.Net.HttpListener 클래스를 이용합니다. 현재 이 서버가 Katana 자체 호스팅 시의 기본 옵션입니다.

본문에서 살펴보려는 Windows 인증 기능은 서버 계층에서 자체적으로 제공되기 때문에, 현재 Katana 프로젝트에서는 따로 이 기능에 대한 OWIN 미들웨어를 제공하고 있지 않습니다.

IIS에서 Windows 인증 사용하기

Microsoft.Owin.Host.SystemWeb 서버를 사용하는 경우에는 IIS를 설정해서 간단하게 Windows 인증을 활성화시킬 수 있습니다.

먼저 Empty 템플릿을 이용해서 KatanaWebHost라는 이름으로 새로운 ASP.NET 웹 응용 프로그램을 만듭니다.

역주: 본문의 예제는 Visual Studio 2012를 기준으로 작성된 것으로 생각됩니다. 가령 이 그림 역시 Visual Studio 2012에서 캡처된 것으로 ASP.NET 빈 웹 응용 프로그램(ASP.NET Empty Web Application) 프로젝트 템플릿을 사용하고 있습니다.

그리고 NuGet 패키지를 추가합니다. 도구(Tools) 메뉴에서 라이브러리 패키지 관리자(Library Package Manager) 또는 NuGet 패키지 관리자를 선택한 다음, 패키지 관리자 콘솔(Package Manager Console)을 선택합니다. 그런 다음, 패키지 관리자 콘솔(Package Manager Console) 창에 다음 명령을 입력합니다:

Install-Package Microsoft.Owin.Host.SystemWeb -pre

계속해서 Startup이라는 이름으로 새로운 클래스를 추가하고 다음과 같이 코드를 작성합니다:

using Owin;

namespace KatanaWebHost
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}
역주: Visual Studio 2013에서는 Owin 시작 클래스(Owin Startup class) 템플릿이 제공됩니다. 이 템플릿을 사용하는 방법에 대한 보다 자세한 정보는 OWIN 시작 클래스 감지방식 기사를 참고하시기 바랍니다.

지금까지의 과정이 IIS에서 OWIN을 이용해서 "Hello world" 응용 프로그램을 구현하기 위해 필요한 전부입니다. F5 키를 눌러서 응용 프로그램을 실행합니다. 그러면 브라우저에 "Hello World!"라는 문구가 출력되는 것을 확인할 수 있을 것입니다.

이제 IIS 익스프레스에서 Windows 인증을 활성화시켜보도록 하겠습니다. 보기(View) 메뉴에서 속성 창(Properties)을 선택한 다음, 솔루션 탐색기와 속성 창(Properties)을 한 눈에 볼 수 있도록 나란히 배치합니다. 그리고 솔루션 탐색기에서 프로젝트 이름을 클릭해서 프로젝트의 속성이 나타나게 합니다.

그리고 속성 창(Properties)에서 익명 인증(Anonymous Authentication) 항목을 사용 안 함(Disabled)으로, Windows 인증(Windows Authentication) 항목은 사용(Enabled)으로 설정합니다.

이렇게 설정을 마친 다음 Visual Studio에서 응용 프로그램을 실행하면, IIS 익스프레스가 사용자의 Windows 자격 증명(Credential)을 요구할 것입니다. Fiddler나 다른 HTTP 디버깅 도구를 사용해서 이를 직접 확인할 수 있습니다. 예를 들어 다음은 HTTP 응답의 한 사례입니다:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Sun, 28 Jul 2013 07:28:51 GMT
Content-Length: 6062
Proxy-Support: Session-Based-Authentication

이 응답에 추가된 WWW-Authenticate 헤더들은 서버가 Kerberos 인증이나 NTLM 인증에서 사용되는 협상(Negotiate) 프로토콜을 지원하고 있음을 나타냅니다.

그리고 나중에 실제로 응용 프로그램을 서버에 배포할 때는 이 구성 참조 문서의 지시에 따라 운영 서버에 설치된 IIS에서 Windows 인증을 활성화시키면 됩니다.

HttpListener 클래스를 이용해서 Windows 인증 사용하기

Microsoft.Owin.Host.HttpListener 서버를 이용해서 Katana를 자체 호스트하는 경우에는 HttpListener 클래스의 인스턴스를 직접 설정하는 방식으로 Windows 인증을 활성화시킬 수 있습니다.

이번에는 KatanaSelfHost라는 이름을 가진 새로운 콘솔 응용 프로그램을 생성합니다. 그리고 NuGet 패키지를 추가합니다. 도구(Tools) 메뉴에서 라이브러리 패키지 관리자(Library Package Manager) 또는 NuGet 패키지 관리자를 선택하고 패키지 관리자 콘솔(Package Manager Console)을 선택합니다. 그런 다음 패키지 관리자 콘솔(Package Manager Console) 창에 다음 명령을 입력합니다:

Install-Package Microsoft.Owin.Host.HttpListener -Pre

계속해서 Startup이라는 이름의 새로운 클래스를 추가하고 다음과 같이 코드를 작성합니다:

using Owin;
using System.Net;

namespace KatanaSelfHost
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpListener listener = (HttpListener)app.Properties["System.Net.HttpListener"];
            listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;

            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

이 클래스 구현은 이전 절에서 살펴본 "Hello world" 예제와 거의 동일하지만, 이번에는 인증 스킴을 Windows 인증으로 설정하고 있습니다. 그리고 다음과 같이 Main 메서드에서 OWIN 파이프라인을 시작합니다:

using Microsoft.Owin.Hosting;
using System;

namespace KatanaSelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WebApp.Start<Startup>("http://localhost:9000"))
            {
                Console.WriteLine("Press Enter to quit.");
                Console.ReadKey();
            }
        }
    }
}

이제 콘솔 응용 프로그램을 실행하고, Fiddler 등으로 http://localhost:9000 URL로 요청을 전송해보면 응용 프로그램에서 Windows 인증이 사용되고 있음을 확인할 수 있습니다:

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Sun, 28 Jul 2013 21:02:21 GMT
Proxy-Support: Session-Based-Authentication

관련 기사

이 기사는 2013년 7월 30일에 최초 작성되었습니다.