SQL Server 프로그래밍 및 호스트 보호 특성

SQL Server 호스트에서 관리 코드를 로드 및 실행하려면 코드 액세스 보안과 호스트 리소스 보호 둘 다를 위해 호스트의 요구 사항을 충족해야 합니다. 코드 액세스 보안 요구 사항은 세 가지 SQL Server 권한 집합인 SAFE, EXTERNAL-ACCESS, UNSAFE 중 하나로 지정됩니다. SAFE 또는 EXTERNAL-ACCESS 권한 집합 내에서 코드를 실행하는 경우 HostProtectionAttribute 특성이 적용된 특정 형식이나 멤버를 사용하면 안 됩니다. HostProtectionAttribute는 호스트에서 허용되지 않을 수 있는 형식이나 메서드인 특정 코드 구문을 식별한다는 점에서 보안 권한이 아니라 안정성 보장입니다. HostProtectionAttribute를 사용하면 호스트의 안정성을 보호하는 데 도움이 되는 프로그래밍 모델이 적용됩니다.

참고 항목

CAS(코드 액세스 보안)는 .NET Framework 및 .NET의 모든 버전에서 더 이상 사용되지 않습니다. 최신 버전의 .NET은 CAS 주석을 준수하지 않으며 CAS 관련 API를 사용하는 경우 오류가 발생합니다. 개발자는 보안 작업을 수행하는 대체 수단을 찾아야 합니다.

호스트 보호 특성

호스트 보호 특성은 호스트 프로그래밍 모델에 맞지 않는 형식이나 멤버를 식별하고 다음과 같은 증가하는 안정성 위협 수준을 나타냅니다.

  • 달리 유해하지 않습니다.

  • 서버에서 관리하는 사용자 코드가 불안정해질 수 있습니다.

  • 서버 프로세스 자체가 불안정해질 수 있습니다.

SQL Server에서는 HostProtectionResourceSharedState, Synchronization, MayLeakOnAbort 또는 ExternalProcessMgmt를 지정하는 HostProtectionAttribute가 있는 형식 또는 멤버의 사용을 허용하지 않습니다. 이 때문에 어셈블리에서 공유 상태를 사용하도록 설정하거나, 동기화를 수행하거나, 종료 시 리소스 누수가 발생할 수 있거나, SQL Server 프로세스의 무결성에 영향을 주는 멤버를 호출할 수 없습니다.

허용되지 않는 형식 및 멤버

다음 표에서는 HostProtectionResource 값이 SQL Server에서 허용되지 않는 형식 및 멤버를 식별합니다.

네임스페이스 형식 또는 멤버
Microsoft.Win32 PowerModeChangedEventArgs 클래스

PowerModeChangedEventHandler 대리자

SessionEndedEventArgs 클래스

SessionEndedEventHandler 대리자

SessionEndingEventArgs 클래스

SessionEndingEventHandler 대리자

SessionSwitchEventArgs 클래스

SessionSwitchEventHandler 대리자

SystemEvents 클래스

TimerElapsedEventArgs 클래스

TimerElapsedEventHandler 대리자

UserPreferenceChangedEventArgs 클래스

UserPreferenceChangingEventArgs 클래스
System.Collections ArrayList.Synchronized 메서드

Hashtable.Synchronized 메서드

Queue.Synchronized 메서드

SortedList.Synchronized 메서드

Stack.Synchronized 메서드
System.ComponentModel AddingNewEventArgs 클래스

AddingNewEventHandler 대리자

ArrayConverter 클래스

AsyncCompletedEventArgs 클래스

AsyncCompletedEventHandler 대리자

AsyncOperation 클래스

AsyncOperationManager 클래스

AttributeCollection 클래스

BackgroundWorker 클래스

BaseNumberConverter 클래스

BindingList<T> 클래스

BooleanConverter 클래스

ByteConverter 클래스

CancelEventArgs 클래스

CancelEventHandler 대리자

CharConverter 클래스

CollectionChangeEventArgs 클래스

CollectionChangeEventHandler 대리자

CollectionConverter 클래스

ComponentCollection 클래스

ComponentConverter 클래스

ComponentEditor 클래스

ComponentResourceManager 클래스

Container 클래스

ContainerFilterService 클래스

CultureInfoConverter 클래스

CustomTypeDescriptor 클래스

DateTimeConverter 클래스

DecimalConverter 클래스

ActiveDesignerEventArgs 클래스

ActiveDesignerEventHandler 대리자

CheckoutException 클래스

CommandID 클래스

ComponentChangedEventArgs 클래스

ComponentChangedEventHandler 대리자

ComponentChangingEventArgs 클래스

ComponentChangingEventHandler 대리자

ComponentEventArgs 클래스

ComponentEventHandler 대리자

ComponentRenameEventArgs 클래스

ComponentRenameEventHandler 대리자

DesignerCollection 클래스

DesignerEventArgs 클래스

DesignerEventHandler 대리자

DesignerOptionService 클래스

DesignerTransaction 클래스

DesignerTransactionCloseEventArgs 클래스

DesignerTransactionCloseEventHandler 대리자

DesignerVerb 클래스

DesignerVerbCollection 클래스

DesigntimeLicenseContext 클래스

DesigntimeLicenseContextSerializer 클래스

MenuCommand 클래스

ComponentSerializationService 클래스

ContextStack 클래스

DesignerLoader 클래스

InstanceDescriptor 클래스

MemberRelationshipService 클래스

ResolveNameEventArgs 클래스

ResolveNameEventHandler 대리자

SerializationStore 클래스

ServiceContainer 클래스

ServiceCreatorCallback 대리자

StandardCommands 클래스

StandardToolWindows 클래스

DoubleConverter 클래스

DoWorkEventArgs 클래스

DoWorkEventHandler 대리자

EnumConverter 클래스

EventDescriptor 클래스

EventDescriptorCollection 클래스

EventHandlerList 클래스

ExpandableObjectConverter 클래스

HandledEventArgs 클래스

HandledEventHandler 대리자

InstanceCreationEditor 클래스

Int16Converter 클래스

Int32Converter 클래스

Int64Converter 클래스

InvalidAsynchronousStateException 클래스

InvalidEnumArgumentException 클래스

BeginInvoke 메서드

License 클래스

LicenseContext 클래스

LicenseException 클래스

LicenseManager 클래스

LicenseProvider 클래스

LicFileLicenseProvider 클래스

ListChangedEventArgs 클래스

ListChangedEventHandler 대리자

ListSortDescription 클래스

ListSortDescriptionCollection 클래스

MaskedTextProvider 클래스

MemberDescriptor 클래스

MultilineStringConverter 클래스

NestedContainer 클래스

NullableConverter 클래스

ProgressChangedEventArgs 클래스

ProgressChangedEventHandler 대리자

PropertyChangedEventArgs 클래스

PropertyChangedEventHandler 대리자

PropertyDescriptor 클래스

PropertyDescriptorCollection 클래스

ReferenceConverter 클래스

RefreshEventArgs 클래스

RefreshEventHandler 대리자

RunWorkerCompletedEventArgs 클래스

RunWorkerCompletedEventHandler 대리자

SByteConverter 클래스

SingleConverter 클래스

StringConverter 클래스

SyntaxCheck 클래스

TimeSpanConverter 클래스

TypeConverter 클래스

TypeDescriptionProvider 클래스

TypeDescriptor 클래스

TypeListConverter 클래스

UInt16Converter 클래스

UInt32Converter 클래스

UInt64Converter 클래스

WarningException 클래스

Win32Exception 클래스
System.Diagnostics Debug.Listeners 속성

Trace.Listeners 속성

EventLog.SynchronizingObject 속성

ConsoleTraceListener 클래스

DefaultTraceListener 클래스

DelimitedListTraceListener 클래스

EventLogTraceListener 클래스

PerformanceCounter 클래스

PerformanceCounterCategory 클래스

Process 클래스

ProcessStartInfo 클래스

TextWriterTraceListener 클래스

TraceListener 클래스

XmlWriterTraceListener 클래스

TraceSource.Listeners 속성
System.IO Stream.Synchronized 메서드

TextReader.Synchronized 메서드

TextWriter.Synchronized 메서드
System.Reflection.Emit ConstructorBuilder 클래스

EventBuilder 클래스

FieldBuilder 클래스

MethodBuilder 클래스

CustomAttributeBuilder 클래스

MethodRental 클래스

ModuleBuilder 클래스

PropertyBuilder 클래스

TypeBuilder 클래스

UnmanagedMarshal 클래스
System.Text Group.Synchronized 메서드

Match.Synchronized 메서드
System.Threading AutoResetEvent 클래스

EventWaitHandle 클래스

ManualResetEvent 클래스

Monitor 클래스

Mutex 클래스

ReaderWriterLock 클래스

Semaphore 클래스

Thread.AllocateNamedDataSlot 메서드

Thread.BeginCriticalRegion 메서드

Thread.EndCriticalRegion 메서드

Thread.FreeNamedDataSlot 메서드

Thread.GetData 메서드

Thread.Join 메서드

Thread.SetApartmentState 메서드

Thread.SetData 메서드

Thread.SpinWait 메서드

Thread.Start 메서드

Thread.TrySetApartmentState 메서드

ThreadPool 클래스

Timer 클래스
System.Timers Timer 클래스
System.Web.Configuration MachineKeyValidationConverter 클래스
System.Windows.Forms AutoCompleteStringCollection.SyncRoot 속성

SQL Server 권한 집합

SQL Server에서는 사용자가 데이터베이스에 배포되는 코드에 대한 안정성 요구 사항을 지정할 수 있습니다. 어셈블리를 데이터베이스에 업로드할 때 어셈블리 작성자가 해당 어셈블리에 대해 세 가지 권한 집합(SAFE, EXTERNAL-ACCESS 또는 UNSAFE) 중 하나를 지정할 수 있습니다.

권한 집합 SAFE EXTERNAL-ACCESS UNSAFE
코드 액세스 보안 실행만 실행 및 외부 리소스 액세스 제한 없음
프로그래밍 모델 제한 제한 없음
안정성 요구 사항 아니요
네이티브 코드 호출 기능 아니요 없음

SAFE는 허용되는 프로그래밍 모델 측면에서 연결된 제한 사항이 있는 가장 안정적인 보안 모드입니다. SAFE 코드에는 높은 안정성 및 보안 기능이 있습니다. SAFE 어셈블리에는 충분한 실행 권한이 제공되며, 계산을 수행하고, 로컬 데이터베이스에 액세스할 수 있습니다. SAFE 어셈블리는 확인할 수 있는 형식 안전 어셈블리여야 하며 비관리 코드를 호출할 수 없습니다.

EXTERNAL-ACCESS는 중급 보안 옵션을 제공하며, 코드에서 데이터베이스 외부의 리소스에 액세스할 수 있도록 허용하지만 여전히 SAFE의 안정성과 보안을 유지합니다.

UNSAFE는 데이터베이스 관리자만 만들 수 있는 고도로 신뢰할 수 있는 코드에 사용됩니다. 이 신뢰할 수 있는 코드에는 코드 액세스 제한이 없으며 비관리(네이티브) 코드를 호출할 수 있습니다.

SQL Server는 호스트 수준의 코드 액세스 보안 정책 계층을 사용하여 SQL Server 카탈로그에 저장된 권한 집합에 따라 세 가지 권한 집합 중 하나를 부여하는 호스트 정책을 설정합니다. 데이터베이스 내부에서 실행되는 관리 코드에는 항상 이러한 코드 액세스 권한 집합 중 하나가 부여됩니다.

프로그래밍 모델 제한 사항

SQL Server의 관리 코드에 대한 프로그래밍 모델에는 여러 호출 간에 유지되는 상태를 사용하거나 여러 사용자 세션 간에 상태를 공유할 필요가 없는 함수, 프로시저 및 형식이 필요합니다. 또한 앞서 설명한 것과 같이 공유된 상태가 있으면 해당 애플리케이션의 확장성과 안정성에 영향을 주는 중대한 예외가 발생할 수 있습니다.

이러한 점을 고려하여 SQL Server에서는 정적 변수와 정적 데이터 멤버의 사용을 허용하지 않습니다. SAFE 및 EXTERNAL-ACCESS 어셈블리의 경우 SQL Server에서 CREATE ASSEMBLY 시간에 어셈블리의 메타데이터를 검사하고, 정적 데이터 멤버와 변수 사용을 발견할 경우 해당 어셈블리를 만들지 못합니다.

참고 항목