전송 보안 개요

WCF(Windows Communication Foundation)의 전송 보안 메커니즘은 사용 중인 바인딩 및 전송에 따라 달라집니다. 예를 들어 WSHttpBinding 클래스를 사용할 경우 전송은 HTTP이며, 전송 보안을 위한 기본 메커니즘은 HTTPS라고 알려진 HTTP를 통한 SSL(Secure Sockets Layer)입니다. 이 항목에서는 WCF 시스템 제공 바인딩에 사용되는 주요 전송 보안 메커니즘에 대해 설명합니다.

참고 항목

.NET Framework 3.5 이상에서 SSL 보안을 사용하는 경우 WCF 클라이언트는 인증서 저장소의 중간 인증서와 SSL 협상 중에 받은 중간 인증서를 모두 사용하여 서비스의 인증서에서 인증서 체인 유효성 검사를 수행합니다. .NET Framework 3.0은 로컬 인증서 저장소에 설치된 중간 인증서만 사용합니다.

Warning

전송 보안이 사용되는 경우에는 Thread.CurrentPrincipal 속성이 덮어쓰일 수 있습니다. ServiceAuthorizationBehavior.PrincipalPermissionModePrincipalPermissionMode.None으로 설정하여 이러한 일이 발생하지 않도록 합니다. ServiceAuthorizationBehavior는 서비스 설명에 설정할 수 있는 서비스 동작입니다.

BasicHttpBinding

기본적으로 BasicHttpBinding 클래스는 보안을 제공하지 않습니다. 이 바인딩은 보안을 구현하지 않는 웹 서비스 공급자와의 상호 운용성을 위해 디자인되었습니다. 하지만 Mode 속성을 None 이외의 값으로 설정하여 보안으로 전환할 수 있습니다. 전송 보안을 사용하려면 속성을 Transport로 설정합니다.

IIS와의 상호 운용

BasicHttpBinding 클래스는 기존의 웹 서비스와 상호 운용하는 데 주로 사용되고, 이러한 서비스의 대부분은 IIS(인터넷 정보 서비스)에 의해 호스팅됩니다. 따라서 이 바인딩에 대한 전송 보안은 IIS 사이트와 매끄럽게 상호 운용하도록 디자인되었습니다. 이를 위해서는 보안 모드를Transport로 설정한 다음 클라이언트 자격 증명 형식을 설정하면 됩니다. 자격 증명 형식 값은 IIS 디렉터리 보안 메커니즘에 해당됩니다. 다음 코드에서는 설정되는 모드와 Windows로 설정된 자격 증명 형식을 보여 줍니다. 이러한 구성은 클라이언트와 서버가 같은 Windows 도메인에 있는 경우에 사용할 수 있습니다.

BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport ;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Dim b As BasicHttpBinding = New BasicHttpBinding()
b.Security.Mode = BasicHttpSecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows

또는 다음 구성을 사용할 수도 있습니다.

<bindings>  
  <basicHttpBinding>  
    <binding name="SecurityByTransport">  
      <security mode="Transport">  
        <transport clientCredentialType="Windows" />  
       </security>  
     </binding>  
  </basicHttpBinding>  
</bindings>  

다음 단원에서는 기타 다른 클라이언트 자격 증명 형식에 대해 설명합니다.

기본

IIS의 기본 인증 방식입니다. 이 모드를 사용하려면 Windows 사용자 계정과 적절한 NTFS 파일 시스템 권한으로 IIS 서버를 구성해야 합니다. IIS 6.0에 대한 자세한 내용은 기본 인증 사용 및 영역 이름 구성을 참조하세요. IIS 7.0에 대한 자세한 내용은 기본 인증 구성(IIS 7)을 참조하세요.

MSSQLSERVER에 대한 프로토콜 속성

IIS에는 클라이언트가 인증서를 사용하여 로그온해야 하는 옵션이 있습니다. 또한 이 기능을 사용하면 IIS에서 클라이언트 인증서를 Windows 계정에 매핑할 수 있습니다. IIS 6.0에 대한 자세한 내용은 IIS 6.0에서 클라이언트 인증서 사용을 참조하세요. IIS 7.0에 대한 자세한 내용은 IIS 7에서 서버 인증서 구성을 참조하세요.

다이제스트

다이제스트 인증은 기본 인증과 비슷하지만 자격 증명을 일반 텍스트가 아닌 해시로 보낼 수 있는 이점이 있습니다. IIS 6.0에 대한 자세한 내용은 IIS 6.0의 다이제스트 인증을 참조하세요. IIS 7.0에 대한 자세한 내용은 다이제스트 인증 구성(IIS 7)을 참조하세요.

Windows

IIS의 Windows 통합 인증입니다. 이 값으로 설정하는 경우 도메인 컨트롤러가 Kerberos 프로토콜인 Windows 도메인에 서버가 있어야 합니다. 서버가 Kerberos 기반 도메인에 있지 않거나 Kerberos 시스템에 오류가 있는 경우에는 다음 단원에 설명되어 있는 NTLM(NT LAN Manager) 값을 사용할 수 있습니다. IIS 6.0에 대한 자세한 내용은 IIS 6.0의 Windows 통합 인증을 참조하세요. IIS 7.0에 대한 자세한 내용은 IIS 7에서 서버 인증서 구성을 참조하세요.

NTLM

Kerberos 프로토콜에 오류가 있는 경우 이를 통해 서버가 인증에 NTLM을 사용할 수 있습니다. IIS 6.0에서 IIS를 구성하는 방법에 대한 자세한 내용은 강제 NTLM 인증을 참조하세요. IIS 7.0의 경우 Windows 인증에 NTLM 인증이 포함됩니다. 자세한 내용은 IIS 7에서 서버 인증서 구성을 참조하십시오.

WsHttpBinding

WSHttpBinding 클래스는 WS-* 사양을 구현하는 서비스와의 상호 운용을 위해 설계되었습니다. 이 바인딩에 대한 전송 보안은 HTTP 또는 HTTPS를 통한 SSL(Secure Sockets Layer)입니다. SSL을 사용하는 WCF 애플리케이션을 만들려면 IIS를 사용하여 애플리케이션을 호스팅합니다. 또는 자체 호스팅 애플리케이션을 만들려면 HttpCfg.exe 도구를 사용하여 X.509 인증서를 컴퓨터의 특정 포트에 바인딩합니다. 포트 번호는 WCF 애플리케이션의 일부인 엔드포인트 주소로 지정되어 있습니다. 전송 모드 사용 시 엔드포인트 주소에 HTTPS 프로토콜이 포함되어야 하고, 그렇지 않으면 런타임에 예외가 throw됩니다. 자세한 내용은 HTTP 전송 보안을 참조하세요.

클라이언트 인증의 경우 ClientCredentialType 클래스의 HttpTransportSecurity 속성을 HttpClientCredentialType 열거형 값 중 하나로 설정합니다. 열거형 값은 BasicHttpBinding에 대한 클라이언트 자격 증명 형식과 같으며 IIS 서비스와 호스팅되도록 디자인되었습니다.

다음 예제에서는 Windows 클라이언트 자격 증명 형식과 함께 사용되는 바인딩을 보여 줍니다.

// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows

WSDualHttpBinding

이 바인딩에서는 전송 수준 보안이 아닌 메시지 수준 보안만을 제공합니다.

NetTcpBinding

NetTcpBinding 클래스는 메시지 전송에 TCP를 사용합니다. 전송 모드에 대한 보안은 TCP를 통한 TLS(전송 계층 보안) 구현을 통해 제공되며 TLS 구현은 운영 체제에 의해 제공됩니다.

다음 코드에서와 같이ClientCredentialType 클래스의 TcpTransportSecurity 속성을 TcpClientCredentialType 값 중 하나로 설정하여 클라이언트의 자격 증명 형식을 지정할 수도 있습니다.

NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate

클라이언트

클라이언트에서는 SetCertificate 클래스의 X509CertificateInitiatorClientCredential 메서드를 사용하여 인증서를 지정해야 합니다.

참고 항목

Windows 보안을 사용하는 경우 인증서는 필요하지 않습니다.

다음 코드에서는 인증서를 고유하게 식별하는 인증서의 지문을 사용합니다. 자세한 내용은 인증서 작업을 참조하세요.

NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine,
    StoreName.My,
    X509FindType.FindByThumbprint,
    "0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, _
    StoreName.My, _
    X509FindType.FindByThumbprint, _
    "0000000000000000000000000000000000000000")

또는 동작 섹션에서 <clientCredentials> 요소를 사용하여 클라이언트의 구성에 인증서를 지정합니다.

<behaviors>  
  <behavior>  
   <clientCredentials>  
     <clientCertificate findValue= "101010101010101010101010101010000000000"
      storeLocation="LocalMachine" storeName="My"
      X509FindType="FindByThumbPrint">  
     </clientCertificate>  
   </clientCredentials>  
 </behavior>  
</behaviors>

NetNamedPipeBinding

NetNamedPipeBinding 클래스는 컴퓨터 내의 효율적 통신을 위해 디자인되었습니다. 명명된 파이프 채널을 동일한 네트워크에 있는 두 컴퓨터 간에 만들 수도 있지만, 이 클래스는 동일한 컴퓨터에서 실행되는 프로세스를 위해 만들어진 클래스입니다. 이 바인딩에서는 전송 수준 보안만을 제공합니다. 이 바인딩을 사용하는 애플리케이션을 만들려면 엔드포인트 주소에는 "net.pipe"가 엔드포인트 주소의 프로토콜로 포함되어야 합니다.

WSFederationHttpBinding

이 바인딩에서는 전송 보안을 사용할 때 HTTPS라고도 하는 HTTP를 통한 SSL을 발급된 토큰(TransportWithMessageCredential)과 함께 사용합니다. 페더레이션 애플리케이션에 대한 자세한 내용은 페더레이션 및 발급된 토큰을 참조하세요.

NetPeerTcpBinding

NetPeerTcpBinding 클래스는 피어 투 피어 네트워킹 기능을 사용하는 효율적인 통신을 위해 디자인된 보안 전송입니다. 클래스 및 바인딩의 이름에서 알 수 있듯이 TCP가 프로토콜입니다. 보안 모드가 전송으로 설정되어 있는 경우 바인딩은 TCP를 통한 TLS를 구현합니다. 피어 투 피어 기능에 대한 자세한 내용은 피어 투 피어 네트워킹을 참조하세요.

MsmqIntegrationBinding 및 NetMsmqBinding

메시지 큐(이전의 MSMQ)를 사용한 전송 보안에 대한 자세한 내용은 전송 보안을 사용하여 메시지 보안 설정을 참조하세요.

참고 항목