IIS 7 이상에서 구성을 사용하여 시작

By Tobin Titus

요약

IIS 7 이상의 구성 시스템은 IIS, ASP.NET 및 기타 구성 요소를 포함하여 전체 웹 서버 플랫폼에 대한 구성 설정을 보유하는 분산된 지우기 텍스트 XML 파일을 기반으로 하며, 필요에 따라 웹 콘텐츠와 함께 콘텐츠 디렉터리에서 설정할 수 있습니다. 컴퓨터 관리자가 사이트 관리자 또는 애플리케이션 개발자와 같은 다른 사용자에게 다양한 수준의 구성 계층을 위임할 수 있습니다. 보안 기본값 및 기본 잠금은 컴퓨터 관리자에게만 구성 설정에 대한 쓰기 액세스를 제한합니다. 그러나 정교하고 세분화된 잠금 기능을 사용하면 웹 네임스페이스의 scope 위해 특정 구성 설정을 안전하게 잠금 해제하고 더 많은 사용자에게 위임할 수 있습니다. 시스템은 이전 버전의 IIS 및 XML 수준에서 이전 버전의 .NET Framework와 API 수준에서 이전 버전과 호환됩니다. 이 문서에서는 새 구성 시스템에 대한 일반적인 개요를 제공합니다.

소개

IIS의 구성 시스템은 IIS, ASP.NET 및 기타 구성 요소를 포함하여 전체 웹 서버 플랫폼에 대한 구성 설정을 보유하는 분산된 지우기 텍스트 XML 파일을 기반으로 하며, 필요에 따라 웹 콘텐츠와 함께 콘텐츠 디렉터리에서 설정할 수 있습니다. 컴퓨터 관리자가 사이트 관리자 또는 애플리케이션 개발자와 같은 다른 사용자에게 다양한 수준의 구성 계층을 위임할 수 있습니다. 보안 기본값 및 기본 잠금은 컴퓨터 관리자에게만 구성 설정에 대한 쓰기 액세스를 제한합니다. 그러나 정교하고 세분화된 잠금 기능을 사용하면 웹 네임스페이스의 scope 위해 특정 구성 설정을 안전하게 잠금 해제하고 더 많은 사용자에게 위임할 수 있습니다. 시스템은 이전 버전의 IIS 및 XML 수준에서 이전 버전의 .NET Framework와 API 수준에서 이전 버전과 호환됩니다.

새 구성 시스템은 다음과 같이 설계되었습니다.

  • 단순: 모든 상태가 파일에 있습니다. 독점 저장소는 사용되지 않습니다. 구성 상태의 실제 master 메모리 내 구성 데이터베이스가 없습니다(IIS 6.0의 IISADMIN 서비스와는 달리). 스키마는 데이터 기반이며 100% 선언적이며 검색할 수 있습니다.

  • 낮은 TCO: 구성을 웹 콘텐츠와 함께 xcopied할 수 있습니다. 선택적 위임된 관리는 모든 구성 변경에 컴퓨터 관리자의 개입을 제거합니다. IIS, ASP.NET 및 웹 서버 플랫폼의 나머지 부분에 걸쳐 구성 설정 및 모델을 통합하면 동일한 도구 및 API를 사용하여 서버를 관리할 수 있는 원스톱 상점이 제공됩니다(예: web.config 파일에는 IIS 및 ASP.NET 설정이 모두 포함될 수 있으며 인증, 권한 부여, 사용자 지정 오류와 같은 기능을 제어할 수 있는 위치가 하나 있습니다.) 백업, 복원, ACL(보안 관리)은 표준 파일 시스템 도구 및 프로세스를 기반으로 합니다.

  • 보안: IIS가 설치되면 구성 상태는 컴퓨터 관리자 액세스에 대해서만 보호되는 하나의 파일에 있습니다. 위임은 기본적으로 사용하도록 설정되지 않습니다. 중요한 정보(예: 암호)는 기본적으로 저장되지 않습니다. 중요한 정보를 구성 파일에 기록해야 하는 경우 디스크에서 자동으로 암호화됩니다. 애플리케이션별 구성은 다른 애플리케이션이 설정을 공유하거나 읽을 수 없으므로 전용 파일(파일 시스템 ACL로 보호됨)에서 샌드박스로 격리할 수 있습니다.

  • 확장 가능: 스키마에 를 추가하는 것은 단순히 XML 파일을 스키마 폴더에 삭제하는 문제입니다. 스키마를 확장하기 위해 API를 호출하거나 도구를 실행할 필요가 없습니다. 설정은 '섹션'(.NET Framework 구성과 똑같이)이라는 논리적으로 관련된 블록으로 구성되며 새 섹션을 추가하는 것은 쉽습니다(.NET Framework 구성과 달리 코드를 작성할 필요가 없음). 서버 모듈 또는 애플리케이션에서 사용자 지정 섹션 설정을 읽는 것은 간단하고 간단합니다.

  • 호환 가능: 기존 IIS 애플리케이션은 ABO(관리 기본 개체), IIS ADSI 공급자 및 IIS 6.0 WMI 공급자와 같은 인터페이스를 계속 호출할 수 있습니다. 기존 .NET Framework 애플리케이션은 System.Configuration 및 System.Web.Configuration과 같은 인터페이스를 계속 호출할 수 있습니다. machine.config 및 web.config XML 형식에 익숙한 사용자는 이러한 파일에서 동일한 형식과 구문을 계속 경험하게 되며 동일한 형식 및 모델을 따르는 IIS 설정을 수동으로 편집할 수 있습니다. IIS 메타베이스 속성 이름에 익숙한 사용자는 새 IIS 7.0 이상의 구성 파일에서 속성에 대해 동일한 이름을 찾습니다.

스키마 정리

다음은 구성에 대한 스키마를 보여 주는 예제입니다.

IIS 6 및 IIS 7.0 이상에서 인증 설정이 구성되는 방법을 보여 줍니다.

참고

IIS 6.0 개념에 익숙하지 않은 독자는 단순히 IIS 6.0과의 비교를 무시하고 IIS 7.0 이상의 개념과 이점을 읽을 수 있습니다.

먼저 파일에서 구성이 유지되는 방식을 비교한 다음 스키마 정의를 살펴보겠습니다.

구성 파일 자체에서:

//
// Snippet from IIS 6.0 Metabase.xml
//
<IIsWebService    Location ="/LM/W3SVC"
      ... many lines here ...
    AuthFlags="AuthAnonymous"
      ... many lines here ...
    >
</IIsWebService>
<IIsWebDirectory    Location ="/LM/W3SVC/1/ROOT/aspnet_webadmin/2_0_41016"
    AuthFlags="AuthAnonymous | AuthNTLM"
    >
</IIsWebDirectory>
<IIsWebVirtualDir    Location ="/LM/W3SVC/Info/Templates/Public Web Site/Root"
        AuthFlags="AuthAnonymous"
    >
</IIsWebVirtualDir>

//
// Snippet from IIS 7.0 applicationHost.config
//
<anonymousAuthentication enabled="true"  userName="…"  password="…" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<windowsAuthentication enabled="true" >
    <providers>
        <add value="Negotiate" />
        <add value="NTLM" />
    </providers>
</windowsAuthentication>

주요 내용:

  • IIS 6.0 은 매우 긴 "플랫" 속성 목록을 사용하고 있습니다. 속성의 계층 구조 또는 그룹화가 없습니다. 동일한 목록에 있는 수백 개의 설정 간에 구성 설정을 검색하기는 어렵습니다. IIS 7.0 이상에서는 섹션 및 섹션 그룹 계층 구조와 섹션 내의 하위 요소를 사용합니다. 인증 섹션 그룹 또는 특정 인증 섹션에서 검색하여 인증 설정을 쉽게 조회할 수 있습니다.
  • IIS 6.0 은 플래그를 사용하여 인증 체계를 설정합니다. IIS 7.0 이상에서는 인증 스키마당 섹션을 사용하며 각각에 enabled="true|false"가 있습니다. 일부 인증 체계에만 관련된 추가 설정은 관련 섹션에서만 설정할 수 있습니다(예: 익명 인증에 대해서만 사용자 이름 및 암호를 설정할 수 있음).
  • IIS 6.0 은 메타베이스 파일 내의 경로를 사용하여 구성 수준(서비스, 가상 디렉터리, 물리적 디렉터리)을 지정합니다. 전체 서버에 대한 구성은 하나의 파일에 있습니다. IIS 7.0 이상에서는 기본적으로 하나의 파일을 사용하지만 사용자는 콘텐츠 디렉터리에서 분산 web.config 파일을 활용하여 scope 구성 설정을 지정할 수 있습니다.
  • IIS 6.0 은 자체 설명 구성 설정을 갖기 위해 긴 속성 이름을 사용합니다. 이는 파일의 가독성을 개선하고 사용자가 속성이 수행하는 작업을 이해하는 데 도움이 되도록 하기 위한 것입니다. IIS 7.0 이상에서는 짧은 이름을 사용하지만 항상 특정 섹션의 컨텍스트 또는 섹션의 하위 요소에 있습니다.
  • IIS 6.0 은 다중 sz(하나의 문자열 속성에서 쉼표로 구분된 요소) 및 플래그를 사용하여 NTAuthenticationProviders와 같은 여러 요소 값을 처리합니다. IIS 7.0 이상에서는 .NET Framework 구성과 똑같이 간단한 추가/제거/지우기 구문이 있는 컬렉션을 사용합니다. 이렇게 하면 계층 구조의 하위 수준이 전체 데이터를 해당 요소를 사용하거나 사용하지 않고 복제하는 대신 필요한 요소만 추가(또는 제거)할 수 있습니다. 또한 파일의 가독성을 향상합니다(직접 편집할 때 사람의 오류를 줄임).

스키마 파일에서 다음을 수행합니다.

//
// Snippet from IIS 6.0 MBSchema.xml
//
<Property InternalName="AuthFlags" ID="6000" Type="DWORD" UserType="IIS_MD_UT_FILE" Attributes="INHERIT" >
    <Flag   InternalName="AuthAnonymous"   Value="1"   ID="6218"   />
    <Flag   InternalName="AuthBasic"             Value="2"   ID="6219"  />
    <Flag   InternalName="AuthNTLM"            Value="4"   ID="6220"  />
    <Flag   InternalName="AuthMD5"              Value="16"  ID="6221"  />
    <Flag   InternalName="AuthPassport"        Value="64"  ID="6299"  />
</Property>

//
// Snippet from IIS 7.0 IIS_Schema.xml
//
<sectionSchema name="system.webServer/security/authentication/basicAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="realm" type="string" />
  <attribute name="defaultLogonDomain" type="string" />
  <attribute name="logonMethod" type="enum" defaultValue="ClearText">
    <enum name="Interactive" value="0" />
    <enum name="Batch" value="1" />
    <enum name="Network" value="2" />
    <enum name="ClearText" value="3" />
  </attribute>
</sectionSchema>

주요 내용:

  • IIS 6.0 은 ID(숫자)를 사용하여 설정을 식별합니다. IIS 7.0 이상에서는 친숙한 문자열을 사용하여 설정 이름을 지정합니다.
  • IIS 6.0 은 UserType과 같은 직관적이지 않은 개념과 InternalName과 같은 용어를 사용합니다. IIS 7.0 이상에서는 애플리케이션뿐만 아니라 인간 독자에게 적합한 친숙한 이름을 사용합니다.

구성 파일 계층 구조

구성에 대한 "master" 상태는 항상 구성 파일입니다(주기적으로 디스크로 플러시된 메모리 내 구성 데이터베이스인 IIS 6.0과 달리).

루트(또는 전역) 수준에는 두 개의 개별 파일이 있습니다.

  • system32\inetsrv\config\applicationHost.config: IIS(웹 서버) 설정에 대한 전역 기본값을 유지합니다.
  • \windows\microsoft.net\framework\v2.0.50727\config\machine.config: 일부 ASP.NET 설정을 포함하여 .NET 프레임워크 설정의 전역 기본값을 유지합니다(나머지는 루트 web.config라고도 하는 동일한 폴더의 web.config 있음).

두 개의 별도 파일이 여전히 있는 이유는 두 기술 버전이 서로 다르기 때문입니다(일정별 및 제품별). IIS는 Windows의 일부이며 .NET 프레임워크는 Visual Studio 릴리스의 일부로 독립적으로 버전이 지정될 수 있습니다.

웹 콘텐츠 디렉터리에는 계층 수준 및 아래쪽에 대한 동작을 제어하는 선택적 web.config 파일이 있을 수 있습니다. 로컬 또는 원격일 수 있습니다(예: 콘텐츠 디렉터리가 UNC 공유에 있는 경우). IIS, ASP.NET 또는 해당 수준에서 지정할 수 있는 다른 .NET Framework 구성 설정을 포함할 수 있습니다. 기본적으로 web.config 파일이 없습니다.

상속 계층 구조 측면에서 루트 파일은 machine.config, 동일한 디렉터리(루트 web.config라고 함)에서 web.config 다음, applicationHost.config 네임스페이스를 따라 선택적 web.config 파일입니다.

구성 포함 파일

경우에 따라 web.config 파일에 다른 .config 파일이 포함되도록 하는 것이 유용합니다. configSource 특성을 사용하여 이 작업을 수행할 수 있습니다. 현재는 보안상의 이유로 하위 디렉터리의 상대 물리적 경로를 가리키도록 제한됩니다(즉, 파일 A는 B가 A의 물리적 하위 디렉터리에 있는 경우에만 파일 B를 포함할 수 있음). 다음은 configSource를 사용하는 방법을 보여 주는 기본 예제입니다.

<!-- in inetsrv\applicationHost.config -->
<configuration>
  <system.webServer>
  
    <!-- mimemaps moved by the customer to a different file -->
    <!-- so that this file is shorter and more readable -->
    <staticContent configSource="staticContent.config"/>
  
    <!-- the rest of system.webServer sections are here… -->
  </system.webServer>
</configuration>
  
<!-- in inetsrv\staticContent.config -->
<configuration>
  <system.webServer>
    <staticContent>
      <!-- all the mimemap definitions are here -->
      <mimeMap ….. />
      <mimeMap ….. />
      <mimeMap ….. />
    </staticContent>
  </system.webServer>
</configuration>

이 예제에서 고객은 짧고 읽기 쉬운 applicationHost.config 위해 staticContent 섹션의 콘텐츠를 별도의 파일로 이동하려고 했습니다.

.config 파일에서 구성 설정이 변경되면 서버는 자동으로 변경 내용을 선택하고 이에 따라 작동합니다. 고객은 애플리케이션 또는 애플리케이션 풀 또는 전체 서버를 재활용하는 것에 대해 걱정할 필요가 없습니다(예: 변경된 구성 설정에 따라 서버 자체가 애플리케이션 풀을 재활용할 수 있음).

설정 구성

구성 파일 내에서(즉, 지정된 계층 수준의 경우) 설정은 플랫 목록이 아닌 구조화된 방식으로 구성됩니다. 배포, 등록 및 확장성의 기본 단위는 구성 섹션입니다. 섹션은 섹션 그룹에 포함되며, 이 섹션은 부모 섹션 그룹에 포함될 수 있습니다. 섹션 자체는 중첩되지 않습니다. 섹션 그룹은 다음과 같습니다.

다음은 applicationHost.config 예제입니다.

<!-- section group for web server configuration -->
<system.webServer>
  
  <!-- section group for web server security configuration -->
  <security>
    <!-- section group for web server authentication configuration -->
    <authentication>
  
      <!-- three sections for authentication -->
  
      <basicAuthentcation ... />
      <windowsAutnentication ... />
      <anonymousAuthentication ... />
    </authentication>
  </security>
</system.webServer>

구성 설정은 항상 특정 섹션에 속합니다.

섹션 그룹은 더 나은 구조화를 위해서만 존재합니다. 해당 설정에는 직접 설정이 없으며 섹션만 있습니다.

섹션 내에서 구조체는 다음과 같습니다.

  • 구성 요소: 구성 설정 및 잠재적으로 다른 구성 요소를 포함합니다. XML 요소로 표시됩니다. 섹션도 요소입니다.
  • 구성 컬렉션: 추가/제거/지우기(컬렉션 지시문이라고 함)의 형태로 구성 요소 목록을 포함하는 구성 요소의 프라이빗 사례입니다. 추가>, 제거>, <<지우>기 하위 요소가 있는 <XML 요소로 표시됩니다.
  • 구성 속성: [리프] 구성 설정입니다. XML 특성으로 표시됩니다.

다음은 applicationHost.config 예제입니다.

<!-- "windowsAuthentcation" is a section which is an element -->
<!-- "enabled" is a property -->
<windowsAuthentication enabled="true">
  
  <!-- "providers" is a collection which is an element -->
  <providers>
  
    <!-- the collection contains two elements -->
    <!-- "add" is the collection directive; "value" is the property -->
    <add value="Negotiate"/>
    <add value=""NTLM/>
  </providers>
</windowsAuthentication>

기본적으로 applicationHost.config system.applicationHost 및 system.webServer라는 두 개의 기본 섹션 그룹을 포함합니다. 또한 구성 시스템에서 다른 모든 섹션을 등록하는 데 내부적으로 사용된다는 측면에서 다소 특별한 configSections>라는 <섹션이 포함되어 있습니다.

기본적으로 machine.config 여러 섹션 그룹이 포함됩니다. ASP.NET 설정은 system.web 섹션 그룹에 있습니다.

위치 태그 및 구성 파일

대부분의 경우 콘텐츠 디렉터리에서 web.config 파일을 방지하지만 여전히 전역 기본값을 재정의하는 URL별 구성이 있습니다. 예를 들어 관리자는 특정 사이트에서 일부 인증 체계를 사용해야 하며 사이트 관리자(및 해당 사이트의 애플리케이션 개발자)가 이를 끌 수 없도록 지정하려고 합니다.

이를 수행하는 가장 쉬운 방법은 위치 태그를 사용하는 것입니다. 가상 경로에 매핑된 폴더에 web.config 없이 특정 경로에 대한 구성을 지정하는 메커니즘입니다.

이 예제에서는 applicationHost.config 내에서 위치 태그를 사용하는 방법을 보여줍니다.

<!-- the following will take effect on MyAdminSite -->
<location path="MyAdminSite">
  <system.webServer>
    <security>
      <authentication>
        <basicAuthentication enabled="false"/>
        <windowsAuthentication enabled="true"/>
        <anonymousAuthentication enabled="false"/>
      </authentication>
    </security>
  </system.webServer>
</location>

위치 태그를 사용하여 전역 수준(path="."), 사이트 또는 사이트 내의 특정 경로에 대한 구성을 지정할 수 있습니다. 파일에 여러 위치 태그가 있을 수 있습니다. 위치 태그는 applicationHost.config 또는 machine.config 뿐만 아니라 모든 .config 파일에 있을 수 있습니다.

위치 태그를 사용하여 섹션을 잠그고 잠금을 해제할 수도 있습니다. 이에 대한 자세한 내용은 구성 잠금 랩을 참조하세요.

경우에 따라 위치 태그를 사용할 수 있는 대안이 없습니다.

  • 동일한 실제 폴더에 매핑된 두 개 이상의 가상 경로입니다. 물론 두 가상 경로의 구성이 다르면 공유되므로 web.config 파일에 지정할 수 없습니다.
  • 파일별 구성. 파일에 대한 web.config 파일이 없습니다. 은 전체 폴더에만 적용됩니다.

요약

이 문서에서는 IIS 7.0 이상의 구성 시스템에 대한 대략적인 초기 개요를 제공했습니다. 클리너 스키마 형식을 강조 표시했습니다. 구성 시스템의 분산 특성 및 사이트 소유자 또는 애플리케이션 개발자에게 구성 설정을 위임하는 방법 구성 파일에서 설정의 구조화된 organization IIS와 ASP.NET 구성 시스템 간의 통합입니다.

자세한 내용은 나머지 구성 문서, 특히 구성 내장 함수 문서를 검토하는 것이 좋습니다. 이 문서는 디자인 및 아키텍처를 포함하여 시스템에 대한 보다 낮은 수준의 세부 정보로 이동합니다.