코드 액세스 보안 소개
업데이트: 2007년 11월
코드 액세스 보안은 보호된 리소스와 작업에 대한 코드의 액세스를 제한하는 메커니즘입니다. .NET Framework에서 코드 액세스 보안은 다음 기능을 수행합니다.
다양한 시스템 리소스에 액세스하는 권한을 나타내는 권한 및 권한 집합을 정의합니다.
권한 집합을 코드 그룹과 연결하여 관리자가 보안 정책을 구성할 수 있도록 합니다.
유용한 권한 및 실행되기 위해 필요한 권한을 코드가 요청하도록 하며, 코드가 가질 수 없는 권한을 지정합니다.
코드에서 요청한 권한과 보안 정책에서 허가한 작업에 따라, 로드된 각 어셈블리에 권한을 부여합니다.
해당 코드의 호출자가 특정 권한을 갖도록 코드가 요구할 수 있도록 합니다.
코드의 호출자가 디지털 서명을 갖도록 해당 코드가 요구하여 특정 조직이나 사이트의 호출자만이 보호된 코드를 호출할 수 있도록 합니다.
호출 스택에 있는 모든 호출자에게 부여된 권한과 해당 호출자가 가져야 하는 권한을 비교하여 런타임에 코드를 제한합니다.
공용 언어 런타임의 보안 시스템은 리소스에 액세스하거나 작업을 수행할 수 있는 권한이 코드에 있는지 알아보기 위해 호출 스택을 탐색하면서 각 호출자에게 부여된 권한과 요구된 권한을 비교합니다. 요구된 권한을 가진 호출자가 호출 스택에 없으면 보안 예외가 throw되고 액세스가 거부됩니다. 스택 워크는 신뢰 수준이 낮은 코드가 신뢰 수준이 높은 코드를 호출하여 권한이 없는 작업을 수행하는 공격이 발생하지 않도록 설계되었습니다. 런타임에 모든 호출자의 권한을 요구하면 성능이 떨어지지만 이러한 권한 요구는 신뢰 수준이 낮은 코드의 공격으로부터 코드를 보호하기 위해 필요합니다. 성능을 최적화하려면 코드가 스택 워크를 더 간단히 수행하도록 합니다. 그러나, 이 경우 항상 보안상의 허점이 드러나지 않도록 해야 합니다.
다음 그림은 Assembly A4의 메서드가 자신의 호출자에게 권한 P를 요구할 때 발생하는 스택 워크를 나타냅니다.
보안 스택 워크
코드 액세스 보안을 사용하는 일반적인 경우는 사용자가 데이터를 입력할 수 있도록 응용 프로그램이 로컬 인트라넷의 호스트 웹 사이트에서 클라이언트로 컨트롤을 직접 다운로드하는 경우입니다. 설치된 클래스 라이브러리를 사용하여 컨트롤을 만듭니다. 다음은 이 시나리오에서 코드 액세스 보안을 사용할 수 있는 몇 가지 방법입니다.
로드하기 전에 관리자는 코드에 특정 디지털 서명이 있으면 이 코드에 특별한 권한(로컬 인터넷 코드에 일반적으로 부여되는 권한 이상의 권한)을 부여하도록 지정하는 보안 정책을 구성할 수 있습니다. 기본적으로, 미리 정의된 명명된 권한 집합인 LocalIntranet은 로컬 인트라넷에서 다운로드된 모든 코드와 연결됩니다.
로드할 때 공용 언어 런타임은 컨트롤에 신뢰할 수 있는 서명이 없으면 명명된 권한 집합 LocalIntranet과 연결된 권한 이상의 권한을 컨트롤에 부여하지 않습니다. 이 경우, LocalIntranet 권한 집합과 연결된 권한 및 신뢰할 수 있는 서명에 의한 일부 추가 권한이 컨트롤에 부여됩니다.
런타임에 호출자(여기서는 호스팅된 컨트롤)가 보호된 리소스를 노출하는 라이브러리나 비관리 코드를 호출하는 라이브러리에 액세스할 때마다, 해당 라이브러리는 라이브러리의 호출자에게 적절한 권한이 부여되었는지 검사하도록 보안 요구를 합니다. 이러한 보안 검사를 통해 컨트롤은 클라이언트 컴퓨터에서 권한이 없는 작업을 수행하지 못하게 됩니다.