다음을 통해 공유


Demand와 LinkDemand 비교

업데이트: 2007년 11월

선언적 보안에서는 비슷하지만 매우 다른 검사를 수행하는 두 가지 유형의 보안 검사를 제공합니다. 보안 검사 유형을 잘못 선택하면 보안이 약화되거나 성능이 저하될 수 있으므로 이 두 검사 유형에 대해 이해하고 있어야 합니다. 자세한 내용은 보안 요구를 참조하십시오.

선언적 보안에서는 다음과 같은 보안 검사가 제공됩니다.

  • Demand는 코드 액세스 보안 스택 워크를 지정합니다. 스택에 있는 모든 호출자는 지정된 권한이나 ID가 있어야만 검사에 통과할 수 있습니다. Demand는 스택에 여러 호출자가 있을 수 있으므로 모든 호출에 대해 발생합니다. 메서드를 반복적으로 호출하는 경우 이 보안 검사는 메서드를 호출할 때마다 발생합니다. Demand는 공격에 대한 훌륭한 보호책입니다. 권한이 없는 코드는 이 검사를 통과할 수 없습니다.

  • LinkDemand는 JIT(Just-In-Time) 컴파일 타임에 발생하며 직접 실행 호출자만 검사합니다. 이 보안 검사에서 호출자의 호출자는 검사되지 않습니다. 이 검사에 통과하고 나면 호출자가 아무리 많이 호출을 해도 추가적인 보안 오버헤드가 발생하지 않습니다. 그러나 공격에 대한 보호책은 없습니다. LinkDemand를 사용하면 코드가 검사에 통과하여 코드를 참조할 수 있는 경우 악성 코드가 권한이 부여된 코드를 사용하여 호출될 수 있기 때문에 잠재적으로 보안이 손상될 수 있습니다. 따라서 가능한 모든 보안 약점을 완전하게 보호할 수 없으면 LinkDemand를 사용하지 마십시오.

LinkDemand를 사용할 때 필요한 추가 예방 조치는 개별적으로 프로그래밍되어야 합니다. 보안 시스템은 이를 적용하는 데 유용할 수 있습니다. 어떤 실수라도 보안 약점을 노출시킬 수 있습니다. 사용자의 코드를 사용하는 모든 권한 있는 코드는 다음을 수행하여 추가 보안을 구현해야 합니다.

  • 클래스 또는 어셈블리에 대한 호출 코드의 액세스를 제한합니다.

  • 호출되는 코드에 나타나는 보안 검사를 호출하는 코드에 삽입하여 호출자도 같은 보안 검사를 수행하도록 합니다. 예를 들어, UnmanagedCode 플래그가 설정된 SecurityPermission에 대해 LinkDemand로 보호되는 메서드를 호출하는 코드를 작성하는 경우 이 메서드도 해당 권한에 대한 LinkDemand(또는 더 강력한 Demand)를 만들어야 합니다. 사용자의 코드에서 LinkDemand로 보호되는 메서드를 사용하되 demands 등의 다른 보안 보호 메커니즘이 있어서 안전하다고 생각되는 제한적인 방법으로 사용하는 경우에는 예외입니다. 이 예외적인 경우에 기본 코드에서 보안 보호를 약화시키는 데 대한 책임은 호출자가 집니다.

  • 코드의 호출자가 사용자의 코드를 이용하여 보호되는 코드를 호출할 수 없도록 합니다. 즉, 호출자는 권한이 있는 코드가 보호되는 코드에 특정 매개 변수를 전달하도록 하거나 보호되는 코드에서 결과를 얻도록 할 수 없습니다.

인터페이스 및 링크 요구

LinkDemand가 있는 가상 메서드, 속성 또는 이벤트가 기본 클래스 메서드를 재정의하면 기본 클래스 메서드도 재정의된 메서드에 대해 동일한 LinkDemand를 갖고 있어야 합니다. 악성 코드가 기본 형식으로 다시 캐스팅되어 기본 클래스 메서드를 호출하는 것이 가능하기 때문입니다. 또한 링크 요구는 어셈블리 수준 특성 AllowPartiallyTrustedCallersAttribute가 없는 어셈블리에 암시적으로 추가될 수도 있습니다.

인터페이스 메서드에도 링크 요구가 있는 경우 링크 요구로 메서드 구현을 보호하는 것이 좋습니다. 다음은 인터페이스에서 링크 요구를 사용하는 것과 관련된 내용입니다.

  • AllowPartiallyTrustedCallersAttribute 특성도 인터페이스에 적용됩니다.

  • AllowPartiallyTrustedCallersAttribute 특성을 사용할 때처럼 부분적으로 신뢰할 수 있는 코드에서 특정 인터페이스를 사용하지 못하도록 선택적으로 보호하기 위해 인터페이스에 링크 요구를 삽입할 수 있습니다.

  • AllowPartiallyTrustedCallersAttribute 특성을 포함하지 않는 어셈블리에 정의된 인터페이스가 있는 경우 부분적으로 신뢰할 수 있는 코드에서 해당 인터페이스를 구현할 수 있습니다.

  • 인터페이스 메서드를 구현하는 클래스의 공용 메서드에 LinkDemand를 삽입하는 경우 인터페이스로 캐스팅해서 메서드를 호출하면 LinkDemand가 적용되지 않습니다. 이 경우 인터페이스에 링크되었기 때문에 인터페이스의 LinkDemand만 적용됩니다.

보안 문제에 대한 다음 항목을 살펴 보십시오.

  • 인터페이스 메서드의 명시적 링크 요구. 이러한 링크 요구가 예상한 것과 같은 보호 기능을 하는지 확인하십시오. 악성 코드가 앞에서 설명한 것처럼 캐스트를 사용하여 링크 요구를 피할 수 있는지 여부를 확인하십시오.

  • 링크 요구가 적용된 가상 메서드.

  • 형식 및 형식이 구현하는 인터페이스. 이들은 항상 링크 요구를 사용해야 합니다.

참고 항목

기타 리소스

보안 코딩 지침