ASP.NET 사이트 맵 보안 트리밍

업데이트: 2007년 11월

웹 사이트의 일반적인 보안 요구 사항은 일부 멤버 및 인증된 사용자만 특정 페이지를 볼 수 있도록 하는 것입니다. ASP.NET 역할 관리를 사용하면 보안 역할을 기반으로 웹 파일에 대한 액세스를 제한할 수 있습니다. 사이트 맵 보안 트리밍을 통해서도 보안 역할을 기반으로 하여 사이트 맵의 탐색 링크를 숨길 수 있습니다. 역할 기반 보안에 대한 자세한 내용은 역할 관리 이해를 참조하십시오.

사이트 맵 보안 트리밍 작동 방식

ASP.NET 페이지에 다음과 같은 탐색 구조가 표시된다고 가정합니다.

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting
      Support

Customers라는 역할의 멤버가 아닌 클라이언트는 Support.aspx 페이지에 대해 구성된 ASP.NET 액세스 규칙에 따라 Support 웹 페이지를 볼 수 없습니다.

탐색 표시에서 Support 링크를 숨기려면 Web.config 파일에 보안 트리밍을 설정하도록 사이트 맵 공급자를 구성합니다. 응용 프로그램은 ASP.NET의 URL 권한 부여 및 파일 권한 부여를 사용하여 Support 페이지 링크를 숨기기 때문에 추가로 변경할 사항이 없습니다. ASP.NET 버전 2.0에 포함된 XmlSiteMapProvider 컨트롤은 URL 및 파일 권한 부여 기능을 사용하여 각 사이트 맵 노드에 대해 권한 부여 검사를 자동으로 수행합니다.

Customers 역할에 없는 클라이언트에게 Support 링크를 표시하려면 Support.aspx 파일의 사이트 맵 노드에 roles 특성을 사용하면 됩니다. roles 특성은 사이트 맵 노드에 대한 액세스를 URL 권한 부여 및 파일 권한 부여를 통해 부여되는 액세스 수준보다 확장시킵니다.

다음 코드 예제에서는 Support 페이지의 roles 특성을 Customers로 설정합니다. 보안 트리밍이 설정되면 Customers 역할의 사용자는 URL 권한 부여 또는 파일 권한 부여에 따라 실제 파일을 볼 수 없더라도 Support 페이지의 탐색 링크를 볼 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
  <siteMap>
    <!-- other <siteMapNode> elements -->
      <siteMapNode title="Support" description="Support"
        url="~/Customers/Support.aspx" roles="Customers" />
  </siteMap>

URL 또는 파일 권한 부여 규칙에 따라 Support 페이지를 볼 수 없는 Customers 역할의 멤버가 아닌 사용자에게는 다음 탐색 구조가 표시됩니다.

Home
   Products
      Hardware
      Software
      Discounts
   Services
      Training
      Consulting

보안 트리밍 설정

보안 트리밍은 ASP.NET 역할과 함께 동작합니다. 따라서 보안 트리밍을 사용하려면 액세스 규칙(allow 및 deny 요소)을 통해 페이지를 제한해야 합니다. 액세스 규칙에 대한 자세한 내용은 역할을 사용하여 권한 부여 관리를 참조하십시오.

보안 트리밍은 기본적으로 설정되어 있지 않으며 프로그래밍 방식으로 설정할 수 없을 뿐 아니라 Web.config 파일에서만 설정해야 합니다. 이는 SiteMapProvider 클래스에서 상속받는 모든 사용자 지정 클래스도 마찬가지입니다.

보안 트리밍을 사용하려면 Web.config 파일에서 siteMap 요소(ASP.NET 설정 스키마)를 구성해야 합니다. 사이트 맵에서 기본 ASP.NET 사이트 맵 공급자를 사용하는 경우에는 Web.config 파일에 siteMap 요소(ASP.NET 설정 스키마)가 포함되어 있지 않을 수도 있습니다. 이 경우 이 요소를 하나 추가해야 합니다. 다음 코드 예제에서는 기본 사이트 맵 공급자를 추가하고 보안 트리밍을 설정합니다.

<system.web>
<!-- …other configuration settings -->
  <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
    <providers>
      <add name="XmlSiteMapProvider"
        description="Default SiteMap provider."
        type="System.Web.XmlSiteMapProvider "
        siteMapFile="Web.sitemap"
        securityTrimmingEnabled="true" />
    </providers>
  </siteMap>
</system.web>

성능 고려 사항

보안 트리밍 기능은 요청이 있을 때마다 URL 권한 부여를 사용하여 사용자가 siteMapNode 요소와 연결된 URL에 대해 액세스 권한이 있는지 확인합니다. 이러한 추가 작업을 수행하면 권한이 부여되는 노드의 수에 따라 성능이 저하됩니다. 보안 트리밍이 설정된 경우 다음 메서드를 사용해 성능을 향상시킬 수 있습니다.

  • 사이트 맵 파일의 노드 수 제한   사이트 맵 파일의 노드 수가 150개가 넘으면 보안 트리밍 작업 시간이 훨씬 오래 걸릴 수 있습니다.

  • 명시적으로 roles 요소 특성 siteMapNode설정   모든 클라이언트에게 안전하게 표시할 수 있는 노드에 대해서만 roles 특성을 와일드카드 문자 또는 별표(*)로 설정해야 합니다. roles 특성이 있으면 사용자가 해당 특성에 나열된 역할 중 하나에 속해 있는 경우 ASP.NET이 siteMapNode와 연결된 URL에 대한 URL 권한 부여를 무시할 수 있습니다.

의도하지 않은 트리밍을 막기 위한 역할 선택

자식 사이트 맵 노드가 의도하지 않게 트리밍되지 않도록 하려면 권한 부여 규칙 및 역할 특성을 신중하게 구성합니다. ASP.NET 페이지에 다음과 같은 탐색 구조가 표시된다고 가정합니다.

Home
   Products
      Hardware

Products.aspx 파일에 설정된 URL 또는 파일 권한 부여 규칙은 Hardware.aspx 파일에 설정된 권한 부여 규칙보다 제한적이지 않아야 합니다. 그렇지 않으면 Products의 부모 링크가 숨겨지기 때문에 Hardware 링크가 해당 링크를 볼 수 있어야 하는 사용자가 볼 수 없도록 숨겨집니다. 숨겨진 링크를 노출하려면 두 사이트 맵 노드에 무시된 ASP.NET 역할이 나열된 roles 특성을 추가합니다.

사이트 맵에 있는 루트 노드에 모든 사용자가 액세스할 수 있도록 하는 것이 좋습니다. 모든 사용자가 액세스할 수 있게 하려면 다음 코드 예제처럼 roles 특성을 별표(*) 또는 와일드카드 문자로 설정합니다.

<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
  <siteMapNode title="Home" description="Home" 
    url="default.aspx" roles="*">
    <!-- other <siteMapNode> elements -->
  </siteMapNode>
</siteMap>

사이트 맵에서는 웹 응용 프로그램 외부에 있는 URL을 참조할 수 있습니다. ASP.NET으로는 응용 프로그램 외부에 있는 URL에 대한 액세스를 테스트할 수 없습니다. 따라서 보안 트리밍을 설정하는 경우 역할 특성을 별표(*)로 설정하여 URL에 대한 액세스를 먼저 테스트하지 않고 모든 클라이언트가 사이트 맵 노드를 볼 수 있게 하는 경우가 아니면 사이트 맵 노드가 표시되지 않습니다.

여러 사이트 맵 또는 공급자에 대한 보안 트리밍 사용

여러 사이트 맵을 함께 사용하여 단일 웹 사이트의 탐색 구조를 정의할 수 있습니다. 예를 들어 Web.sitemap 파일은 분할하여 서로 다른 폴더에 둘 수 있기 때문에 Web.config 파일과 유사합니다.

siteMapFile에 있는 자식 사이트 맵 파일 또는 공급자를 참조하거나 부모 사이트 맵에 있는 SiteMapNode 개체의 provider 특성을 참조하면 사이트 맵을 서로 연결할 수 있습니다.

다음 코드 예제는 다른 사이트 맵을 참조하는 사이트 맵 노드를 보여 줍니다.

<?xml version="1.0" encoding="utf-8" ?>

<siteMap>
  <!-- other <siteMapNode> elements -->
    <siteMapNode siteMapFile="~/Customers/Customers.sitemap" 
      securityTrimmingEnabled="true" />
</siteMap>

보안 트리밍에 의해 영향을 받는 API 멤버

탐색 컨트롤을 사용하면 코드를 약간 사용하거나 아예 사용하지 않고도 사이트 탐색 기능을 페이지에 추가할 수 있으며, 프로그래밍 방식으로 사이트 탐색 기능을 사용할 수도 있습니다. 웹 응용 프로그램이 실행되면 ASP.NET은 사이트 맵 구조가 반영된 SiteMap 개체를 노출합니다. SiteMap 개체의 모든 멤버는 정적 멤버입니다. 그런 다음 SiteMap 개체는 맵에 있는 각 노드의 속성이 포함된 SiteMapNode 개체의 컬렉션을 노출합니다. 이는 SiteMapPath 컨트롤을 사용하면 이 컨트롤이 SiteMapSiteMapNode 개체와 함께 작동하여 해당 링크를 자동으로 렌더링하기 때문입니다.

코드에 SiteMap, SiteMapNodeSiteMapProvider 개체를 사용하면 사이트 맵 구조 내를 이동하거나, 사용자 지정 컨트롤을 만들어 사이트 맵 데이터를 표시할 수 있습니다. 사이트 맵에 쓸 수는 없지만 개체의 인스턴스에서 사이트 맵 노드를 변경할 수는 있습니다. 자세한 내용은 방법: 프로그래밍 방식으로 메모리에서 사이트 맵 노드 수정 또는 방법: 프로그래밍 방식으로 사이트 맵 노드 열거를 참조하십시오.

ASP.NET은 기본 사이트 맵 공급자인 XmlSiteMapProvider를 사용하여 Web.sitemap 파일을 읽습니다. 사이트 맵 정보를 해당 사이트 맵 파일과 다른 위치에 저장하려는 경우 고유한 사이트 맵 공급자를 만들고 응용 프로그램에서 사용자 지정 공급자를 호출하도록 구성할 수 있습니다. 사이트 맵 공급자는 Web.config 파일에 구성됩니다. 응용 프로그램이 실행되면 ASP.NET은 공급자를 호출하여 필요한 경우 사이트 맵 정보를 검색할 수 있습니다. 그런 다음 ASP.NET은 공급자가 반환하는 정보를 토대로 SiteMapNode 개체를 만들어 채웁니다. SiteMap 클래스를 사용하면 이러한 개체에 프로그래밍 방식으로 액세스할 수 있습니다. 자세한 내용은 ASP.NET 사이트 맵 공급자 구현을 참조하십시오.

보안 정보:

사이트 맵 데이터를 .sitemap 이외의 파일 이름 확장명을 가진 파일에 저장하도록 사용자 지정 사이트 맵 공급자를 구현하면 보안 문제가 발생할 수 있습니다. 기본적으로 ASP.NET은 클라이언트가 .sitemap 같이 파일 이름 확장명이 알려진 파일을 다운로드하지 못하도록 구성되어 있습니다. 데이터를 보호하려면 .sitemap 이외의 파일 이름 확장명을 가진 모든 사용자 지정 사이트 맵 데이터 파일을 App_Data 폴더에 저장합니다. 자세한 내용은 ASP.NET 사이트 탐색 보안을 참조하십시오.

보안 트리밍을 설정하면 SiteMap, SiteMapNodeSiteMapNodeCollection 클래스에 있는 일부 멤버의 동작에 영향을 줍니다. 이러한 클래스를 사용하면 다음과 같은 동작이 나타납니다.

  • 사용자가 확인을 위한 보안 권한이 없는 사이트 맵 노드를 참조하려고 하면 사이트 탐색 API 멤버가 null을 반환합니다. 예를 들어 CurrentNode, NextSibling, ParentNodePreviousSibling 속성이 제한된 사이트 맵 노드를 반환하려고 하면 null이 반환됩니다.

  • 사이트 탐색 API 멤버가 사이트 맵 노드의 트리를 순회해야 하는 경우 사용자가 확인할 수 없는 모든 사이트 맵은 탐색에서 제외됩니다. 예를 들어 ChildNodes 메서드를 실행하면 사용자가 확인할 수 있는 노드만 포함하도록 노드의 컬렉션을 필터링합니다. API 멤버가 Clone 또는 IsDescendantOf 메서드 같은 노드 경로를 추적해야 하는 경우 경로는 제한된 노드에서 끝납니다. 이렇게 되면 복제 작업으로 인해 반환되는 노드의 수가 줄어들 수 있습니다. 또한 구조적으로는 노드가 요청한 노드의 실제 하위 요소라도 IsDescendantOf 메서드가 false 값을 반환할 수 있습니다.

  • 사이트 탐색 API 멤버가 사용자에게 확인을 위한 보안 권한이 없는 루트 노드를 참조하면 InvalidOperationException 예외가 반환됩니다. 루트 공급자의 루트 노드에 대해서만 모든 사용자에게 액세스를 허용하여 처음에 SiteMap 개체를 가져올 때 예외가 throw되지 않도록 해야 합니다.

  • SiteMapNode 개체가 다른 사이트 맵 파일 또는 공급자를 잘못 참조하면 ConfigurationException 예외가 throw됩니다.

참고:

사이트 맵에서는 웹 응용 프로그램 외부에 있는 URL을 참조할 수 있습니다. ASP.NET으로는 응용 프로그램 외부에 있는 URL에 대한 액세스를 테스트할 수 없습니다. 따라서 보안 트리밍을 설정하는 경우 역할 특성을 별표(*)로 설정하여 URL에 대한 액세스를 먼저 테스트하지 않고 모든 클라이언트가 사이트 맵 노드를 볼 수 있게 하는 경우가 아니면 사이트 맵 노드가 표시되지 않습니다.

참고 항목

작업

연습: 보안 역할을 기반으로 사이트 맵 노드 필터링

개념

ASP.NET 사이트 탐색 보안

데이터 액세스 보안

기타 리소스

역할을 사용하여 권한 부여 관리

호스팅된 환경에서의 ASP.NET 응용 프로그램 보안