다음을 통해 공유


메서드 액세스 보안

업데이트: 2007년 11월

일부 메서드는 임의의 신뢰할 수 없는 코드에서 호출할 수 있도록 허용하기에 적합하지 않을 수 있습니다. 이러한 메서드에는 몇 가지 위험이 있을 수 있습니다. 예를 들어, 제한된 정보를 제공할 수도 있고, 전달된 모든 정보를 그대로 받아들일 수도 있습니다. 또한, 매개 변수에 대한 오류 검사를 수행하지 않을 수도 있고 잘못된 매개 변수로 잘못 작동하거나 해로운 작업을 수행할 수도 있습니다. 이러한 경우를 인식하고 메서드의 보호를 위해 조치를 취해야 합니다.

일부 경우에는 공용으로 사용하려고 한 것이 아니지만 공용이어야 하는 메서드를 제한해야 할 수도 있습니다. 예를 들어, 사용자의 DLL 전체에서 호출되어야 하므로 공용이어야 하는 인터페이스가 있지만, 고객이 사용할 수 없도록 하거나 악성 코드가 구성 요소의 진입점을 이용하지 못하도록 하기 위해 이 인터페이스를 공개적으로 노출하지 않으려는 경우가 있을 수 있습니다. 공용으로 사용하려고 한 것이 아니지만 공용이어야 하는 메서드를 제한하는 또 하나의 일반적인 이유는 매우 내부적일 수 있는 인터페이스를 문서화하고 지원해야 할 필요가 없도록 하기 위해서입니다.

관리 코드에서는 다음과 같은 몇 가지 방법으로 메서드 액세스를 제한합니다.

  • 신뢰할 수 있는 경우 클래스, 어셈블리 또는 파생된 클래스에 대한 액세스 가능성 범위를 제한합니다. 이것은 메서드 액세스를 제한하는 가장 간단한 방법입니다. 일반적으로, 파생 클래스는 부모 클래스보다 신뢰성이 떨어집니다. 이는 파생 클래스가 부모 클래스의 ID를 공유하는 경우에도 마찬가지입니다. 특히 protected 키워드를 보고 신뢰할 수 있다고 판단하지 마십시오. 이 키워드가 반드시 보안 컨텍스트에서 사용되는 것은 아닙니다.

  • 지정된 ID와 특히 사용자가 선택한 특정 증명 정보(강력한 이름, 게시자, 영역 등)를 가진 호출자만 메서드에 액세스할 수 있도록 제한합니다.

  • 사용자가 선택한 권한을 가진 호출자만 메서드에 액세스할 수 있도록 제한합니다.

마찬가지로 선언적 보안을 사용하면 클래스의 상속을 제어할 수 있습니다. InheritanceDemand를 사용하여 다음을 수행할 수 있습니다.

  • 파생 클래스가 지정된 ID 또는 권한을 갖도록 요청할 수 있습니다.

  • 특정 메서드를 재정의하는 파생 클래스가 지정된 ID 또는 권한을 갖도록 요청할 수 있습니다.

다음 예제에서는 호출자를 강력한 이름으로 서명하도록 요청함으로써 액세스를 제한하는 공용 클래스를 보호하는 방법을 보여 줍니다. 이 예제에서는 강력한 이름에 대한 Demand가 있는 StrongNameIdentityPermissionAttribute를 사용합니다. 강력한 이름으로 어셈블리에 서명하는 방법에 대한 작업 기반 정보는 강력한 이름의 어셈블리 만들기 및 사용을 참조하십시오.

<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")>  _
Public Class Class1
End Class
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1
{

} 

참고 항목

기타 리소스

보안 코딩 지침