Search

'tranport security'에 해당되는 글 1건

  1. 2010.08.17 WCF Security (1) - SSL을 이용한 전송계층에서의 보안 설정

WCF Security (1) - SSL을 이용한 전송계층에서의 보안 설정

WCF 2010. 8. 17. 09:00 Posted by 알 수 없는 사용자

모두들 안녕하시죠~? 예년과 다르게 자주 발생하는 열대야 떄문에 다들 고생하시고 있을거라 생각됩니다. 벌써 8월도 중반이 넘어가고 있으니깐요~ 곧 이 더위도 물러날거라 생각됩니다 ㅎㅎ
다들 조금만 더 참아보면 기분 좋은 가을이 찾아오겠죠~ ㅎ

이번 아티클부터는 WCF 의 Security 부분과 관련한 주제로 이야기를 이어가볼까 합니다.

그래서~ 제목에서 확인하셨겠지만, SSL 프로토콜을 이용한 보안 설정을 먼저 다루어 보려 합니다.
SSL(Secure Sockets Layer)은 네트워크를 통해 전달되는 정보의 안전한 전송을 위해 넷스케이프사에서 정한 인터넷 통신규약 프로토콜을 말합니다.
최근에는 SSL을 여러 부분에서 많이 사용하고 있기 떄문에 다들 한번 이상은 들어보았을거라 생각됩니다.

SSL에 대한 자세한 설명은 다음 링크를 참조하시면 될 것 같습니다.
SSL은 무엇이며, 왜 이것을 사용해야 하는가?

그럼, 이제 이 SSL을 적용한 서비스를 개발하는 방법에 대해 설명해보도록 하겠습니다.

먼저, Visual Studio 2010에서 WCF 응용 프로그램 템플릿을 이용해 새로운 솔루션을 만듭니다.
이번 내용도 WCF 서비스가 어떤 기능을 수행하는지에 대한건 그리 중요하지 않으니깐 기본적으로 만들어 지는 코드를 그대로 사용해 보겠습니다. ㅎ

SSL 을 사용하기 위해선 인증서가 필요하기 때문에 서비스에 SSL을 적용하기 전에 우선 인증서를 만들어야 합니다.
SSL 인증서는 공식 인증 기관에서 생성을 해줘야 신뢰할 수 있는 인증서를 만들 수 있지만, 우리는 테스트가 목적이니깐 그렇게까진 필요없고, 윈도우에서 자체 서명된 인증서를 만들어 주면 될 것 같습니다.

다음 그림과 같이 IIS 관리자를 실행 시키고, "서버 인증서" 아이콘을 더블 클릭 합니다.


다음, 오른쪽 "작업" 메뉴에서 "자체 서명된 인증서 만들기..." 메뉴를 클릭합니다. 그러면 다음과 같은 창이 뜨는데 여기서 인증서 이름을 적고 확인 버튼을 클릭하면 새로운 인증서를 만들 수 있습니다.



다음으로 우리가 만든(비록 Visual Studio에서 다 만들어 준 것이지만,,^^;;) WCF 서비스를 IIS에 올리는 작업을 수행합니다. 이 작업은 생략해도 다들 아실거라 생각합니다,, 혹시 모르시는 분이 계시면 댓글로 남겨주세요~ ^^

다음은, IIS 관리자를 통해 WCF 서비스를 호스팅하는 사이트에 바인딩을 추가할 필요가 있습니다. SSL을 사용하는 사이트는 https 로 시작하는 url을 사용하는데, 이에 대한 바인딩을 추가해주어야 하는 것이죠~

IIS 관리자에서 WCF 서비스를 호스팅하는 사이트를 선택하고 작업 메뉴에 있는 "바인딩..." 메뉴를 클릭합니다.


그리고, 새로운 사이트 바인딩을 추가하기 위해 추가 버튼을 클릭하고 다음 그림과 같이 https를 사용하도록 하고 포트 번호를 설정해 줍니다. 또한, SSL 인증서에서 위에서 생성한 인증서를 선택해주고 확인 버튼을 클릭합니다.


자~ 이렇게 하면 WCF 서비스를 호스팅하는 사이트는 SSL을 이용할 수 있게 됩니다.

다음으로는 WCF 서비스에서 SSL을 이용하기 위한 몇 가지 설정을 해주어야 합니다.
앞에서도 얘기했지만 SSL을 사용하는 사이트는 https로 시작하는 url을 사용하기 때문에 이에 대한 설정을 해주어야 합니다. 그리고 전송계층에서의 보안을 설정해주기 위한 작업도 필요합니다.

그래서 web.config 를 다음과 같이 수정하겠습니다.

<system.serviceModel>

    <services>

      <service name="SSLService.Service1">

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:4949/Service1.svc"/>

            <add baseAddress="https://localhost:4948/Service1.svc"/>     // SSL을 사용하는 URL 등록

          </baseAddresses>

        </host>

        <endpoint address="" binding="basicHttpBinding" contract="SSLService.IService1"
                       bindingConfiguration=
"MyBinding" />

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

      </service>

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior>

          <serviceMetadata httpGetEnabled="true" />

<serviceDebug includeExceptionDetailInFaults="false" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <basicHttpBinding>

        <binding name="MyBinding">

<security mode="Transport">     // 전송 계층의 보안을 적용하기 위한 태그

            <transport clientCredentialType="None" />

          </security>

        </binding>

      </basicHttpBinding>

    </bindings>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

  </system.serviceModel>


위의 설정을 보면 아시겠지만 SSL을 사용하기 위한 URL을 base address로 등록을 하고 basicHttpBinding을 사용하는 엔드 포인트를 등록합니다. 그리고 이 엔드 포인트에 사용하는 basdicHttpBinding에 전송계층에서의 보안 설정을 위해 security 태그와 transport 태그가 적용되어 있습니다.

transport 태그의 clientCredentialType 속성은 클라이언트의 인증을 위해 어떤 방식을 사용할 것인지에 대한 것을 설정할 수 있는데 이에 대한 내용은 다음 포스팅에서 설명을 하겠습니다. 이번 서비스는 따로 인증을 하지 않기 때문에 None으로 적용하였습니다.

이제 모든 설정은 끝이 났습니다.
간단한 콘솔 어플리케이션을 새로 만들어서 이 서비스를 참조해보도록 하겠습니다.
콘솔 어플리케이션을 만들고 언제나 그랬듯, "서비스 참조 추가"를 수행하고 서비스 참조 추가 창에서 주소에 IIS에서 설정해 주었던 url을 입력합니다. 저의 경우에는 "https://localhost:4948/Service1.svc"입니다.
그리고, 확인 버튼을 클릭하면 서비스를 찾다가 다음과 같은 화면이 뜹니다.


대충 내용을 보면, 인증서에 포함된 호스트와 주소가 일치하지 않기 때문에 신뢰할 수 없다는 내용인 듯 합니다. 그냥 여기서 "예" 버튼을 클릭해주면, 다음 그림 처럼 아무런 이상없이 서비스를 찾을 수 있고, 참조를 할 수 있습니다.


이렇게 참조를 해주면 아무 문제없이 서비스를 사용할 수 있겠죠~ ㅎ

콘솔 어플리케이션으로 서비스를 이용하는 부분은 생략하도록 하겠습니다~ 별 내용이 없으니깐요,, ㅎ

보안 부분은 개인적으로 제일 어려운 부분이면서 가장 부족한 부분이라 생각하기 때문에 오늘의 내용에 잘못된 부분도 있을거라 생각됩니다. 혹시 잘못된 내용이 있으면 댓글로 알려주세요~ ^^;;

다음 포스팅에서는 SSL을 사용하면서 사용자 인증을 하는 방법에 대해서 포스팅을 해볼까 합니다.

그럼 다음 포스팅때 뵙겠습니다~ ^^