가장 및 CLR 통합 보안

관리 코드에서 외부 리소스를 액세스할 때 SQL Server에서는 루틴이 실행되고 있는 현재 실행 컨텍스트를 자동으로 가장하지 않습니다. EXTERNAL_ACCESS 및 UNSAFE 어셈블리의 코드에서는 현재 실행 컨텍스트를 명시적으로 가장할 수 있습니다.

[!참고]

가장의 동작 변경에 대한 자세한 내용은 SQL Server 2008 R2 데이터베이스 엔진 기능의 주요 변경 내용을 참조하십시오.

In-process 데이터 액세스 공급자는 현재 보안 컨텍스트와 연관된 토큰을 검색하는 데 사용할 수 있는 응용 프로그래밍 인터페이스 SqlContext.WindowsIdentity를 제공합니다. EXTERNAL_ACCESS 및 UNSAFE 어셈블리의 관리 코드에서는 이 메서드를 사용하여 컨텍스트를 검색할 수 있고 .NET Framework WindowsIdentity.Impersonate 메서드를 사용하여 해당 컨텍스트를 가장할 수 있습니다. 사용자 코드에서 명시적으로 가장할 때는 다음과 같은 제한 사항이 적용됩니다.

  • 관리 코드가 가장된 상태에 있는 경우 in-process 데이터 액세스가 허용되지 않습니다. 코드에서 가장을 실행 취소한 다음 in-process 데이터 액세스를 호출할 수 있습니다. 이를 위해서는 원래 Impersonate 메서드의 반환 값(WindowsImpersonationContext 개체)을 저장하고 이 WindowsImpersonationContext에서 Undo 메서드를 호출해야 합니다.

    이 제한 사항은 in-process 데이터 액세스가 항상 세션에 대해 유효한 현재 보안 컨텍스트의 컨텍스트에서 발생한다는 것을 의미합니다. 이 사항은 관리 코드 내에서 명시적 가장으로 수정할 수 없습니다.

  • UNSAFE 어셈블리를 통해 스레드를 만들고 코드를 비동기적으로 실행하는 것과 같이 관리 코드를 비동기적으로 실행하고 있는 경우에는 in-process 데이터 액세스가 허용되지 않습니다. 이는 가장을 사용하는 경우와 사용하지 않는 경우에 모두 적용됩니다.

SQL Server와 다른 가장된 컨텍스트에서 코드가 실행되고 있는 경우 in-process 데이터 액세스 호출을 수행할 수 없습니다. In-process 데이터 액세스를 호출하기 전에 먼저 가장 컨텍스트를 실행 취소해야 합니다. 관리 코드에서 in-process 데이터 액세스를 수행하는 경우 관리 코드에 대한 Transact-SQL 진입점의 원래 실행 컨텍스트가 항상 권한 부여를 위해 사용됩니다.

EXTERNAL_ACCESS 어셈블리와 UNSAFE 어셈블리는 모두 앞에서 설명한 대로 현재 보안 컨텍스트를 자발적으로 가장하지 않는 경우 SQL Server 서비스 계정을 사용하여 운영 체제 리소스에 액세스합니다. 따라서 EXTERNAL_ACCESS 어셈블리의 작성자에게는 EXTERNAL ACCESS 로그인 수준 권한으로 지정되는 SAFE 어셈블리보다 높은 신뢰 수준이 필요합니다. 따라서 SQL Server 서비스 계정에서 코드를 실행하도록 트러스트된 로그인에게만 EXTERNAL ACCESS 권한을 부여해야 합니다.