코드 액세스 보안

오늘날 복잡하게 연결된 컴퓨터 시스템은 출처를 알 수 없는 다양한 시스템에서 발생한 코드를 자주 사용합니다. 이러한 코드는 전자 메일에 첨부되거나, 문서에 포함되거나, 인터넷을 통해 다운로드됩니다. 불행하게도, 많은 컴퓨터 사용자들은 데이터를 손상시키거나 파괴하는 바이러스나 웜 등 악의적인 이식 가능한 코드로 인한 피해를 직접 경험했으며 이를 복구하기 위해 시간과 비용을 들여야 했습니다.

대부분의 공통 보안 메커니즘에서는 암호 등의 사용자 로그온 자격 증명에 따라 사용자에게 권한을 부여하며, 사용자가 액세스할 수 있는 디렉터리나 파일 등의 리소스를 제한합니다. 그러나 이러한 접근 방식으로는 몇 가지 문제를 해결할 수 없습니다. 사용자는 다양한 출처에서 코드를 가져오며 이러한 코드 중에는 신뢰할 수 없는 코드, 악의적인 코드에 의해 악용될 수 있는 취약한 부분 또는 버그가 있는 코드, 사용자도 모르는 작업을 실행할 수 있는 코드도 있습니다. 따라서 신중하고 신뢰할 수 있는 사용자라 할지라도 악의적이거나 오류가 많은 소프트웨어를 실행하면 컴퓨터 시스템이 손상되고 개인 데이터가 노출될 수 있습니다. 대부분의 운영 체제 보안 메커니즘에서는 웹 페이지의 스크립트만 제외하고, 실행되는 모든 코드가 완전히 신뢰되는 코드여야 합니다. 따라서, 두 시스템 간에 신뢰 관계가 없을지라도 한 시스템에서 발생한 코드를 다른 시스템에서도 안전하게 실행할 수 있도록, 광범위하게 적용할 수 있는 보안 메커니즘이 있어야 합니다.

악의적인 이식 가능한 코드로부터 시스템을 보호하고, 알 수 없는 출처에서 가져온 코드를 안전하게 실행하고, 신뢰된 코드가 실수 또는 의도적으로 보안을 손상시키지 않도록 .NET Framework에서는 코드 액세스 보안이라는 보안 메커니즘을 제공합니다. 코드 액세스 보안을 사용하면 코드의 출처 및 코드 ID의 기타 측면에 따라 서로 다른 수준으로 코드를 신뢰할 수 있습니다. 또한, 코드 액세스 보안은 코드에 다양한 신뢰 수준을 적용하여, 실행하기 위해 완전히 신뢰되어야 하는 코드 분량을 최소화합니다. 코드 액세스 보안을 사용하면 악의적이거나 오류가 많은 코드에 의해 사용자 코드가 오용될 가능성이 적습니다. 사용자는 코드가 수행할 수 있는 작업 집합을 지정할 수 있으므로 위험 부담을 줄일 수 있습니다. 또한 코드 액세스 보안은 코드의 보안상 약점으로 인해 생길 수 있는 손상을 최소화합니다.

참고참고

.NET Framework 버전 4에서는 코드 액세스 보안이 크게 변경되었습니다.가장 주목할 만한 변경 내용은 보안 투명성이지만 이 밖에도 코드 액세스 보안에 영향을 주는 다른 중요한 변경 내용도 있습니다.이러한 변경 내용에 대한 자세한 내용은 .NET Framework 4의 보안 변경 내용을 참조하십시오.

코드 액세스 보안은 주로 라이브러리 코드 및 부분적으로 신뢰할 수 있는 응용 프로그램에 영향을 줍니다. 라이브러리 개발자는 부분적으로 신뢰할 수 있는 응용 프로그램에서 무단으로 코드에 액세스하지 못하도록 보호해야 합니다. 부분적으로 신뢰할 수 있는 응용 프로그램이란 인터넷 같은 외부 소스에서 로드되는 응용 프로그램을 가리킵니다. 이에 비해 데스크톱 또는 로컬 인트라넷에 설치되어 있는 응용 프로그램은 완전 신뢰로 실행됩니다. 완전 신뢰 응용 프로그램은 완전히 신뢰되기 때문에 보안 투명으로 표시되지 않는 한 코드 액세스 보안의 영향을 받지 않습니다. SecurityTransparentAttribute 특성으로 표시된 응용 프로그램은 SecurityCriticalAttribute 특성으로 표시된 코드를 호출할 수 없다는 점을 제외하면 완전 신뢰 응용 프로그램에 대한 제한은 전혀 없습니다. 부분적으로 신뢰할 수 있는 응용 프로그램은 코드 액세스 보안을 적용할 수 있는 Internet Explore 같은 샌드박스에서 실행되어야 합니다. 인터넷에서 응용 프로그램을 다운로드하여 데스크톱에서 실행하려고 하면 NotSupportedException이 발생하며 "이전 버전의 .NET Framework에서 어셈블리에 샌드박스를 적용하는 네트워크 위치에서 어셈블리를 로드하려고 했습니다. .NET Framework 릴리스를 통해 기본적으로 CAS 정책을 사용하도록 설정할 수 없으므로 이러한 로드는 위험할 수 있습니다."라는 메시지가 표시됩니다. 응용 프로그램을 확실히 신뢰할 수 있다고 판단되면 <loadFromRemoteSources> 요소를 사용하여 해당 응용 프로그램이 완전 신뢰로 실행되도록 할 수 있습니다. 샌드박스에서 응용 프로그램을 실행하는 방법에 대한 자세한 내용은 방법: 샌드박스에서 부분 신뢰 코드 실행을 참조하십시오.

공용 언어 런타임 기능이 있는 모든 관리 코드는 코드 액세스 보안을 전혀 호출하지 않아도 코드 액세스 보안의 장점을 활용할 수 있습니다. 자세한 내용은 코드 액세스 보안 기본 사항을 참조하십시오.

코드 액세스 보안의 주요 기능

코드 액세스 보안을 통해 보호된 리소스와 작업에 대한 코드의 액세스를 제한할 수 있습니다. .NET Framework에서 코드 액세스 보안은 다음 기능을 수행합니다.

  • 다양한 시스템 리소스에 액세스하는 권한을 나타내는 권한 및 권한 집합을 정의합니다.

  • 해당 코드의 호출자가 특정 권한을 갖도록 코드가 요구할 수 있도록 합니다.

  • 코드의 호출자가 디지털 서명을 갖도록 해당 코드가 요구하여 특정 조직이나 사이트의 호출자만이 보호된 코드를 호출할 수 있도록 합니다.

  • 호출 스택에 있는 모든 호출자에게 부여된 권한과 해당 호출자가 가져야 하는 권한을 비교하여 런타임에 코드를 제한합니다.

호출 스택 워킹

공용 언어 런타임의 보안 시스템은 리소스에 액세스하거나 작업을 수행할 수 있는 권한이 코드에 있는지 알아보기 위해 호출 스택을 탐색하면서 각 호출자에게 부여된 권한과 요구된 권한을 비교합니다. 요구된 권한을 가진 호출자가 호출 스택에 없으면 보안 예외가 throw되고 액세스가 거부됩니다. 스택 워크는 신뢰 수준이 낮은 코드가 신뢰 수준이 높은 코드를 호출하여 권한이 없는 작업을 수행하는 공격이 발생하지 않도록 설계되었습니다. 런타임에 모든 호출자의 권한을 요구하면 성능이 떨어지지만 이러한 권한 요구는 신뢰 수준이 낮은 코드의 공격으로부터 코드를 보호하기 위해 필요합니다. 성능을 최적화하려면 코드가 스택 워크를 더 간단히 수행하도록 합니다. 그러나, 이 경우 항상 보안상의 허점이 드러나지 않도록 해야 합니다.

다음 그림은 Assembly A4의 메서드가 자신의 호출자에게 권한 P를 요구할 때 발생하는 스택 워크를 보여 줍니다.

보안 스택 워크

코드 액세스 보안

관련 항목

제목

설명

코드 액세스 보안 기본 사항

코드 액세스 보안에 대한 내용 및 코드 액세스 보안의 가장 일반적인 용도에 대해 설명합니다.

보안 투명 코드, 수준 2

.NET Framework 4의 보안 투명성 모델에 대해 설명합니다.

부분 신뢰 코드에서 라이브러리 사용

비관리 코드에서 라이브러리를 사용할 수 있도록 설정하는 방법과 비관리 코드에서 라이브러리를 사용하는 방법에 대해 설명합니다.

보안 클래스 라이브러리 작성

클래스 라이브러리의 보안 고려 사항에 대해 설명합니다.

사용자 고유의 코드 액세스 권한 만들기

사용자 지정 권한을 만드는 방법에 대해 설명합니다.

주요 보안 개념

.NET Framework 보안 시스템에서 사용하는 중요한 용어와 개념을 개략적으로 설명합니다.

역할 기반 보안

역할에 따라 보안을 통합하는 방법에 대해 설명합니다.

암호화 서비스

암호화 기법을 응용 프로그램에 통합하는 방법에 대해 설명합니다.

보안 도구(.NET Framework)

.NET Framework 보안 시스템을 구현하고 관리하는 데 사용하는 도구에 대해 설명합니다.