같은 컴퓨터에서만 WCF 요청을 서비스하도록 설정
이런 경우가 있죠? 보안상. 단지 한 대의 PC 내부에서만 프로세스끼리 통신해야 할 경우라면 굳이 외부로부터 오는 원격 메서드 호출을 허용해야 할 필요가 없습니다.
이에 대한 해결책을 아래의 글에서 설명해 주고 있습니다.
Securing WCF to only respond to local requests
; http://blogs.msdn.com/phenning/archive/2006/10/31/securing-wcf-to-only-respond-to-local-requests.aspx
오호... 언제나 Default 값으로만 놓고 사용했던 HostNameComparisonMode 값이 여기서 빛을 발하는군요. ^^
config에서 설정해주는 것도 물론 가능합니다. 서버 측은 다음과 같이 설정해 주고,
<services>
<service
name="TestWCF.TestService"
behaviorConfiguration="TestServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://127.0.0.1:20000/TestService/"/>
</baseAddresses>
</host>
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="TestServiceHttpBinding"
contract="TestWCF.ITestService" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="TestServiceHttpBinding" hostNameComparisonMode="Exact">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
클라이언트 측에서는 다음과 같이 설정해 주면 됩니다.
<client>
<endpoint address="http://127.0.0.1:20000/TestService/"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ITestService"
contract="TestWCF.ITestService"
name="BasicHttpBinding_ITestService" />
</client>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ITestService" ... >
</binding>
</basicHttpBinding>
</bindings>
서버에서 127.0.0.1로 설정되어 있죠? 재미있는 것은 클라이언트 측에서 접속 주소가 "http://localhost:20000"으로 하는 것조차도 막는다는 것입니다. 그래서 이런 경우 다음과 같이 예외를 발생시킵니다.
System.ServiceModel.EndpointNotFoundException was unhandled
Message="There was no endpoint listening at http://localhost:20000/TestService/ that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details."
Source="mscorlib"
StackTrace:
Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
... [중간 생략] ...
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)
InnerException: System.Net.WebException
Message="The remote server returned an error: (404) Not Found."
Source="System"
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
InnerException:
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]