다양한 클래스에서 ProtectionLevel
속성은 ServiceContractAttribute 클래스와 OperationContractAttribute 클래스 같은 여러 클래스에서 찾을 수 있습니다. 이 속성은 메시지의 일부(또는 전체)를 보호하는 방법을 제어합니다. 이 항목에서는 WCF(Windows Communication Foundation) 기능과 작동 방식에 대해 설명합니다.
보호 수준 설정에 대한 지침은 방법: ProtectionLevel 속성 설정을 참조하세요.
비고
보호 수준은 구성이 아닌 코드에서만 설정할 수 있습니다.
기본 사항
보호 수준 기능을 이해하기 위해 다음 기본 문이 적용됩니다.
메시지의 모든 부분에 대해 세 가지 기본 수준의 보호가 있습니다. 속성(발생 위치)은 열거형 값 중 ProtectionLevel 하나로 설정됩니다. 보호의 오름차순으로 다음이 포함됩니다.
None
;Sign
; 보호된 부분은 디지털 서명됩니다. 보호된 메시지 부분의 변조가 탐지되도록 보장됩니다.EncryptAndSign
; 메시지 파트는 서명되기 전에 기밀성을 보장하기 위해 암호화됩니다.
이 기능을 사용하여 애플리케이션 데이터에 대해서만 보호 요구 사항을 설정할 수 있습니다. 예를 들어, WS-Addressing 헤더는 인프라 데이터이므로
ProtectionLevel
의 영향을 받지 않습니다.보안 모드가 설정
Transport
되면 전체 메시지가 전송 메커니즘에 의해 보호됩니다. 따라서 메시지의 여러 부분에 대해 별도의 보호 수준을 설정해도 효과가 없습니다.이는
ProtectionLevel
개발자가 바인딩이 준수해야 하는 최소 수준을 설정하는 방법입니다. 서비스를 배포할 때 구성에 지정된 실제 바인딩은 최소 수준을 지원할 수 있거나 지원되지 않을 수 있습니다. 예를 들어 기본적으로 클래스는 BasicHttpBinding 보안을 제공하지 않습니다(사용하도록 설정할 수 있지만). 따라서None
이외의 설정이 있는 계약과 함께 사용하면 예외가 발생합니다.서비스에서 모든 메시지의 최소
ProtectionLevel
값이Sign
필요한 경우 클라이언트(아마도 비 WCF 기술로 생성됨)는 모든 메시지를 암호화하고 서명할 수 있습니다(필요한 최소값 이상). 이 경우 클라이언트가 최소보다 많은 작업을 수행했기 때문에 WCF에서 예외를 throw하지 않습니다. 그러나 WCF 애플리케이션(서비스 또는 클라이언트)은 가능하면 메시지 부분을 과도하게 보호하지 않지만 최소 수준을 준수합니다. 또한 보안 모드로 사용할Transport
때 전송은 기본적으로 보다 세분화된 수준에서 보호할 수 없기 때문에 메시지 스트림을 과도하게 보호할 수 있습니다.ProtectionLevel
를 명시적으로Sign
또는EncryptAndSign
로 설정한 경우, 보안이 설정된 바인딩을 사용해야 하며, 그렇지 않으면 예외가 발생합니다.보안을 사용하도록 설정하는 바인딩을 선택하고 계약의 아무 곳에도 속성을 설정
ProtectionLevel
하지 않으면 모든 애플리케이션 데이터가 암호화되고 서명됩니다.보안을 사용하도록 설정하지 않은 바인딩(예
BasicHttpBinding
: 클래스에 기본적으로 보안이 비활성화됨)을ProtectionLevel
선택하고 명시적으로 설정되지 않은 경우 애플리케이션 데이터는 보호되지 않습니다.전송 수준에서 보안을 적용하는 바인딩을 사용하는 경우 모든 애플리케이션 데이터는 전송 기능에 따라 보호됩니다.
메시지 수준에서 보안을 적용하는 바인딩을 사용하는 경우 계약에 설정된 보호 수준에 따라 애플리케이션 데이터가 보호됩니다. 보호 수준을 지정하지 않으면 메시지의 모든 애플리케이션 데이터가 암호화되고 서명됩니다.
다양한
ProtectionLevel
범위 수준에서 설정할 수 있습니다. 범위 지정과 관련된 계층 구조가 있으며 다음 섹션에서 설명합니다.
범위 지정
ProtectionLevel
최상위 API를 설정하면 아래의 모든 수준에 대한 수준이 설정됩니다.
ProtectionLevel
하위 수준에서 다른 값으로 설정된 경우 계층 구조에서 해당 수준 아래의 모든 API가 이제 새 수준으로 다시 설정됩니다(위의 API는 최상위 수준의 영향을 받음). 계층 구조는 다음과 같습니다. 동일한 수준의 특성은 동급입니다.
ProtectionLevel 프로그래밍 하기
계층의 ProtectionLevel
어느 지점에서든 프로그래밍하려면 특성을 적용할 때 속성을 적절한 값으로 설정하기만 하면됩니다. 예를 들어 방법: ProtectionLevel 속성 설정을 참조하세요.
비고
오류 및 메시지 계약에 속성을 설정하려면 해당 기능이 작동하는 방식을 이해해야 합니다. 자세한 내용은 방법: ProtectionLevel 속성 설정 및 메시지 계약 사용을 참조하세요.
WS-Addressing 종속성
대부분의 경우 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe) 를 사용하여 클라이언트를 생성하면 클라이언트와 서비스 계약이 동일합니다. 그러나 겉보기에 동일한 계약이 클라이언트에게 예외를 던지게 할 수 있습니다. 이는 바인딩이 WS-Addressing 사양을 지원하지 않고 계약에 여러 수준의 보호가 지정될 때마다 발생합니다. 예를 들어, BasicHttpBinding 클래스가 사양을 지원하지 않거나, WS-Addressing을 지원하지 않는 사용자 지정 바인딩을 만드는 경우입니다. 이 ProtectionLevel
기능은 WS-Addressing 사양을 사용하여 단일 계약에서 다양한 보호 수준을 사용하도록 설정합니다. 바인딩이 WS-Addressing 사양을 지원하지 않으면 모든 수준이 동일한 보호 수준으로 설정됩니다. 계약의 모든 범위에 대한 유효 보호 수준은 계약에 사용되는 가장 강력한 보호 수준으로 설정됩니다.
이로 인해 언뜻 보기에 디버그하기 어려운 문제가 발생할 수 있습니다. 둘 이상의 서비스에 대한 메서드를 포함하는 클라이언트 계약(인터페이스)을 만들 수 있습니다. 즉, 동일한 인터페이스는 많은 서비스와 통신하는 클라이언트를 만드는 데 사용되며 단일 인터페이스에는 모든 서비스에 대한 메서드가 포함됩니다. 개발자는 이 드문 시나리오에서 각 특정 서비스에 적용 가능한 메서드만 호출해야 합니다. 바인딩이 클래스인 BasicHttpBinding 경우 여러 보호 수준을 지원하지 못할 수 있습니다. 그러나 클라이언트에 회신하는 서비스는 필요한 것보다 낮은 보호 수준을 가진 클라이언트에 응답할 수 있습니다. 이 경우 클라이언트는 더 높은 보호 수준이 필요하기 때문에 예외를 throw합니다.
코드의 예제에서는 이 문제를 보여 줍니다. 다음 예제에서는 서비스 및 클라이언트 계약을 보여줍니다. 바인딩이 basicHttpBinding< 요소라고> 가정합니다. 따라서 계약의 모든 작업은 동일한 보호 수준을 갖습니다. 이 균일한 보호 수준은 모든 작업에서 최대 보호 수준으로 결정됩니다.
서비스 계약은 다음과 같습니다.
[ServiceContract()]
public interface IPurchaseOrder
{
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
<OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
Function Price() As Integer
End Interface
다음 코드는 클라이언트 계약 인터페이스를 보여줍니다. 여기에는 다른 서비스와 함께 사용하려는 Tax
메서드가 포함되어 있습니다.
[ServiceContract()]
public interface IPurchaseOrder
{
[OperationContract()]
int Tax();
[OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
<OperationContract()> _
Function Tax() As Integer
<OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
Function Price() As Integer
End Interface
클라이언트가 Price
메서드를 호출하면 서비스에서 회신을 받을 때 예외가 발생합니다. 이는 클라이언트가 ProtectionLevel
에 ServiceContractAttribute
을(를) 지정하지 않기 때문에, 클라이언트는 EncryptAndSign 메서드를 포함한 모든 메서드에 대해 기본값(Price
)을 사용하게 됩니다. 그러나 서비스 계약이 보호 수준이 Sign으로 설정된 단일 메서드를 정의하고 있기 때문에 서비스는 Sign 수준을 사용하여 값을 반환합니다. 이 경우 클라이언트는 서비스로부터의 응답을 유효성 검사할 때 예외를 발생시킵니다.