권한 설계
권한은 보호된 리소스에 액세스하거나 보호된 작업을 수행할 수 있는 기능을 나타냅니다. 사용자 고유의 권한 클래스를 구현하려면, 먼저 설계에 있어서 몇 가지 결정을 내려야 합니다. 우선 사용자 지정 권한으로 보호할 리소스를 확실하게 결정해야 합니다.
다음은, 권한이 중복될 우려가 있는지 살펴봐야 합니다. 어떤 경우에는 어쩔 수 없이 두 가지 권한이 동일한 리소스를 보호하게 됩니다. 예를 들어, 비관리 코드에 액세스하는 권한에는 다른 권한이 포함될 수 있습니다. 왜냐하면, 비관리 코드에 액세스하는 권한이 부여된 코드는 관리되지 않는 API를 통해 거의 모든 작업을 수행할 수 있기 때문입니다. 그러나, 비관리 코드에 액세스할 수 있는 권한이 부여되지 않아도, 다른 특정 리소스에 액세스할 수 있는 권한은 부여해야 합니다. 따라서, 비관리 코드에 액세스하는 권한은 다른 권한과 분리해야 합니다.
겹치는 권한 적용 범위를 관리할 수 있는지 알 수 있는 확실한 방법은 없습니다. 그러나, 여러 권한 중에서 다른 권한에 비해 부여하기 쉬운, 더 세분화된 액세스를 나타내는 권한이 있는지 따져 봐야 합니다. 이러한 경우, 액세스 권한을 쉽게 부여할 수 있기 때문에, 관리자의 작업이 보다 수월해집니다.
권한으로 보호할 리소스를 결정하고 권한 중복과 관련된 문제를 해결했으면, 액세스 제어를 어느 정도 세분화해야 할 것인지 결정해야 합니다. 이 결정에 따라 권한 상태를 나타내는 변수를 설계하는 방법이 달라지며, 관리자가 보호된 리소스에 대한 액세스를 구성할 수 있는지 여부가 결정됩니다. 그 외에도, 성능, 사용 편리성 및 기타 요소에 영향을 줍니다.
이러한 몇 가지 설계 문제를 설명하기 위해, .NET Framework에서 제공하는 FileIOPermission 클래스에 대해 선택할 수 있는 몇 가지 설계를 살펴봅니다. 선택된 설계에 따라 권한 상태를 나타내는 변수에 영향을 줍니다.
비트의 값에 따라 "모든 파일 사용" 또는 "파일 사용 안 함"을 의미하는 단일 비트
비트의 값에 따라 "모든 파일 읽기" 및 "모든 파일 쓰기" 또는 이 둘의 반대를 의미하는 2비트
"지정된 드라이브의 모든 파일 사용"을 의미하는 26비트
액세스가 부여된 모든 파일을 나열하는 문자열 배열
고려해야 할 여러 가지 장단점이 있습니다. 예를 들어, 단일 비트 권한은 매우 간단하고 빠르며 이해하기 쉬운 반면, 관리자가 전부를 선택하거나 전부 선택하지 않아야 하므로 바람직하지 않을 수 있습니다. 권한 상태를 좀 더 복잡하게 표시하는 다른 선택 항목들은 성능을 다소 저하시킬 수 있습니다. 위와 같은 장단점을 고려해야 하며, 동일한 리소스를 보호하기 위해 두 가지 이상의 권한을 만들어서는 안 된다는 점도 염두에 두어야 합니다. 일반적으로, 권한 클래스를 설계할 때는 성능에 큰 영향을 주지 않는 범위 내에서 꼭 필요한 정도로만 복잡하게 권한 상태를 만들어야 합니다.
다른 설계도 가능하긴 하지만, 대부분의 권한은 다음과 같은 표준 디자인 패턴 중 하나 또는 패턴의 조합을 사용합니다.
부울 권한. 부울 권한은 가장 간단한 권한 개체로, 두 개 이상의 비트로 구성됩니다. 각 비트는 "X를 수행할 수 있는 권한"에 해당합니다. 사용자는 해당 권한을 갖거나 갖지 않습니다. 이러한 권한 형식의 예로는 SecurityPermission 클래스가 있습니다. 이 권한 개체의 상태에는 비관리 코드를 호출할 수 있는 권한 등 서로 다른 작업을 수행할 수 있는 권한을 나타내는 부울 변수가 포함되는데, 각 권한은 허용되거나 허용되지 않습니다.
권한의 수준. 이렇게 보다 세분화된 형식의 권한에는 0(액세스 없음)과 좀더 큰 수(아무런 제한이 없는 액세스) 사이의 몇 가지 수준으로 각각의 액세스 종류를 나타내는 변수가 있습니다. 예를 들어, UIPermission 클래스를 사용하여 "UI 권한 없음"부터 "제한 없는 UI 권한"에 이르기까지 몇 단계로, 창을 사용하는 다양한 수준의 권한을 나타낼 수 있습니다.
개체 목록 권한. 이러한 형식의 권한을 사용하면 허용되거나 허용되지 않는 권한을 매우 세부적으로 나타낼 수 있습니다. FileIOPermission 클래스는 특정 종류의 액세스가 허용되는 파일 목록으로 상태를 나타내기 때문에, 이러한 형식의 권한을 나타내는 좋은 예입니다. 목록을 있는 권한은 명명된 개체가 많이 포함된 리소스를 보호하는 데 유용합니다.
보안 시스템이 권한 클래스를 요구할 때 권한이 종속된 어셈블리가 로드되어야 하므로, 일반적으로 사용자 지정 권한 클래스에서는 외부 종속성을 최소화하는 것이 좋습니다. 가능하면 사용자 지정 권한과 이 권한에 연결된 특성 클래스를 별도의 어셈블리에 삽입하여 다른 어셈블리가 불필요하게 로드될 가능성을 줄여야 합니다.