Silverlight/Lecture

Silverlight & WCF on HTTPS 사용시 체크할 것

길버트리 2009. 2. 12. 11:33


 ㄴ사진출처 : http://flickr.com/photos/trishabrunner/457232928/


실버라이트가 HTTPS 프로토콜을 통해 WCF를 이용할 때, 다음 3가지 파일들의 설정에 의해 성패가 좌우됩니다.

1. Web.config (서버측)
2. clientaccesspolicy.xml (서버측)
3. ServiceReference.ClientConfig (클라이언트측 - 실버라이트 프로젝트에 포함)

그러면 순서대로 하나하나 살펴 보겠습니다.


1. Web.config

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SelfServiceTypeBehaviors">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors> 

    <services>
      <service behaviorConfiguration="SelfServiceTypeBehaviors"
        name="Foo.MyProduct.Service.SelfServicee">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="secureHttp"
          bindingNamespace="http://foo.com/Service.SelfService/"
          contract="Foo.MyProduct.Service.SelfService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <basicHttpBinding>
        <binding name="userHttp">
          <!-- this is for demo only. Https/Transport security is recommended -->
          <security mode="None"/>
        </binding>
        <binding name="secureHttp">
          <!-- this is for demo only. Https/Transport security is recommended -->
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
   
    <!-- this is needed since this service is only supported with HTTP protocol -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

 </system.serviceModel>

WCF 서비스를 HTTPS프로토콜로 지원하기 위해서는 보안 바인딩을 사용해야 하는데요.
기본으로 생성되어 있는 binding을 수정하여 사용해도 되고, 해당 웹서버에서 서비스에 따라 HTTP와 HTTPS를 선택적으로 지원해야 한다면 새 binding을 추가합니다.

위에 보시면, Foo.MyProduct.Service.SelfServicee란 서비스는 secureHttp란 binding을 새로 만들어서 사용하고 있는
것이 보이실 것입니다. <transport clientCredentialType="None"/>는 생략하셔도 무방합니다.


2. clientaccesspolicy.xml

실버라이트 클라이언트에 대해서 접근권한을 정의해 놓은 파일입니다.
이 파일은 기본적으로 아래와 같은 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers="*">
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>


domain uri를 *를 설정해 놓았으니 프로토콜에 관계없이 open이 될 것 같습니다만 그렇지 않구요.
다음과 같이 변경해 주셔야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from http-request-headers="*">
                <domain uri="http://*"/>
                <domain uri="https://*"/>

            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>


3. ServiceReference.ClientConfig

이 파일은 실버라이트 프로젝트에 '서비스 참조(Service Reference)'가 최초로 추가되는 순간 자동으로 생성되어,
서비스 참조에 대한 설정을 담고 있습니다.

앞서 1. Web.config의 설정이 HTTPS에 맞게 잘 되어있으면 정상적인 설정 값이 생성됩니다.
HTTP프로토콜을 이용하는 서비스와 다른 부분을 굵은 글자로 표시하였습니다.

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_SelfService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="Transport" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://foo.com/Service/SelfService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SelfService"
                contract="Service.SelfService" name="BasicHttpBinding_SelfService" />
        </client>
</system.serviceModel>

서버 측의 Web.config 설정 이상으로 해당 서비스가 HTTPS 프로토콜을 지원하지 않으면,
서비스 참조시 endpoint address에는 http://로 시작하는 주소가 등록되고, 이에 대한 binding security mode가 자동으로 None으로 설정되니 이때는 서버측을 확인해 보시기 바랍니다.

그리고 간혹 서비스 참조 시 주소로 정확하게 https://foo.com/... 이렇게 입력했는데, 설정파일에는 https://foo-server/... 등으로 변경되어 등록되는 경우가 있어서 확인 및 수정이 필요합니다.
(여기서 foo-server로 가정한 것은 서버의 호스트 이름입니다.)

이런 일은 IIS에서 웹사이트를 생성할 때 사이트 바인딩에 도메인을 특정하지 않은 경우(도메인명을 비워두는 경우) 
일어날 수 있습니다.

 



HTTP의 경우는 위의 빈 호스트 이름만 채워주면 되는데,
HTTPS의 경우는 바인딩 시 호스트 명을 입력할 수 없게 되어있습니다.
결군 꼭 한번 ServiceReference.ClientConfig 파일을 확인해 주시는 것이 좋겠죠?

감사합니다.