http://umc.pe.kr/article_79.aspx
아티클을 통해 FTP 로 파일을 업로드/다운로드 방법을 설명한 바 있다. FTP 의 인증 과정을 거쳐 특정 폴더의 파일에 접근 할 수 있다.
 
CredentialCache
그렇다면 우리는 CredentialCache 라는 클래스를 눈여겨 볼 수 있다. 이 클래스를 한마디로 표현하자면 “여러 자격 증명을 저장하기 위한 저공소”이다. CredentialCache 클래스의 GetCredential 메서드를 이용하여 URI 와 인증형식등을 지정하면, 가장 유사한 자격증명을 제공받을 수 있다.
 
CredentialCache cCache = new CredentialCache();
cCache.Add(new Uri("ftp://umc.pe.kr/www/a.txt"), "Basic", new NetworkCredential("ID","PASSWORD") );
CredentialCache 클래스를 사용하여 자격 인증을 캐시에 저장한다.
 
위의 코드는 특정 URI 의 Basic(기본) 인증 방식으로 자격 인증이 생성되었다.
Basic을 “Digest” 라고 바꾸어주면 다이제스트 인증을 할 수 있다.
 
기본 및 다이제스트 인증 방식은 전송되는 데이터가 암호화가 되지 않으며, 기본 인증방식은 사용자의 아이디 및 패스워드는 보안되지 않은 상태로 전송된다.
 
그렇다면 웹(ASP.NET) 에서도 CredentialCache 클래스를 이용하여 자격 인증의 상태를 보존할 수 있을까?
언듯, 클래스의 이름이 말해주듯 Cache 라는 말에 혹해버린다면 곧바로 난관에 부딪혀 버릴것이다. 물론 static 한정자로 정적 맴버를 만든다면 맴버가 초기화 되거나, 가비지컬렉터에 의해 수집이 되지 않는한 상태를 보존할 수 있겠으나, 여기에서도 문제가 따른다.
즉, 웹 어플케이션 차원에서 공용되는 맴버이므로, 사용자별 자격 인증을 저장하기엔 매우 부적합 하다.
 
Sample
 
 
그럼 어떻게 구현했는지 샘플을 보도록 하자.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>제목 없음</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
                  FTP 주소 : <asp:TextBox ID="txtFtp" runat="server" MaxLength="100" Width="521px"></asp:TextBox>
                  <br />
                  <br />
                  User ID :
                  <asp:TextBox ID="txtID" runat="server"></asp:TextBox><br />
                  Password :
                  <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
                  <br />
                  <br />
                  <asp:Button ID="btnConnection" runat="server" Text="Connection" OnClick="btnConnection_Click" />
                  &nbsp;&nbsp;
                  <asp:Button ID="btnCacheClear" runat="server" Text="Cache Clear" OnClick="btnCacheClear_Click" />
                  <p></p>
                  <asp:Label ID="lblCache" runat="server"></asp:Label>
                  <p></p>
                  <asp:Label ID="lblData" runat="server"></asp:Label>
         </div>
    </form>
</body>
</html>
 
Default.aspx
 
Html 부분은 특별히 설명할 것이 없으므로, CS 코드를 보자
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;
using System.IO;
using System.Drawing;
 
public partial class _Default : System.Web.UI.Page
{
         ///<summary>
         /// Cache 및 Session 에 저장될 자격인증 키값
         ///</summary>
         private static readonly string PARAM_CREDENTIALS_CACHE        = "C";
         private Uri thisUri        = null;
 
    protected void Page_Load(object sender, EventArgs e)
    {   
                  if( IsPostBack ) return;
 
                  txtFtp.Text                = "FTP://umc.pe.kr:5830/www/r.txt";
    }
         protected void btnConnection_Click(object sender, EventArgs e)
         {
                  WebClient client           = new WebClient();
                  thisUri                                     = new Uri( txtFtp.Text );
 
                  try
                  {
                           lblCache.Text = lblData.Text       = string.Empty;
                           lblCache.ForeColor                                   = Color.Red;
 
                           // Cache 및 Session 에 저장된 자격인증이 있는지 검사한다.
                           if (Cache[PARAM_CREDENTIALS_CACHE] == null)
                           {
                                   NetworkCredential ct                        = new NetworkCredential(txtID.Text, txtPassword.Text);
                                   client.Credentials                                   = ct;
                                   Cache[PARAM_CREDENTIALS_CACHE]     = ct;
 
                                   lblCache.Text                                        = "Create Credential";
                           }
                           else
                           {
                                   client.Credentials                                   = (NetworkCredential)Cache[PARAM_CREDENTIALS_CACHE];
                                   lblCache.Text                                        = "Cache Credential";
                                   lblCache.ForeColor                                   = Color.Blue;
                           }
 
                           byte[] bData = client.DownloadData(txtFtp.Text);
                           string sData = System.Text.Encoding.Default.GetString(bData);
 
                           lblData.Text = sData;
                  }
                  catch (WebException)
                  {
                           btnCacheClear_Click(this, EventArgs.Empty);
                           lblCache.Text              = "경로가 틀리거나, 인증되지 않았습니다";
                  }
         }
         protected void btnCacheClear_Click(object sender, EventArgs e)
         {
                  // Cache 또는 Session 에 저장된 자격인증을 제거한다.
                  Cache.Remove( PARAM_CREDENTIALS_CACHE );
 
                  lblCache.Text                      = "Clear Cache";
                  lblCache.ForeColor                 = Color.Black;
         }
}
 
Default.aspx.cs
 
우선 위 예제는 Cache 를 이용하여 자격 인증을 저장해 보았다.
하지만 Cache 또한 Session 과 달리 사용자별로 값을 저장하지 않기 때문에, 두개의 브라우져를 띄웠을 경우, 분명 다른 세션이기 때문에, 첫번째 브라우져에서 FTP 를 인증하게 되면, 두번째 브라우져는 인증도 하지 않음에도 인증되어 버린다.
 
만약, 사용자별로 자격 인증 상태를 저장하기 위해서는 Session 을 사용하면 된다.
소스의 Cache 를 Session 으로 바꾸어 주기만 하면 된다.
 
NetworkCredential 클래스를 ViewState 에 저장할 수 없다. 왜냐하면 ViewState는 Serializable 된 개체를 담을 수 있기 때문이다.
 
아마도 잘 응용 한다면, Active-X 를 사용하지 않는 FTP 관리 웹 어플케이션도 도전해 볼만 하다고 생각해본다.
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 땡초 POWERUMC

댓글을 달아 주세요