[WCF - Tip & Tech] WCF에서 쿠키 사용하기
기존 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



