보안 요청

업데이트: 2007년 11월

지정된 권한이 부여된 호출자만 코드에 액세스하도록 하려면 코드 호출자가 특정 권한이나 권한 집합을 갖도록 선언적 또는 명령적으로 요청할 수 있습니다. 이러한 요청에 따라 공용 언어 런타임은 호출하는 코드를 제한하는 보안 검사를 수행합니다. 보안 검사를 수행하는 동안 공용 언어 런타임은 호출 스택을 탐색하면서 각 호출자의 권한을 검사하고 요청되는 권한이 각 호출자에게 부여되어 있는지 파악합니다. 요청되는 권한이 없는 호출자가 있으면 보안 검사에 실패하므로 SecurityException이 throw됩니다. 스택 워크를 발생시키지 않는 요청만이 직접 실행 호출자만 검사하는 링크 요청이 됩니다.

특정 메서드를 호출할 때마다 또는 특정 코드 블록이 실행될 때마다 보안 검사가 수행되도록 할 수 있습니다. 특정 클래스의 모든 멤버가 호출될 때 보안 검사가 수행되도록 하려면 클래스 앞에 요청을 삽입하여 클래스의 모든 멤버에 요청을 적용합니다. 이 항목의 나머지 부분에서는 보안 요청을 하는 방법, 요청하는 시기, 하나의 특정 보안 요청 형식을 선택하는 이유에 대해 설명합니다.

보호된 리소스를 직접 액세스하는 라이브러리를 작성하거나 이러한 액세스가 호출자에게 노출되는 경우, 라이브러리에서 보안 요청을 작성하여 호출 스택에 있는 모든 호출자가 해당 리소스에 대한 액세스 권한을 갖도록 합니다. 선언적 또는 명령적 요청을 사용할 수 있습니다. 클래스 생성자 코드는 특정 위치나 특정 컨텍스트에서 실행된다고 보장할 수 없으므로 요청은 클래스 생성자에서 작성하면 안 됩니다. 클래스 생성자의 호출 스택 상태는 명확하게 정의되지 않으므로 클래스 생성자에 있는 요청에 의해 예기치 않은 또는 원하지 않은 결과가 나타날 수 있습니다.

작성하려는 요청 형식에 상관없이 다음 지침에 따라야 합니다.

  • 호출자가 특정 사이트나 영역에서 발생한 호출자인지 또는 호출자가 특정 ID 권한을 갖도록 요청하여 특정 게시자에 의해 서명되었는지 확인합니다. 그러나, 이는 ID 일치를 기준으로 추가 액세스를 부여할 경우에만 해당되며 ID 일치를 기준으로 액세스를 거부할 경우에는 해당되지 않습니다. 코드의 ID를 수정하거나 마스크하는 것은 상대적으로 간단하므로 ID만을 기준으로 액세스를 거부하면, 권한 없이 액세스하지 못하도록 코드와 코드가 액세스하는 리소스를 안전하게 보호할 수 없습니다.

  • 요청을 개체의 클래스 수준에 삽입하여 특정 권한을 갖는 호출자만이 개체를 만들 수 있도록 합니다. 예를 들어, FileStream에서 파생된 myFileStream이라는 클래스가 있는데, 권한이 있는 호출자만이 myFileStream의 인스턴스를 만들 수 있도록 하려고 합니다. myFileStream이 만든 스트림에 대한 액세스 권한을 나타내는 FileIOPermission 개체에 대한 선언적 요청을 myFileStream 클래스의 클래스 수준에 삽입하면 됩니다.

  • 속성을 설정하거나 가져오는 코드에 요청을 삽입할 수도 있습니다. 일반적으로 속성에 암호 같이 민감한 정보가 포함되어 있는 경우가 아니면, 비교적 덜 제한적인 권한에 대한 요청은 set 접근자보다는 get 접근자에 삽입합니다.

    참고:

    역할 기반 보안 검사는 코드 액세스 보안 검사와는 의미가 약간 다릅니다. 자세한 내용은 역할 기반 보안을 참조하십시오.

    참고:

    클래스, 메서드, 이벤트 및 속성 수준에만 요청을 적용할 수 있으며, 어셈블리 및 개별적인 비전용 변수 멤버는 요청으로 보호되지 않습니다. 어셈블리나 비전용 변수 수준에 요청을 삽입할 경우 컴파일러 경고가 발생하지는 않습니다. 따라서 요청을 적용하는 것과 같은 보호를 받도록 하려면 공용 멤버 대신 속성을 사용해야 합니다.

참고 항목

개념

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

참조

SecurityException

기타 리소스

코드 액세스 보안