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

Silverlight/Lecture 2009.02.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 파일을 확인해 주시는 것이 좋겠죠?

감사합니다.


설정

트랙백

댓글

  • BlogIcon livedk 2009.02.19 15:28 신고 ADDR 수정/삭제 답글

    좋은 정보 감사합니다^^ 잘보고 갑니다.

    • BlogIcon 길버트 2009.02.19 16:39 신고 수정/삭제

      네, 즐거운 실버라이트 프로그래밍 되세요.

  • freeblue79 2010.01.25 14:56 신고 ADDR 수정/삭제 답글

    좋은 정보 감사합니다.
    그런데 한가지 질문이 있습니다.
    마지막의 사이트 바인딩 편집 부분인데
    저 같은 경우 여기에 호스트 이름을 지정 하면 안되는 환경입니다.
    하나의 웹사이트에 여러개가 움직이고 있어서 공백으로 두고있습니다.
    이곳에 도메인 명을 정의하면 어느 하나는 움직이지 않게 되어버리는데 그렇다고 도메인명을 정의하지 않으면 실버라이트 프로젝트에서 추가한 서비스가 도메인 명을 찾지 못해 DB값을 취득하지 못합니다.
    도메인 명을 정의하면 실버라이트 쪽은 정상으로 동작하고요.
    호스트이름을 정의하지않고 실버라이트 의 wcf를 동작시킬수는 없을까요

    • BlogIcon 길버트 2010.01.25 16:07 신고 수정/삭제

      "하나의 웹사이트에 여러개가 움직이고 있어서"라는 말씀이
      하나의 웹서버에 웹사이트가 여러 개 움직이고 있다는 뜻인가요?
      만약에 그렇다면 서비스를 위한 웹사이트를 하나 더 만드시고. 예를들어 service.mydomain.com 등으로
      Host를 정하시면 깔끔하게 정리가 되지 않을까요?

      또는 WCF 서비스가 구동되는 서버의 IP가 고정이라면,
      실버라이트 쪽에서는 IP와 포트번호만으로
      서비스 참조를 할 수 있습니다.

  • freeblue79 2010.01.25 17:45 신고 ADDR 수정/삭제 답글

    답변해 주셔서 정말 감사합니다.


    처음으로 실버라이트로 개발하고 있는데 테스트 서버에서 잘 되던것이 실제 서버에 올렸더니 호스트 이름을 설정 할 수 없는 문제로 동작할 수 없게 되어버리고 있습니다.
    며칠째 이 문제가 해결 되지 않아 고생하고 있으므로 좀더 자세히 적어볼까 합니다.
    예를 위해 현재 IIS에 등록되어있는 WebSite의 이름을 http://www.korea.com 이라 하겠습니다.

    1. http://www.korea.com 라는 도메인명으로 website가 등록되어있음.(호스트 명은 공란인 상태임.)

    2. 웹사이트 http://www.korea.com 에는 가상디렉토리 aaa, bbb 가 등록되어있고 각각 다른 도메인명으로 서비스를 제공하고있음.(aaa:http://www.korea.com, bbb:http://info.korea.co.kr)

    3. http://www.korea.com 에 가상디렉토리 ccc를 작성하여 silverlight로 새롭게 개발한 고객관리 시스템을 ccc에 배포 하였음.
    이 고객관리 시스템은 가상디렉토리 aaa에서 움직이고 있는 시스템의 DB로 부터 고객정보를 취득하고 있음.

    4. 위의 고객관리 시스템을 배포할 때 http://www.korea.com 웹사이트의 공란이었던 도메인 이름을 http://www.korea.com라고 설정해 주고 실버라이트의 wcf는 이 http://www.korea.com를 대상으로 하게하여 http://www.korea.com/CRM/CRMDataService.svc 와 같은 이름으로 배포하였음.
    도메인 이름을 지정하지 않으면 실버라이트 프로젝트의 웹서비스는 http://Server01/CRM/CRMDataService.svc와 같은 자동으로 서버명으로 된 도메인값으로 작성되어 실제 aaa가 움직이는 http://www.korea.com라는 도메인과는 다른 이름이되어 aaa의 DB를 취득하지 못함.
    문제는 http://www.korea.com에 도메인명을 지정해줌으로 해서 다른 도메인명으로 움직이고 있던 bbb가 동작할 수 없게 되어버린것임.

    5. IP Address를 이용해서 wcf를 작성해도 wcf는http://Server01/CRM/CRMDataService.svc로 작성되어 버려 결국 실버라이트에서 aaa의 DB값 취득에는 실패해버림.
    임의로 wcf참조후 도메인명 Server01를 www.korea.com로 변경해도 같은 현상임.


    >만약에 그렇다면 서비스를 위한 웹사이트를 하나 더 만드시고. 예를들어 service.mydomain.com 등으로
    >Host를 정하시면 깔끔하게 정리가 되지 않을까요?
    service.mydomain.com 라는 이름으로 새로운 사이트를 만들고 거기에 실버라이트 시스템을 올린다해도 기존의 http://www.korea.com 사이트에서 동작하는 aaa의DB취득에 실패하는것은 똑같겠지요.
    현재 도메인명을 지정않는 한 http://www.korea.com 가 아니라 Server01과 같은 서버명으로 wcf가 작성되므로인해...


    이상이 현재의 상태입니다.
    웹사이트에 도메인명 지정 없이 ccc에서 aaa의 참조에 성공할 수 있는 방법은 없을까요?
    아니면 뭔가 다른 좋은 방법은?
    제 지식이 짧으므로 뭔가 도움이 될만한 의견이 있으면 무엇이든 괜찮으니 말씀해 주시면 감사하겠습니다.

    • BlogIcon 길버트 2010.01.26 08:56 신고 수정/삭제

      저희 회사 같은 경우에는 그렇게 합니다만,
      도메인이 다른 각각의 서비스를 각기 다른 웹사이트로 분리해서 운영하시면 될 것 같은데요.

      IIS에 웹사이트를 여러 개 만드시는 거지요.
      웹사이트 - http://www.korea.com
      웹사이트 - http://info.korea.co.kr
      웹사이트 - http://service.korea.com
      웹사이트 - http://crm.korea.com

      웹사이트 '재시작' 등의 필요가 있을 때에도 분리되어
      있는 게 좋지 않나요?

      이것은 실버라이트 외적인 문제라 제가 잘 모르는데요.
      꼭 한 사이트에 가상디렉토리로 나눠서 써야하는 이유가 있으신지요?

      만약 꼭 그렇게 하셔야 한다면 저는 그렇게 해보질 않아서,
      테스트 해보고 답변 드리는데 시간이 좀 걸릴 수 있겠습니다.

  • freeblue79 2010.01.26 10:05 신고 ADDR 수정/삭제 답글

    답변 너무 감사드립니다.

    다른 회사에서 관리하던 시스템을 서버 업체까지 그대로 저희가 가져오게 된것이라 이제와서 기존 시스템의 설정을 바꾸는 것은 여러가지 위험 부담이 있습니다.
    bbb가 몇시간 움직이지 않게 되었을때에도 사방에서 전화가 쏟아져서 기존의 시스템은 될 수있는 한 그대로 유지한체 기능 추가만을 하는 쪽으로 지시가 내려와 있고요.

    머 삽질좀 더 하면 어떻게든 되겠지요...
    해결 방법을 찾게되면 이곳에 꼭 코멘트를 남겨 놓겠습니다.

    길버라이트 자주 놀러오겠습니다.

    꾸벅...

    • freeblue79 2010.02.12 20:06 신고 수정/삭제

      죄송합니다. 처리는 오래전에 끝냈는데 답변이 늦고말았네요.
      결국 별도의 사이트를 작성해서 처리하는것으로 윗분들을 설득하는데 성공해서 무사히 릴리즈 했습니다.
      같은사이트내에서 가상디렉토리마다 아이피가 다른 환경이었기때문에 다른 사이트를 등록하는 것 말고는 정말 방법이 없더군요.

      감사합니다.

    • BlogIcon 길버트 2010.02.13 23:36 신고 수정/삭제

      오 업무가 무사히 처리되셨다니 축하드립니다.
      새해 복 많이 받으세요!

  • BlogIcon loveciel 2010.05.27 15:21 신고 ADDR 수정/삭제 답글

    행님아~

    freeblue79 님과 하시는 말씀이

    https://connect.microsoft.com/wcf/feedback/details/322896/cant-host-wcf-service-in-a-website-with-multiple-identities?wa=wsignin1.0

    이거에 대한 얘기 같은데 ㅋ 이 기능은 4.0에서 풀린다고 함