닷넷에서 쿠키로 인증된 세션유지하기

네이버블로그에는 블로그에 대한 통계를 내주는 유틸을 사용자들이 만들어서 공개하고 있습니다. 또한, 블로그맵이라는 서비스를 하는 곳도 있습니다. 닷넷에서 이런 종류의 유틸을 작성하기 위해서 어떻게 해야할까? 물론 http 프로토콜이 단순하기 때문에 직접 윈속프로그램을 작성할 수도 있지만, 세세한 곳까지 프로그래머가 신경을 써야하기 때문에 권장할 만한 방법은 아닙니다. 닷넷 프레임웍에서는 WebClient라는 클래스를 사용하면 쉽게 원하는 페이지를 얻어올 수 있습니다. 그렇지만 리턴되는 값이 스트림 형태여서 일단은 스트링으로 만들어주어야 합니다. 그다음에 우리가 관심을 갖는 특정 내용을 찾아서 정보를 얻어야 하는데, 이것도 그냥 스트링을 뒤져서 처리하거나 정규식(RegEx)으로 해결할 수 있는 경우도 있으나, 제대로 된 방법은 html parser를 사용하는 것으로 판단됩니다. 그런데 닷넷용으로 알려진 제대로된 파서를 찾기가 힘들더군요. 그래서 생각해낸 것이 IE(Internet Explorer)에 내장된 mshtml컴포넌트를 활용하는 것입니다. 다행히 vs.net에서 래퍼를 제공해주고 있습니다. mshtml에서는 파싱한 결과를 DOM형식의 트리구조로 제공해줍니다.

그런데, 웹사이트는 사용자 인증을 받아야만 내용을 보여주는 경우가 많습니다. 이런 경우 대부분의 사이트가 Form인증 방식을 사용하며 인증을 받은후 계속 세션을 유지해야만 하는데, 이렇게 인증받은 세션을 유지하기 위해서는 쿠키정보를 계속적으로 보내주어야 합니다. 그런데 앞에서 언급한 WebClinet 클래스는 쿠기를 직접 해들링할 수 있는 기능이 제공되지 않습니다. 그래서 WebClinet 클래스가 내부적으로 불러다 쓰는 WebRequest/WebResponse 클래스를 직접사용하여 프로그램을 하여야 합니다.

여기서 언급된 내용만 확실히 다룰 수 있으면 다양한 웹페이지 관련 유틸리티를 만들 수 있을 것입니다. 엠파스에도 능력 있는 분들이 블로그관련 유틸들을 닷넷버전으로 만들어서 공개해주셨으면 좋겠습니다. 다음은 MS에서 제공하는 참고할만한 예제코드입니다.


// 로그인(사용자 인증) 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://sha-sujun-00/logon.asp");
req.Method = "Post";
string s = "Username=junsu&Password=test";   // input 태크 항목을 참조할 것.
req.CookieContainer = new CookieContainer();
req.ContentLength = s.Length;
req.ContentType = "application/x-www-form-urlencoded";
TextWriter w = (TextWriter)new System.IO.StreamWriter(req.GetRequestStream());
w.Write(s);
w.Close();
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
TextReader r = (TextReader)new StreamReader(resp.GetResponseStream());
Console.WriteLine(r.ReadToEnd());

// 로그인(사용자 인증)후에 할 일.
req = (HttpWebRequest)WebRequest.Create("http://sha-sujun-00/view.asp");
// 세션 쿠키의 유지
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(rep.Cookies);
rep = (HttpWebResponse)req.GetResponse();
r = (TextReader)new StreamReader(rep.GetResponseStream());
Console.WriteLine(r.ReadToEnd());

by 한누리 | 2004/01/26 14:30 | 윈폼(c#,csharp) | 트랙백 | 덧글(2)

트랙백 주소 : http://ttjkim.egloos.com/tb/5455842
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by xmlsea at 2004/02/03 19:50
오타가 있네요. reps.GetResponseStream() 이 부분입니다.
그냥 가려다가 혹시 reps 변수를 찾는 분이 계실지도 몰라서요.
항상 좋은 정보 감사히 보고 있습니다.
수고하세요.
Commented by 한누리 at 2004/02/04 13:01
감사합니다. 수정했습니다.

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶