최상의 통합 모드 구성 : Microsoft Internet Information Services

2006. 12. 31. 16:32 IT 및 개발/Windows Server
통합된 ASP.NET 모드의 이용

II7 에서 ASP.NET 응용 프로그램은 기본적으로 통합 모드로 실행됩니다. 그렇지만, 견고한 통합이 제공하는 이점을 이용하기 위해서는 응용 프로그램 구성설정을 일부 수정해야만 합니다. 더 나아가, 여러분들의 응용 프로그램에 보다 강력한 기능을 부여하기 위해서 여러분들은 통합 모드를 이용하는 새로운 ASP.NET 구성요소를 개발할 수도 있습니다.

모든 유형의 콘텐츠에 대한 ASP.NET 서비스 활성화

통합 모드에서 ASP.NET 모듈에 의해 제공되는 서비스들은 모든 유형의 콘텐츠 요청을 대상으로 실행될 수 있습니다. 그러나, 하위 호환성을 유지하기 위한 목적 때문에 기본적으로 ASP.NET 모듈은 ASP.NET 콘텐츠에 대한 요청만을 대상으로 실행되도록 구성되어져 있습니다.

이러한 결과는 서버 수준의 구성설정 섹션에 설정된 각각의 ASP.NET 모듈에 추가된 managedHandler 전제 조건 속성값으로 인해 얻어집니다.

<modules>
  <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"
    preCondition="managedHandler" />
  <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"
    preCondition="managedHandler" />
  
</modules>

이 preCondition 속성은 서버가 해당 모듈이 모든 요청을 대상으로 실행되어야 할지 말아야 할지를 결정하기 위해 사용하는 기준값입니다. managedHandler 속성값은 지금 현재 ASP.NET 핸들러와 맵핑되어 있는 콘텐츠 유형들에 대한 요청에 대해서만 ASP.NET 모듈이 실행되도록 지정합니다.

만약 여러분들이 ASP.NET 모듈이 제공하는 기능을 모든 요청을 대상으로 적용하고 싶다면, 해당 모듈 항목을 제거한 다음, 여러분들의 응용 프로그램의 최상위 web.config 파일에 preCondition 속성만을 제외하여 다시 추가하면 됩니다. 예를 들어서, ASP.NET 폼 기반 인증을 여러분들의 응용 프로그램 전체를 대상으로 적용하고 싶다면 다음과 같이 지정하면 됩니다.

<modules>
  <remove name="FormsAuthentication" />
  <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
  
</modules>

이렇게 변경함으로서 FormsAuthentication 모듈은 여러분들의 응용 프로그램에 대한 모든 요청을 대상으로 동작할 것입니다. 그리고 폼 기반 인증 서비스가 여러분들의 응용 프로그램 콘텐츠 전체를 보호해주게 됩니다. 모든 응용 프로그램 콘텐츠를 대상으로 폼 기반 인증을 제공하기 위해 통합 모드를 활용하는 방법에 대한 보다 많은 정보를 얻으시려면, Taking advantage of Integrated mode walkthrough 를 참고하시기 바랍니다.

그리고, 여러분들이 "managedHandler" 전제 조건에 관계없이, 모든 관리되는 (ASP.NET) 모듈들이 응용 프로그램에 대한 모든 요청을 대상으로 동작하도록 활성화시킬 수 있는 손쉬운 방법도 존재합니다. 각각의 모듈 항목에서 일일이 "managedHandler" 전제 조건을 제거하지 않으면서도 모든 요청을 대상으로 모든 관리되는 모듈을 활성화시키려면, 다음과 같이 <modules> 섹션에 runAllManagedModulesForAllRequests 속성을 추가합니다.

<modules runAllManagedModulesForAllRequests="true" />

이 속성이 사용되면, "managedHandler" 전제 조건은 무시되고 모든 관리되는 모듈들은 모든 요청을 대상으로 동작합니다.

여러분들은 다른 ASP.NET 모듈들이 여러분들의 전체 응용 프로그램에 적용되도록 활성화시는 실험을 해볼 수도 있습니다. 대표적인 경우로, ASP 페이지의 출력을 캐시하기 위해 ASP.NET 출력 캐시 모듈을 적용해본다거나, 여러분들의 사진에 대한 접근 제한 설정을 하기 위해 Url 인증과 역할 관리자를 적용해볼 수도 있습니다. 아니면, 여러분들이 직접 자신만의 모듈을 개발하여 여러분들의 전체 웹 사이트에 ASP.NET 의 기능들을 적용할 수도 있습니다.

보다 강력한 ASP.NET 서비스의 구현

통합 모드에서 ASP.NET 모듈은 모든 콘텐츠를 대상으로 서비스를 제공할 수 있습니다. 게다가 통합 모드에서 ASP.NET 은 통합된 요청 처리 파이프 라인상에서 실행되기 때문에, 네이티브 서버 모듈과 동일한 요청 처리 단계를 구독할 수 있으며 동일한 작업을 수행할 수 있습니다. 또한, ASP.NET APIs 는 이전에는 사용할 수 없었던 몇 가지 중요한 기능들이 제공되는 것을 제외한다면 대부분 예전과 동일합니다.

런타임 충실도

통합 모드상에서 모듈에 노출되어 있는 ASP.NET 요청 처리 단계들은 IIS 파이프 라인의 일치하는 단계에 직접적으로 연결되어 있습니다. 전체 파이프 라인은 다음의 단계들을 포함하고 있으며, 이 단계들은 ASP.NET 상에서 HttpApplication 이벤트로 노출됩니다.

  1. BeginRequest. 요청 처리를 시작합니다.
  2. AuthenticateRequest. 요청이 인증됩니다. 이 단계에서 IIS 와 ASP.NET 인증 모듈이 인증을 수행합니다.
  3. PostAuthenticateRequest
  4. AuthorizeRequest. 요청에 권한이 부여됩니다. IIS 와 ASP.NET 권한 부여 모듈이 인증된 사용자에게 요청된 리소스에 접근할 권한이 있는지 검사합니다.
  5. PostAuthorizeRequest
  6. ResolveRequestCache. 캐시 모듈이 해당 요청에 대한 응답이 이미 캐시에 존재하는지 파악하고, 남아 있는 이후의 단계들을 실행하는 대신 캐시에 존재하는 응답을 리턴할 수 있습니다. ASP.NET 출력 캐시 기능과 새로운 IIS 출력 캐시 기능이 모두 이 단계에서 실행됩니다.
  7. PostResolveRequestCache
  8. MapRequestHandler. ASP.NET 의 내부 단계이며, 요청 핸들러가 결정됩니다.
  9. PostMapRequestHandler
  10. AcquireRequestState. 요청 실행을 위해 필요한 상태를 가져옵니다. ASP.NET 세션 상태, 그리고 프로파일 모듈들이 이 단계에서 데이터를 가져옵니다.
  11. PostAcquireRequestState
  12. PreExecuteRequestHandler. 핸들러가 실행되기 전에 필요한 일련의 작업들이 이 단계에서 실행될 수 있습니다.
  13. ExecuteRequestHandler. 요청 핸들러가 실행됩니다. ASPX 페이지, ASP 페이지, CGI 프로그램, 그리고 정적 페이지들이 이 단계에서 처리됩니다.
  14. PostExecuteRequestHandler
  15. ReleaseRequestState. 변경된 요청 상태가 저장되고 정리됩니다. 이 단계에서 ASP.NET 세션 상태와 프로파일 모듈들의 상태가 정리됩니다.
  16. PostReleaseRequestState
  17. UpdateRequestCache. 다음에 사용될 응답이 캐시에 저장됩니다. 이 단계에서 ASP.NET 출력 캐시와 IIS 출력 캐시 모듈이 각각의 캐시에 응답을 저장하기 위해 실행됩니다.
  18. PostUpdateRequestCache
  19. LogRequest. 요청 처리 결과를 로그에 기록합니다. 만약 오류가 발생하더라도 이 단계는 실행됩니다.
  20. PostLogRequest
  21. EndRequest. 일련의 마지막 처리가 수행됩니다. 만약 오류가 발생하더라도 이 단계는 실행됩니다.

통합 모드에서 실행되는 ASP.NET 요청 처리 단계들이 IIS 모듈과 같은 단계를 공유한다는 사실은, 과거 네이티브 ISAPI 필터나 익스텐션을 사용해서만 가능했던 많은 작업들을, 이제는 친숙한 ASP.NET APIs 와 풍부한 .NET 플랫폼의 기능들을 사용하는 관리되는 코드만으로도 가능하게 만들었습니다. 예를 들어서, 여러분들은 다음과 같은 작업을 처리하는 모듈을 작성할 수도 있습니다.

  1. 요청이 다른 작업에 의해서 처리되기 전에 가로챌 수 있습니다. 예를 들어서 Url 을 다시 기록하거나 보안 필터링을 실행할 수 있습니다.
  2. 기본 제공되는 인증 모드를 교체할 수 있습니다.
  3. 요청 헤더와 같은 들어오는 요청의 내용을 수정할 수 있습니다.
  4. 모든 콘텐츠 유형의 나가는 응답을 필터링할 수 있습니다.

사용자 정의 ASP.NET 인증 모듈을 사용하여 IIS 를 확장하는 훌륭한 샘플을 Developing an IIS7 module with .NET (영문) 에서 살펴볼 수 있습니다.

ASP.NET APIs 확장

여전히 ASP.NET APIs 는 이전 버전과의 하위 호환성을 유지하고 있으며, 이는 기존의 모듈들이 수정없이 IIS7 에서 동작할 수 있도록 해주고 모든 응용 프로그램 콘텐트의 코드 변경을 불필요하게 만들어줍니다.

그렇기는 하지만, IIS7 통합 모드를 위해 작성된 모듈들은 지금까지는 처리가 불가능했던 핵심적인 요청 처리 시나리오를 지원하기 위해 추가된 몇 가지 APIs 의 이점을 얻을 수 있습니다.

이를테면, 새로운 HttpResponse.Headers 컬렉션을 이용하여 다른 응용 프로그램 구성요소에 의해서 생성된 요청 헤더를 모듈로 분석하거나 조작할 수 있습니다. 한 가지 예로, 여러분들은 브라우저에 다운로드 대화상자가 나타나도록 ASP 페이지에서 생성된 Content-Type 헤더를 변경할 수도 있습니다. 더군다나 HttpResponse 클래스가 제공하는 Cookies 컬렉션은 요청 처리 작업의 일부로 만들어진 쿠키의 수정까지도 가능하도록 개선되었으며, 심지어는 쿠키가 ASP.NET 외부에서 생성되었다고 하더라도 변함없이 수정이 가능합니다.

HttpRequest.Headers 컬렉션도 기록이 가능해졌으며 모듈에서 들어오는 요청 헤더를 조작할 수 있게 해줍니다. 이와 같은 변화는 다른 서버 구성요소의 동작을 변경하는데 사용될 수 있습니다. 예를 들어서, 여러분들은 Accept-Language 헤더의 값을 동적으로 변경하여 지역화된 응용 프로그램이 다른 언어를 사용하여 클라이언트에게 응답하게 할 수 있습니다.

마지막으로 HttpRequest.ServerVariables 컬렉션도 역시 기록이 가능해졌으며 IIS 서버 변수들의 값을 설정할 수 있게 되었습니다. ASP.NET 모듈은 IIS 가 제공하는 값들을 변경하거나, PHP 와 같은 다른 응용 프로그램 프레임워크에게 노출하기 위한 목적으로 새로운 서버 변수를 만들어 낼 수도 있습니다.

런타임 통합

새롭게 제공되는 APIs 와 함께, 통합 모드는 기존의 ASP.NET 의 기능들이 여러분들의 응용 프로그램에 보다 많은 가치를 제공해줄 수 있도록 지원해줍니다.

이제 System.Diagnostics.Trace 클래스와 ASP.NET 페이지 추적 기능 등, ASP.NET 으로부터 제공되는 추적 기능들은 추적된 정보를 IIS 추적 시스템으로 출력할 수 있습니다. 결과적으로 IIS 나 ASP.NET 이 요청을 처리하면서 발생한 모든 추적 정보를 단일 로그 파일에 저장할 수 있게 되었으며, 서버상의 문제점들을 분석하기가 더욱 편리해졌습니다.

클라이언트로 응답이 전송되기 전에 스트림 인터페이스를 통해 응답 내용을 수정할 수 있도록 해주는 ASP.NET 의 응답 필터링 기능 역시, 비 ASP.NET 콘텐츠를 대상으로도 동작할 수 있도록 향상되었습니다. 따라서 여러분들은 ASP.NET 필터링을 모든 서버 콘텐츠에 적용하거나, 일부 원하는 유형의 콘텐츠들만을 대상으로 동작하도록 선택적으로 설치할 수 있습니다. 이 기능을 이용하면, 해당 콘텐츠가 ASPX 페이지인지 정적 파일인지 전혀 신경쓰지 않고서도, 여러분들의 사이트 응답에서 임의의 콘텐츠들을 대상으로 주입 또는 검열을 실시하는 필터링 기능을 작성할 수 있습니다.

요약

IIS7 과 ASP.NET 의 통합은 ASP.NET 의 모든 가능성을 활짝 열어주어, 개발자들로 하여금 쉽고 풍부한 기능의 ASP.NET 과 .NET 프레임워크를 사용하여 강력한 서버 구성 요소들을 작성할 수 있도록 해줍니다. 기존 응용 프로그램들을 위한 ASP.NET 통합 모드 활용에 대한 보다 상세한 내용은 통합된 ASP.NET 모드의 이용을 참고하시기 바랍니다. 그리고, 서버 확장을 위한 새로운 ASP.NET 구성요소를 작성하는 방법에 관한 정보는 Developing an IIS7 module with .NET (영문) 을 참고하시기 바랍니다.

출처 : 한국 마이크로소프트 MSDN (2006년 10월)