권한 요청
업데이트: 2007년 11월
권한을 요청하면 코드가 실행되기 위해 필요한 권한을 공용 언어 런타임이 알 수 있습니다. 어셈블리에 대한 권한은 코드의 어셈블리 범위에 특성(선언적 구문)을 삽입하여 요청합니다. 어셈블리가 만들어지면 언어 컴파일러는 요청된 권한을 어셈블리 매니페스트에 저장합니다. 로드할 때 공용 언어 런타임은 권한 요청을 검사하고 보안 정책 규칙을 적용하여 어셈블리에 부여할 권한을 결정합니다. 요청에 따라 공용 언어 런타임은 코드에 대한 권한을 거부할 수는 있지만 코드에 추가 권한을 부여할 수는 없습니다. 코드에 부여되는 최대 권한은 로컬 관리 정책에 의해 최종적으로 제어됩니다.
컴파일되기 위해 코드가 권한을 요청할 필요는 없지만, 코드가 항상 권한을 요청해야 하는 중요한 이유가 있습니다.
권한을 요청하면 코드 실행이 허용되는 경우 코드를 정상적으로 실행할 가능성이 높아집니다. 최소한의 권한 집합을 요청하는 코드는 해당 권한을 받아야만 실행됩니다. 권한의 최소 집합을 식별하지 않은 경우 코드는 일부 권한이 부여되지 않아 정상적으로 실행되지 않는 모든 상황에 대처해야 합니다.
권한을 요청하면 필요한 권한만 코드에 부여됩니다. 코드에 추가 권한이 부여되지 않으므로, 리소스를 손상시킬 수 있는 버그가 있거나 악성 코드에 의해 악용될지라도 이러한 추가 권한으로 보호한 리소스를 손상시키지 않을 수 있습니다. 코드에 필요한 권한만 요청해야 합니다.
권한을 요청하면 관리자는 응용 프로그램에 필요한 최소한의 권한을 알 수 있으므로 이에 따라 보안 정책을 조정할 수 있습니다. 관리자는 권한 보기 도구(Permview.exe)를 사용하여 어셈블리를 검사하고 보안 정책을 설정하여 필요한 권한을 발급합니다. 응용 프로그램이 요구하는 권한을 명시적으로 요청하지 않으면 권한 보기 도구는 응용 프로그램이 요구하는 권한 정보를 반환할 수 없습니다. 관리자가 이 정보를 모르면 응용 프로그램을 관리할 수 없습니다.
권한을 요청하여 응용 프로그램이 원하지 않거나 작동에 필요한 권한을 공용 언어 런타임에게 알립니다. 예를 들어, 응용 프로그램에서 격리된 저장소를 사용하지 않고 로컬 하드 디스크에 쓰려면 응용 프로그램에 FileIOPermission이 있어야 합니다. 코드가 FileIOPermission을 요청하지 않고, 로컬 보안 설정에 의해 응용 프로그램에 이 권한이 허용되지 않으면, 응용 프로그램이 디스크에 쓰려고 할 때 보안 예외가 발생합니다. 응용 프로그램이 이 예외를 처리할 수 있을지라도 디스크에는 쓸 수 없습니다. 응용 프로그램이 사용자가 오랫 동안 사용하던 텍스트 편집 프로그램인 경우 이러한 동작으로 인해 사용자는 데이터를 저장할 수 없을 수도 있습니다. 한편, 응용 프로그램이 FileIOPermission을 요청하지만 로컬 보안 설정에 의해 응용 프로그램에 FileIOPermission이 허용되지 않으면, 응용 프로그램이 시작할 때 예외가 발생하여 사용자는 작업 손실 문제에 직면하지 않습니다. 또한, 응용 프로그램이 FileIOPermission을 요청하는 신뢰할 수 있는 응용 프로그램이면, 관리자는 보안 정책을 조정하여 원격 공유 위치에서 이 응용 프로그램을 실행하도록 허용할 수 있습니다.
코드가 보호된 리소스에 액세스하지 않거나 보호된 작업을 수행하지 않으면 권한을 요청할 필요가 없습니다. 예를 들어, 코드가 리소스를 사용하지 않고, 전달된 입력에 따라 결과만 계산하는 경우에는 권한 요청이 필요하지 않을 수 있습니다. 보호된 리소스에 액세스하지만 필요한 권한을 요청하지 않는 코드는 실행될 수 있지만, 필요한 권한이 없는 리소스에 액세스하려고 하면 실행 도중 특정 위치에서 실패할 수 있습니다.
권한을 요청하려면 코드가 사용하는 리소스와 보호된 작업을 알고 있어야 하며 이와 같은 리소스와 작업을 보호하는 권한도 알고 있어야 합니다. 또한, 구성 요소가 호출하는 클래스 라이브러리 메서드가 액세스하는 리소스도 추적해야 합니다. .NET Framework에 포함된 코드 액세스 권한의 목록을 보려면 권한 항목을 참조하십시오.
다음은 권한 요청의 유형을 설명하는 표입니다.
권한 요청 |
설명 |
---|---|
최소 권한(RequestMinimum) |
실행에 필요한 코드의 권한 |
선택적 권한(RequestOptional) |
코드가 사용할 수 있는 권한. 이 권한이 없어도 효율적으로 실행될 수 있습니다. 이 요청은 특별히 요청되지 않은 다른 모든 권한을 암시적으로 거부합니다. |
거부된 권한(RequestRefuse) |
보안 정책에서 허용하는 경우에도 확인하려는 권한이 코드에 부여되지 않습니다. |
기본 제공 권한 집합에 대한 위의 요청 중 일부를 수행(기본 제공 권한 집합 요청). |
Nothing, Execution, FullTrust, Internet, LocalIntranet 및 SkipVerification 등의 기본 제공 권한 집합 |
XML로 인코딩된 권한 집합에 대한 위의 요청 중 일부를 수행(XML로 인코딩된 권한 요청). |
원하는 권한 집합의 XML 표현(XML로 인코딩된 권한 집합이 포함된 문자열 또는 인코딩된 권한 집합이 포함된 XML 파일의 위치) |
RequestMinimum을 사용하여 필요한 권한을 지정하면 보안 정책에서 허용하는 필요한 각각의 권한이 코드에 부여됩니다. 필요한 모든 권한이 코드에 부여되어야만 코드가 실행될 수 있습니다.
필요한 권한을 요청하지 않고 선택적 권한을 요청하면, 경우에 따라 어셈블리에 부여된 권한이 상당히 제한될 수 있습니다. 예를 들어, 일반적으로 보안 정책은 Everything으로 지정된 권한 집합과 연결된 권한을 Assembly A에 부여합니다. Assembly A의 개발자가 Permission A만 선택적으로 요청하고 필요한 권한은 요청하지 않으면, Assembly A에는 Permission A가 부여되거나(보안 정책에서 허용하는 경우) 권한이 전혀 부여되지 않습니다.
참고 항목
작업
개념
참조
SecurityAction.RequestOptional