웹 리소스 요청 막기, HttpNotFoundHandler

Posted in .NET Framework // Posted at 2010. 8. 9. 12:11
728x90

ASP.NET MVC 모델에서는 (Views 폴더의) 모든 웹 리소스에 대한 직접 요청을 막아 두었다

사용자 화면(뷰)에 해당하는 Views 폴더에 있는 모든 aspx 파일에 대한 다음과 같은 요청은
모두 404 Not Found 로 처리된다
http://yourdomain.com/Views/Index.aspx

이것은 기존 웹폼 모델과 대조되는 면으로,
ASP.NET MVC에서의 사용자 화면(뷰)은 모두 컨트롤러에 의해 선택되고 랜더 되게 하기 위함이다
따라서 리소스에 대한 직접 요청은 의도적으로 막고 있는 것이다

Views 폴더의 Web.config 에 정의된 HttpNotFoundHandler
Visual Studio 에서 ASP.NET MVC 프로젝트를 생성하면 총 두개의 Web.config 가 생성된다
루트에 있는 Web.config 는 기존과 같이 응용프로그램 전역적인 설정 파일이며
Views 폴더의 Web.config 는 Views 폴더에만 적용되는 설정 파일인데, 이 파일에 정의된
HttpNotFoundHandler 가 리소스 직접 요청에 대한 Not Found 처리를 하는 HttpHandler 이다

<httpHandlers>
     <add path="*" verb="*"  type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

위와같이 정의된 핸들러에 의해 Views 폴더의 aspx 파일을 포함한 모든 직접 요청은 404로 처리된다

참고로 ASP.NET 웹폼 모델에서는 *.aspx 에 대한 처리는 System.Web.UI.PageHandlerFactory 라는
핸들러에 의해 처리되었다

HTTP 핸들러에 대한 개념과 기본 등록된 핸들러 정보는 다음 링크에서 확인할 수 있다
[ASP.NET] HTTP Handler
[ASP.NET] HttpHandler- Demo
[ASP.NET] Machine.config 미리 정의된 HttpHandler


ASPX 파일만 막기
기본 구성으로는 Views 폴더의 모든 리소스에 대한 직접 접근을 막고 있다
경우에 따라서는 Views 폴더에 ASPX 외에 다양한 웹 리소스가 위치할 수 있다

예를 들어 이미지파일이나 css, js 파일, pdf 파일 등을 들 수 있다
이러한 웹 리소스에 대한 직접 요청은 정상적으로 되길 원할 수도 있다
그렇다면 핸들러 정보를 다음과 같이 수정하여 ASPX 파일만 막도록 하면 된다

<httpHandlers>
     <add path="*.aspx" verb="*"  type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

그러나 ASP.NET MVC 모델에서는 뷰를 제외한 기타 웹 리소스를 Views 폴더에 두지 않기를 권장한다.이미지나 CSS, JS 와 같은 정적이고 공개적인 웹 리소스들은 자동으로 생성된 Content 폴더에 두는 것이다

참고: http://haacked.com/archive/2008/06/25/aspnetmvc-block-view-access.aspx

'.NET Framework' 카테고리의 다른 글

Razor 구문  (0) 2011.07.19
ASP.NET Razor  (5) 2010.12.13
ASP.NET MVC, 폼 데이타 전송하기  (0) 2010.08.06
ASP.NET MVC 에서 요청 매개변수 넘기기  (0) 2010.08.05
ASP.NET MVC, Hello World  (1) 2010.08.04