[WCF - Tip & Tech] WCF에서 쿠키 사용하기

기존에 asmx 는 HTTP 를 이용한 통신만을 지원하였기 때문에 ASP.NET HTTP 파이프라인과 밀접한 연관이 있었다 . 그때문에 asmx 는 기본적으로 ASP.NET 에서 사용하는 여러 유용한 속성을 이용할수 있었던것이 사실이다. 그러나 WCF의 경우는 non-HTTP (tcp , .net.pipe) 통신을 지원해야 하기 때문에 기존 asmx 다르게 독립적인 통신 구조를 가지도록 디자인 되었다.



기존 HTTP 통신을 함으로써 얻을수 있는 여러가지 속성들을 사용하기 위해

System.Web.HttpApplication , System.Web.HttpContext

이 두가지 클래스를 이용해 호출자의 ip address 나 세션/쿠키를 이용한 상태저장등을 해왔었는데 , WCF에서는 이 두가지 클래스를 호출하면  항상 NULL값이 반환된다.



[ASP.NET Compatibility Mode ]

다행히 WCF 에서는 ASP.NET 호환모드 라는 기능을 둠으로써 , HTTP 객체를 ASMX 와 같이 사용하는 방법을 제공하고 있다. 이 기능을 사용하려면 다음과 같은 element 를 WCF의 web.config 에 추가해야한다.

<system.serviceModel>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

</system.serviceModel>

 
 


이 엘리먼트를 추가하고, asp.net 호환모드로 동작할 서비스 클래스에 추가적으로 다음과 같은 어트리뷰트를 추가한다



[AspNetCompatibilityRequirements(RequirementsMode

        = AspNetCompatibilityRequirementsMode.Required)]

public class Service1 : IService1

{

     ..

}

 
이로써 , ASP.NET 호환모드를 위한 준비가 완료되었다.해당 클래스를 사용하는 WCF 를 구동시킨후 , WCF 안에서

System.Web.HttpApplication , System.Web.HttpContext

두 개체의 값을 호출해보면 정상적으로 값이 채워진걸 확인할수 있다.

단, 이 모드는 BasicHTTPBinding 과 wsHTTPBinding 두가지 모드에서만 동작한다.



[WCF 에서 쿠키를 이용한 상태관리]

 서버측 Application 이 미들웨어 식으로 호출하는 웹서버 ㅡ WCF시나리오 에서는 별로 필요가 없지만 , 실버라이트 ㅡ WCF 시나리오 에서 많은 사람이 상태 관리로 고민을 겪는 모습을 본적이 있다.

게다가 WCF 의 구조상 , 인증쿠키를 이용한 ASP.NET 인증 시나리오를 사용할수 없기 때문에 ,웹팜,웹가든 환경에서 세션을 이용한 인증을 사용할수 없다. 이로인해 , WCF에서는 상태저장 시나리오 구현과 해당 시나리오에서의 부하 분배를 위한 로드벨런싱 작업이 다소 까다롭다.
 
(※클라이언트에서 웹 팜 환경에 있는 WCF 메서드를 호출할때 , ASP.NET 시나리오에서는 인증 쿠키값을 이용하여  해당 클라이언트가 동일한지 여부를 판별하는데 WCF는 ASP.NET 파이프라인과 독립적이므로 , 이 시나리오를 사용할수 없다.  그러므로 현재 클라이언트의 상태를 WCF에 전달해주고 응답을 받을때 웹팜 환경에 있는 각각의 머신 A 와 B가 동일한 클라이언트 C에게서 메시지를 받았는지 확인할수 없다.  실제로 WCF 는 메모리에 세션 상태를 저장하는 독립적인 세션 관리 방법을 사용하고 있고, 이는 다른 머신간에 공유가 불가능하다.
(참조 : Listing 5-8. Web.config with hostingenvironment section for recycling settings) 웹 가든 또한 여러 프로세스끼리의 세션이 공유되지 않으므로 , 종종 교착상태에 빠질 위험이 있다. )


서비스가 커질수록 로드벨런싱을 위해 동일한 서비스를 여러 서버에서 사용하게 되고, 그런 상황이 된다면 , 이 문제가 이슈화 될 가능성이 높다. ASP.NET 호환 모드를 사용함으로써 이런 문제를 해결할수 있다.

이번 단락에서, 상태 관리기법으로 가장 많이 사용되는 쿠키를 WCF에서 사용하는 예제를 소개하도록 하겠다.


[WCF 메서드]

public Boolean SetCookie(String userName)

{

HttpContext.Current.Response.Cookies["test"].Value = userName;

      return true;

}

public String GetCookie()

{

      if (HttpContext.Current.Request.Cookies["test"] == null

          || HttpContext.Current.Request.Cookies["test"].Value == null)

      {

          return "noCookie";

      }

      else

      {

          return HttpContext.Current.Request.Cookies["test"].Value;

      }

}


ASP.NET에서 편하게 볼수 있는 cookie 를 굽는 로직이다.
SetCookie : 입력받은 값[userName]을 쿠키로 굽는다.
GetCookie : 현재 저장되어 있는 쿠키값을 가져온다 쿠키값이 없다면 noCookie 문자열을 반환한다.


[WPF 클라이언트에 이벤트 선언 ]

private void btnGetCookie_Click(object sender, RoutedEventArgs e)

{

      Client.Service1Client client = new Client.Service1Client();

      MessageBox.Show(client.GetCookie());

      client.Close();

}

 

private void btnSetCookie_Click(object sender, RoutedEventArgs e)

{

    Client.Service1Client client = new Client.Service1Client();

    if (client.SetCookie(textBox1.Text))

    {

        MessageBox.Show("설정되었습니다.");

    }

    client.Close();

}


 
UI를 위와 같이 구성하고 , 쿠키를 굽고 구워진 쿠키를 가져오는 메서드를 만들었다. 각각의 메서드에 대한 설명은 첨언하지 않아도 될거 같아 생략한다. 마지막으로 클라이언트 의 설정 파일에서 allowCookie 의 값을 true 로 바꿔준다.  이 값을 설정해야 클라이언트에서 쿠키값이 정상적으로 인식된다.


 



[구동모습]


1. 쿠키를 굽기 전 모습






2. 1번 세션에 쿠키를 추가한 상태. 위쪽 윈도우(A)와 아래쪽 윈도우(B)의 세션이 공유되지 않는다.






3. 두 윈도우에 각각 상태 저장이 정상적으로 되는 부분을 확인할수 있다.


  
 
이외에도 ASP.NET에서 유용하게 사용하였던 캐싱 ,  서비스별 접근권한설정 
, asp.net 세션을 이용한 인증(Authentication) , 전역화등을 사용할수 있다. 
 
 
※ 참고 링크 : msdn - WCF Services and ASP.NET
Trackback 0 Comment 0
prev 1 2 3 4 5 ... 30 next