다음을 통해 공유


보안 투명 코드

보안에는 세 가지 상호 작용 요소, 즉 샌드박싱, 사용 권한 및 적용이 관련되어 있습니다. 샌드박싱이란 일부 코드는 완전히 신뢰할 수 있는 것으로 간주되고 다른 코드는 샌드박스의 권한 부여 설정에 포함된 사용 권한으로 제한되는 격리된 도메인을 만드는 방법을 가리킵니다. 샌드박스의 권한 부여 설정 내에서 실행되는 응용 프로그램 코드는 투명한 것으로 간주되므로 보안에 영향을 줄 수 있는 작업은 수행하지 못합니다. 샌드박스의 권한 부여 설정은 증명 정보에 의해 결정됩니다. 증명 정보는 샌드박스에서 필요한 사용 권한 및 만들 수 있는 샌드박스 유형을 식별합니다. 적용이란 투명 코드가 해당 권한 부여 설정 내에서만 실행되도록 하는 것을 가리킵니다.

중요중요

이전 버전의 .NET Framework에서는 보안 정책이 핵심적 요소였지만,.NET Framework 버전 4부터는 보안 정책이 더 이상 사용되지 않습니다.보안 정책의 제거는 보안 투명성과는 무관합니다.이러한 변경의 영향 및 이를 완화하기 위한 방법에 대한 자세한 내용은 코드 액세스 보안 정책 호환성 및 마이그레이션을 참조하십시오.

이 항목에서는 투명성 모델을 보다 자세히 설명합니다. 여기에는 다음 단원이 포함되어 있습니다.

  • 투명성 모델의 용도

  • 투명성 수준 지정

  • 투명성 적용

투명성 모델의 용도

투명성은 응용 프로그램의 일부로 실행되는 코드를 인프라의 일부로 실행되는 코드와 분리하는 적용 메커니즘입니다. 투명성은 네이티브 코드 호출과 같은 권한 있는 작업을 수행할 수 있는 코드(중요한 코드)와 수행할 수 없는 코드(투명 코드)를 구분합니다. 투명한 코드는 운영되는 권한 집합의 범위 내에서 명령을 실행할 수 있지만 중요한 코드에서 실행하거나 파생시키거나 포함할 수 없습니다.

투명성 적용의 주된 목적은 여러 코드 그룹을 권한에 기반하여 격리하는 간단하고 효율적인 메커니즘을 제공하는 데 있습니다. 샌드박스 모델의 컨텍스트 내에서 이러한 권한 그룹은 완전히 신뢰되어 아무런 제한이 없거나 부분적으로 신뢰되어 해당 샌드박스에 부여된 권한 집합으로 제한됩니다.

중요중요

투명성 모델은 코드 액세스 보안보다 우수합니다.투명성은 just-in-time 컴파일러에 의해 적용되고 완전 신뢰를 비롯한 어셈블리의 권한 부여 설정과 상관없이 계속 유효합니다.

투명성은 보안 모델을 단순화하고 보안 라이브러리 및 응용 프로그램의 작성 및 배포를 쉽게 하기 위해 .NET Framework 버전 2.0에서 도입되었습니다. 투명 코드는 부분적으로 신뢰할 수 있는 응용 프로그램의 배포를 단순화하기 위해 Microsoft Silverlight에서도 사용됩니다.

참고참고

부분적으로 신뢰할 수 있는 응용 프로그램을 개발하는 경우 대상 호스트의 권한 요구 사항을 알고 있어야 합니다.일부 호스트에서 허용하지 않는 리소스를 사용하는 응용 프로그램을 개발할 수도 있기 때문입니다.이 응용 프로그램은 오류 없이 컴파일되지만 호스팅 환경으로 로드될 경우 실패하게 됩니다.Visual Studio를 사용하여 응용 프로그램을 개발한 경우 개발 환경에서 설정된 제한된 권한이나 부분 신뢰 환경에서 디버깅을 사용할 수 있습니다.자세한 내용은 방법: 제한된 권한으로 ClickOnce 응용 프로그램 디버깅를 참조하십시오.ClickOnce 응용 프로그램에 제공되는 권한 계산 기능은 부분적으로 신뢰할 수 있는 모든 응용 프로그램에서도 사용할 수 있습니다.

맨 위로 이동

투명성 수준 지정

어셈블리 수준 SecurityRulesAttribute 특성은 어셈블리가 따를 SecurityRuleSet 규칙을 명시적으로 선택합니다. 이 규칙은 숫자로 표시되는 수준별 시스템에서 구성되며, 수준이 높을수록 보안 규칙은 더 강력하게 적용됩니다.

이 시스템의 수준은 다음과 같습니다.

  • 수준 2(Level2) – .NET Framework 4 투명성 규칙

  • 수준 1 (Level1) – .NET Framework 2.0 투명성 규칙

수준 1에서는 투명성 규칙을 어셈블리 외부로부터의 호출에 대해 적용하지 않고 호환성을 위해서만 적용한다는 점에서 두 가지 투명성 수준이 큰 차이를 보입니다.

중요중요

수준 1 투명성은 호환성을 위해서만 지정해야 합니다. 즉, AllowPartiallyTrustedCallersAttribute 특성을 사용하거나 투명성 모델을 사용하지 않는 .NET Framework 3.5 또는 이전 버전으로 개발한 코드에 대해서만 수준 1을 지정합니다.예를 들어, 부분적으로 신뢰할 수 있는 호출자(APTCA)로부터의 호출을 허용하는 .NET Framework 2.0 어셈블리에 대해 수준 1 투명성을 사용합니다..NET Framework 4에 맞춰 개발한 코드의 경우에는 항상 수준 2 투명성을 사용합니다.

수준 2 투명성

수준 2 투명성은 .NET Framework 버전 4에서 도입되었습니다. 이 모델의 세 가지 개념은 투명 코드, 보안 안전에 중요한 코드 및 보안에 중요한 코드입니다.

  • 부여된 사용 권한(완전 신뢰 포함)과 상관없이 투명 코드는 다른 투명 코드 또는 보안 안전에 중요한 코드만 호출할 수 있습니다. 부분적으로 신뢰할 수 있는 코드는 도메인의 권한 집합(있는 경우)에서 허용하는 작업만 수행할 수 있습니다. 투명 코드에서는 다음을 수행할 수 없습니다.

    • Assert 작업 수행 또는 권한 상승

    • 안전하지 않거나 확인할 수 없는 코드 포함

    • 중요한 코드의 직접 호출

    • 네이티브 코드 또는 SuppressUnmanagedCodeSecurityAttribute 특성이 있는 코드의 호출

    • LinkDemand로 보호되는 멤버의 호출

    • 중요한 형식에서 상속

    또한 투명 메서드는 중요한 가상 메서드를 재정의하거나 중요한 인터페이스 메서드를 구현할 수 없습니다.

  • 보안 안전에 중요한 코드는 완전히 신뢰되지만 투명 코드에서 호출할 수 있습니다. 이 코드는 완전 신뢰 코드의 노출 영역을 제한적으로 노출합니다. 보안 안전에 중요한 코드에서는 정확성 및 보안 확인이 수행됩니다.

  • 보안에 중요한 코드는 모든 코드를 호출할 수 있고 완전히 신뢰되지만 이 코드를 투명 코드에서 호출하지는 못합니다.

수준 1 투명성

수준 1 투명성 모델은 보안 감사에 따른 코드 양을 개발자가 줄일 수 있도록 하기 위해 .NET Framework 버전 2.0에서 도입되었습니다. 수준 1 투명성은 버전 2.0에서 공개적으로 사용할 수 있었지만 주로 Microsoft 내에서 보안 감사용으로 사용되었습니다. 개발자는 주석을 통해 보안 상승과 기타 신뢰할 수 있는 작업을 수행할 수 있는 형식 및 멤버(보안에 중요한 형식 또는 멤버)와 그렇지 않은 형식 및 멤버(보안 투명 형식 또는 멤버)를 선언할 수 있습니다. 투명한 것으로 식별된 코드는 높은 수준의 보안 감사가 필요하지 않습니다. 수준 1 투명성은 투명성 적용 범위가 어셈블리 내부로 제한되도록 지정합니다. 즉, 보안에 중요한 것으로 식별된 public 형식 또는 멤버는 해당 어셈블리 내에서만 보안에 중요합니다. 이러한 형식 및 멤버가 어셈블리 외부에서 호출될 때 보안을 적용하려면 완전 신뢰에 대한 링크 요청을 사용해야 합니다. 그렇지 않으면 공개적으로 표시되는 보안에 중요한 형식 및 멤버가 보안 안전에 중요한 것으로 간주되어 어셈블리 외부의 부분적으로 신뢰되는 코드에서 이 형식 및 멤버를 호출할 수 있습니다.

수준 1 투명성 모델의 한계점은 다음과 같습니다.

  • 보안에 중요한 public 형식 및 멤버를 보안 투명 코드에서 액세스할 수 있습니다.

  • 투명성 주석이 어셈블리 내에서만 적용됩니다.

  • 어셈블리 외부로부터의 호출에 보안을 적용하려면 보안에 중요한 형식 및 멤버에서 링크 요청을 사용해야 합니다.

  • 상속 규칙은 적용되지 않습니다.

  • 완전 신뢰 상태로 실행되는 투명 코드가 유해한 작업을 수행할 가능성이 있습니다.

맨 위로 이동

투명성 적용

투명성 규칙은 투명성이 계산될 때까지 적용되지 않습니다. 투명성이 계산되고 투명성 규칙이 위반된 경우 InvalidOperationException이 throw됩니다. 투명성의 계산 시점은 여러 요인에 의해 결정되므로 예측할 수 없습니다. 그러나 투명성은 가능한 한 늦은 시점에 계산됩니다. .NET Framework 4에서 어셈블리 수준 투명성 계산은 .NET Framework 2.0에서보다 이른 시점에 수행됩니다. 확실한 사실은 필요한 시점에 투명성 계산이 수행된다는 것뿐입니다. 이는 메서드를 컴파일하고 해당 메서드에서 오류를 감지하는 시점을 JIT(Just-In-Time) 컴파일러가 변경하는 방법과 유사합니다. 코드에 투명성 오류가 없으면 투명성 계산은 표시되지 않습니다.

맨 위로 이동

참고 항목

개념

보안 투명 코드, 수준 1

보안 투명 코드, 수준 2