SimpleIsBest.NET

유경상의 닷넷 블로그
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.

제목을 보고 링크를 클릭하여 여기까지 온 거라면 독자는 지대로 낚인 것이 되겠다. 게으름으로 인해 최근 포스트가 전무한 탓에 점점 방문자 수와 페이지 뷰가 줄어들자 위기감을 느낀 필자. 페이지 뷰 좀 올려 보려고 그래도 필자의 블로그에서 가장 인기 있는 스마트 클라이언트란 제목으로 낚시질을 좀 해본 것이다. 흐흐흐... 하지만... 아직 실망하긴 이르다. 끝까지 읽어는 보고 낚시에 당했는지 아닌지 판단해 보기 바라는 바이다. (간만에 글이다 보니 글이 약간 까칠하더라도 이해해 주기 바란다. 뭐... 싫음... 딴 데 가서 게시판 놀이나 하든가... 아싸 막가파...)

UI-less Smart Client Object

스마트 클라이언트 란 것이 사실 원리를 알면 별 것이 아니다. 기술적인 이슈와 노하우 없이 존나게 고생할 수는 있어도 그 원리는 조낸 심플하다는 것이다. 왜냐면 기존에도 사용했던 기술을 닷넷화(化) 해 놓은 것이기 때문이다. 스마트 클라이언트의 원리에 대해 또 설명하자면 입만, 아니 팔만 아픈 관계로 살짝 링크만 떤져 본다. (날로만 먹으려고 하지 말고 어떻게 링크도 클릭도 해보고... 글도 좀 읽어 보는 노력도 쪼금만 해보고 그러지 그러셔?)

Smart Client with UI

회나 낙지(아우 낙지 먹구 싶다...) 같이 날로 먹는 거 좋아하는 독자들을 위해 간단히 정리하자면 스마트 클라이언트 중에서 브라우저 임베디드 스마트 클라이언트란 것은 IE 브라우저에겐 ActiveX와 전혀 다를 것이 없는 COM 객체일 뿐이라는 것이 오늘의 핵심 뽀인뜨가 되겠다. 그게 닷넷으로 작성되었는지 UserControl 에서 파생되었는지 IE 브라우저는 전혀 관심이 없을 뿐 더러 그것이 MIME 필터에 의해 활성화 되었는지 표준 COM 방식으로 활성화 되었는지 역시 큰 관심사가 아니다. 다만 OBJECT 태그에 의해 나타나는 COM 객체가 IE가 필요로 하는 몇몇 COM 인터페이스를 구현하고 있는지가 중요한 것이다.

브라우저 임베디드 스마트 클라이언트(이하 스마트 클라이언트는 모두 브라우저 임베디드 스마트 클라이언트를 지칭함)를 구현할 때 UserControl 클래스에서 파생된 사용자 정의 컨트롤을 만들곤 했었음을 기억해 보자. 왜 UserControl 클래스에서 파생된 사용자 정의 컨트롤이어야 했을까?

허탈하지만 이유는 없다. UI(user interface)를 갖는 스마트 클라이언트를 만들고자 한다면, ActiveX 로서 요구되는 COM 인터페이스들을 구현하는 닷넷 클래스를 사용한다면 어떤 클래스를 사용해도 상관이 없다는 말이 되겠다. 이 시점에서 궁금해 지는 것은 ActiveX의 요건을 갖추고 있는 닷넷의 클래스는 무엇인가가 궁금할 지도 모르겠다. 그 클래스는 다름 아닌 System.Windows.Forms 네임스페이스의 Control 클래스가 되겠다. 이 클래스는 UI 를 갖는 ActiveX 컨트롤이 구현해야 할 모든(?) COM 인터페이스를 모두 제공하고 있다. UserControl 클래스는 다른 컨트롤들(라벨, 텍스트박스, 트리뷰, 리스트뷰 등)과 마찬가지로 직/간접적으로 Control 클래스에서 파생되었고 또한 사용자의 디자인이 가능한 컨트롤이기 때문에 스마트 클라이언트를 작성할 때 UserControl 클래스에서 파생된 사용자 정의 컨트롤을 사용했던 것일 뿐이다.

Smart Client Without UI

이 글의 제목을 생각한다면 이쯤에서 UI 가 없는 ActiveX, UI 가 없는 스마트 클라이언트에 대해 언급해줘야 한다. 안 그러면 독자들이 낚였다고 생각할 테니 말이다...

1990년대 말 초기의 ActiveX의 정의는 브라우저에 포함될 수 있는 UI를 갖는 컨트롤을 지칭했었다. 그래서 일반적으로 ActiveX 컨트롤이라고 함은 OLE 컨트롤 혹은 OCX 컨트롤의 서브셋(subset)으로써 UI를 갖는 COM 컴포넌트를 지칭하는 것 이였다. UI를 갖는 COM 컴포넌트가 구현해야 할 COM 인터페이스는 상당히 많기 때문에 VB6.0, Delphi, MFC, ATL 등의 도움을 받지 않고선 맨땅에 헤딩하기란 상당히 어려운 개발 항목 중 하나로 꼽힌다.

 하지만 점차로 브라우저에 삽입될 수 있는 COM 컴포넌트들의 범위가 넓어짐에 따라 OBJECT 태그를 통해 브라우저에 삽입될 수 있는 ActiveX 컨트롤의 허용 범위가 넓어진다. 즉, UI 가 없는 ActiveX 컨트롤의 경우에는 달랑 IUnknown, IDispatch 두 인터페이스만을 구현해도 되기 때문이다. 이 두 인터페이스는 COM에서 사용하는 가장 근본적인 인터페이스이다. 더 이상 알려고 하면 인생이 피곤해 질 터이니 이 정도만 해 두자. 어찌 되었건 결론적으로 브라우저에 OBJECT 태그로 삽입할 수 있는 ActiveX 객체는 단순한 COM 객체도 가능하다는 얘기가 되겠다.

그렇다면... 스마트 클라이언트도 UserControl 에서 파생되지 않는 일반 닷넷 클래스를 사용할 수는 없을까? 그냥 UI 가 없는 일반 클래스를 스마트 클라이언트 OBJECT 태그에 표시하면 어떨까?

오늘 간만에 포스트를 올리는 이유가 드디어 나왔다. 스마트 클라이언트가 반드시 UI를 가지란 법은 없는 것이다. UI가 없는 스마트 클라이언트도 가능한 것이며, 그 스마트 클라이언트는 UserControl에서 파생할 필요 없이 단순한 COM 객체로서 만들어도 되는 것이다.

그렇담 UI가 없는 스마트 클라이언트에서 어떤 의미를 찾을 수 있을까? 의미란 찾으려고 할 때만 찾아지는 것이 아니다. 의미를 부여할 수도 있지 않은가? 지나가는 소(牛)를 돼지(豚)가 쳐다볼 때 아무런 의미를 찾을 수 없을 수도 있지만, 그 돼지가 소에게 의미를 부여하면 사랑스런 소가 될 수도 있는 것이다.

가까운 예로 인터넷 뱅킹에서 사용하는 암호화 ActiveX 컨트롤은 UI를 가지고 있지 않다. 또한 UI는 HTML에게 맡겨두고 파일을 선택하고 업로드만 수행해 주는 스마트 클라이언트를 생각해 볼 수도 있다. 이름을 불러줄 때나 의미를 갖게 된다는... UI가 없는 스마트 클라이언트의 의미는 독자들이 부여해 보기 바란다. (아... 글이 어울리지 않게 철학적으로 나가네... 나이 쳐먹고 있다는 증거인가? -_-; )

Implementation of UI-less Smart Client

그럼 UI를 갖지 않는 ActiveX와 동등한 스마트 클라이언트는 우찌 만들면 될까? 2000년 처음 등장한 닷넷 프레임워크의 내부 이름이 COM+ 2.0 이였다는 사실을 아는 독자들과 일정 내공을 가지고 Unmanaged 세상과 섞여 사는 독자라면 이미 잘 알고 있을 터...

닷넷의 대부분의 클래스는 COM 객체로서 Unmanaged 세상과 상호 운용될 수 있다. 필요한 조건은 COM 을 통해 Unmanaged 동네에서 액세스를 허용하도록 '표시'하는 ComVisibleAttribute 특성과 public 액세스 한정자만 있다면 그 클래스의 인스턴스는 COM 객체로서 취급 받을 수 있다. 이러한 기능은 CLR(Common Language Runtime)이 제공하는 Interop 기능에 의해 제공되며, 보다 구체적으로는 이런 저런 문서에서 많이 들어봤을 법한 CCW(COM Callable Wrapper)를 통해 가능한 것이 되겠다. CCW 에 대해서는 필자보다 친절하고 공손하게 정보를 제공하는 MSDN이나 다른 사이트, 블로그, 동영상 등등의 자료를 찾아 보기 바란다.

그럼 코드를 살짝 살펴보자. 예제는 Javascript로는 구현이 어려운(?) 암호화를 수행하는 컨트롤이다.

[System.Runtime.InteropServices.ComVisible(true)]

public class CryptoHelper

{

    public string EncryptString(string source)

    {

        // Symmetric 암호화 알고리즘 초기화

        RijndaelManaged crypto = new RijndaelManaged();

        ICryptoTransform transform = crypto.CreateEncryptor(GetKey(), GetIV());

        MemoryStream memoryStream = new MemoryStream();

        CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);

 

        // 문자열을 바이트 배열로 바꾼다. 인코딩은 Unicode를 사용했다.

        byte[] data = Encoding.Unicode.GetBytes(source);

        // 암호화를 수행한다.

        cryptoStream.Write(data, 0, data.Length);

        cryptoStream.Close();

 

        // 암호화된 데이터를 Base64 인코딩 하여 반환한다.

        byte[] encryptedData = memoryStream.ToArray();

        string cipherText = Convert.ToBase64String(encryptedData);

        return cipherText;

    }

 

    public string DecryptString(string cipherText)

    {

        // Rijndel 알고리즘을 사용하여 복호화 하는 로직... (대세와 무관하므로 생략... ^^)

    }

    // 이하 GetKey(), GetIV() 메쏘드 생략... 

}

리스트1. UI가 없는 스마트 클라이언트 예제

UI가 없는 스마트 클라이언트 예제 코드인 리스트1 에서 가장 핵심적인 것은 ComVisibleAttribute 특성을 true로 설정한 것과 CrypoHelper 클래스가 public 한정자를 갖는다는 점이다. ComVisible 특성이 true 이어야만 COM Interop을 통해 웹 브라우저가 이 클래스를 볼 수 있기 때문이다. 그리고, public 클래스이어야만 어셈블리 외부에서 접근이 가능하다는 점도 잊지 말자.

그렇다면 브라우저에서 이 클래스를 어떻게 사용할 수 있을까? 뭐... 닭이 아니라면 public 메쏘드나 public 속성을 스크립트에서 액세스할 수 있다는 것은 찍어도 맞출 수 있을 것이다. 리스트1에서는 문자열을 암호화 하고 복호화 하는 EncryptString 메쏘드와 DecryptString 메쏘드를 public 메쏘드로 제공하고 있으므로 스크립트는 public 으로 선언된 EncryptString 메쏘드와 DecryptString 메쏘드를 호출할 수 있다는 것이다.

자, 이제 CryptoHelper 클래스를 사용하는 HTML 코드를 훔쳐봐 보자. 먼저 OBJECT 태그는 다음과 같다.

<object id="CryptoHelper" classid="UIlessControl.DLL#UIlessControl.CryptoHelper" style="display:none" />

이건 뭐 특별할 것도 없고 너무나 간단하다. 일반적인 다른 스마트 클라이언트와 다를 것이 전혀 없는 것이며 다운로드, configuration, CAS 등이 모두 UserControl 클래스에서 파생된 UI를 갖는 스마트 클라이언트와 완전히 동일하다.

이제 선언된 스마트 클라이언트를 사용하는 스크립트를 살펴보자.

// 암호화 수행

function DoEncrypt()

{

    var ctrl = document.all["CryptoHelper"];

    var textElement = document.all["SourceText"];

    var text = textElement.value;

    var resultSpan = document.all["EncryptResult"];

    var result;

 

    if (text == null || text.length == 0) {

        alert("암호화할 문자열을 입력하세요.");

        textElement.focus();

        return;

    }

    result = ctrl.EncryptString(text);

    resultSpan.innerHTML = result;

}

리스트2. 스마트 클라이언트를 '사용'하는 자바 스크립트

리스트2는 입력 상자에 사용자가 입력한 문자열을 CryptoHelper 스마트 클라이언트(리스트1)가 제공하는 EncryptString 메쏘드를 사용하여 암호화하고 그 결과를 미리 정의된 SPAN 영역에 보여주는 코드이다. 뭐 복잡할 것도 없고 설명할 것도 없이 간단 그 자체라고 할 수 있다. 리스트1과 리스트2를 사용하여 작성한 예제는 다음 화면과 같다.

Screen1.png

리스트1의 CryptoHelper 클래스는 public 메쏘드만을 제공하고 있지만 public 속성을 제공하여 속성을 액세스할 수 도 있다. 하지만 UserControl에서 파생된 클래스처럼 PARAM 태그를 사용하여 속성의 초기값을 줄 수는 없다. PARAM 태그는 IPersistPropertyBag COM 인터페이스를 구현하는 COM 객체에 대해서만 작동하기 때문에, 이를 구현하지 않는 CryptoHelper 클래스는 적용이 되지 않는 것이다. 반면 UserControl 클래스의 조상 클래스인 Control 클래스는 이 인터페이스를 구현하고 있기 때문에 PARAM 태그를 적용할 수 있다.

또 한가지 언급해야 할 것은 UserControl 에서 파생되지 않은 클래스를 스마트 클라이언트로 사용할 때에 이벤트를 사용할 수 없다는 점이다. 즉, UserControl 클래스에서 파생된 스마트 클라이언트는 이벤트를 정의하고 스크립트가 이벤트 핸들러를 작성할 수 있지만 CryptoHelper 클래스처럼 UserControl 에서 파생되지 않은 클래스는 스크립트가 이벤트를 받을 수 없다. 그 이유는 필자도 명확하지 않다. 기본적으로 닷넷의 객체가 CCW를 통해 COM 클라이언트로부터 액세스 될 때 COM 이벤트를 사용할 수 있음에도 불구하고 UserControl에서 파생되지 않은 클래스를 스마트 클라이언트로 사용할 때는 이벤트가 작동하지 않았다. Windows Script Host 나 VB 6.0 과 같은 COM 컨테이너는 이벤트를 받을 수 있었지만 브라우저는 그렇지 않았다는 얘기이다. 이는 아마도 브라우저가 UI를 갖는 경우에만 이벤트 핸들러를 초기화하는 것으로 보인다.

So What ?

꼭 리스트1의 CryptoHelper 클래스처럼 해야 할 필요가 있을까? CryptoHelper 클래스를 UserControl 클래스에서 파생시키고 스타일 시트를 이용하여 보이지 않게 해도 되지 않은가?

그렇다. 그렇게 해도 된다. 결과는 같다. 하지만 과정은 조금 다르다. UserControl 클래스에서 파생되기 위해서는 한 등빨 하는 System.Windows.Forms 어셈블리를 로드해야 할 뿐 만 아니라 UI를 갖는 ActiveX 초기화에 필요한 닷넷 코드가 수행되어야 한다. 반면 UserControl 클래스에서 파생되지 않은 CyrptoHelper 클래스는 추가적으로 로드 할 어셈블리가 상대적으로 적기 때문에 보다 빠르게 초기화를 수행할 것이다. 사실 CryptoHelper 클래스는 mscorlib 어셈블리와 System 어셈블리만이 사용된다. 목적을 이루는 방법은 다양하다. 파리를 잡는데 파리채를 쓸 것인가 아니면 105mm 박격포로 조져버릴 것인가는 여러분의 선택이다.

또 한가지 언급하고 싶은 것이라면 UI 가 없는 스마트 클라이언트도 CAS(Code Access Security)의 제약을 받는다는 점이다. 사실 모든 닷넷 코드는 CAS의 제약을 받는다. 때문에 기본 인터넷 영역의 CAS 설정이 갖는 한계를 잘 고려해야 할 것이다. 기본 CAS 설정으로도 위와 같이 자바 스크립트와 이를 기반으로 하는 AJAX 로는 수행할 수 없는 암호화 작업이나 제약적이지만 로컬 파일 액세스(OpenFileDialog나 IsolatedStorage를 이용하여)도 가능하다. 또한 스크립트가 수행할 수 있는 일 이라 할지라도 닷넷 코드가 훨씬 더 빠르게 작업을 수행할 수 있다는 점도 잊지 말자. 예를 들어, 다량의 문자열을 파싱 하거나 가공해야 한다면 닷넷 코드가 더 빠른 결과를 낼 것임은 너무나 자명하다.

만약 클라이언트의 CAS 설정을 FullTrust로 설정하는 것이 가능하다면 로컬 파일 액세스, 레지스트리 수정, 파일 업로드 등의 다양한 작업을 수행할 수 있게 된다(Windows Vista의 보호모드라면 좀 곤란하겠다). CAS 설정을 배포해야 한다는 복잡한 과정이 떡하고 버티고 있지만 이미 스마트 클라이언트를 위해 클라이언트 PC 환경이 갖추어진 기업 같은 곳에서는 일반 ASP.NET, JSP, ASP 웹 어플리케이션에서도 UI 없는 스마트 클라이언트를 이용하여 다양한 작업을 수행할 수 있을 것이다. ActiveX 보다야 작성하기 쉽고 배포하기 편리한 것이 스마트 클라이언트 아니더냐?

Epilog

UI를 갖지 않는 스마트 클라이언트... 이 녀석은 보는 사람의 시각에 따라 아무것도 아닌 것일 수도 있지만 어떤 사람에게는 훌륭한 기능을 제공하는 녀석이 될 수도 있다. 의미를 찾으려는 것도 중요하지만 사람에 따라서 그 '의미'라는 것이 다르게 다가올 수 있다는 점을 생각해 보자.

자... 이제 독자들이 대답해 볼 차례이다. 필자의 "낚시"에 걸려든 느낌인가?



Comments (read-only)
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 정성태 / 6/16/2007 10:52:00 PM
낚시라니요? ^^ 발상의 전환이 어디인데요. ^^
#맛잇는 떡밥 감사합니다 / TohnoLYn / 6/17/2007 2:39:00 PM
맛있게 머고 갑니다 ^^
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 신동열 / 6/21/2007 8:52:00 AM
하하 유용한 팁이네요. 떡밥만 먹고 갑니다.
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 6/22/2007 10:36:00 AM
우워... 재우씨 글을 실수로 지워버렸다... -_-;
재우씨 쏘리... T_T
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 안재우 / 6/26/2007 2:06:00 PM
이거 고의인거지? 그런거지? --++
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 6/26/2007 5:08:00 PM
엇... 티 많이 나? 티 안낼려구 했는데... -_-;
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / puzzle / 6/29/2007 1:08:00 PM
이벤트 연결이 안되는 이유는 IProvideClassInfo2 인터페이스를 구현해주지 않았기 때문이라는...

http://support.microsoft.com/?id=200839
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 6/29/2007 2:45:00 PM
음... ATL은 지적한 KB 문서대로 인데... 닷넷 객체는 IProvideClassInfo 를 CCW가 구현하고
있기 때문에 그것 때문은 아닌 것 같은데...
닷넷 객체를 만든담에 그걸 regasm 으로 등록한 후에 OleView로 살펴보면
그 객체가 이미 IProvideClassInfo를 구현하고 있는뎅...
그리고... WSH 로 테스트하면 이벤트 잘 발생하고 Catch도 잘된다는...
근데 OBJECT 태그로 하면 이벤트가 안먹더라는... 우어...
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 컴맹 / 6/29/2007 4:17:00 PM
오~ UI없는 스마트 클라이언트도 정말 유용하겠군요.^^
좋은 정보 감사합니다.^^
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / puzzle / 6/29/2007 4:29:00 PM
글타면 CCW가 IProvideClassInfo 를 제대로 제공못하고 있거나 ITypeInfo** 를 구성할때 필요한 정보를 충분히 제공못해주는건 아닐까?
일테면 ComSourceInterfacesAttribute 지정하는걸 까먹었다거나...

일케 빡시게 선언해주면 좀 정신을 차릴지도 모르겠다는...

[Guid("4248C2EF-CDD0-48fc-B75F-0B2BBE70C171")]
public interface ICryptoHelper
{
}

[Guid("6748A059-C253-45bd-B5AE-1AE9C390F754"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ICryptoHelperEvents
{
}

[Guid("4B4AD909-A0F8-405f-845C-617132DB835D"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ICryptoHelperEvents))]
public class CryptoHelper: ICryptoHelper
{
}
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 6/29/2007 5:23:00 PM
Guid 도 줘 보고 나도 나름 빡시게 해본다고 했는데... -_-;

내가 테스트를 해봤는데 말이지... WSH에서는 이벤트를 잘 발생하던 녀석이
OBJECT 태그에는 아무런 반응이 없더라 이거지...
그래서 코드를 단 한줄도 안고치고 클래스를 UserControl에서 파생하잖아?
그럼 이벤트를 아주 잘 발생하더라는... 그래서 GG 쳤는뎅...
아찌가 함 해바바...
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / puzzle / 6/29/2007 6:49:00 PM
음. 경상이엉아가 안된다고하면 안되는거겠지. (함 해바바 소리에 바루 꼬리를 내리다...)
괜히 찔러봐서 미안... ㅋㅋㅋ
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 이경원 / 7/3/2007 9:20:00 AM
낚시의 대가심^^ 항상 좋은 포스트를 기대하고 있습니다....^^ 스마트 클라이언트는 해보질 안아서리 어려운것 같아용^^
담 포스트 기대할께요..항상 많이 배우고 갑니다..^^ 좋은 하루 되세요^^
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 탑 / 7/6/2007 9:39:00 AM
좋은 정보 잘 읽고 갑니다.....휘릭~
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 키온 / 7/11/2007 10:49:00 PM
줸장 떡밥이 너무 크자나!!!
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 7/12/2007 2:45:00 AM
우헤헤... 키온 엉아가 걸리다니... 오늘은 대어를 낚았닷!!!
이거 낚시 대 성공인걸?
^____^
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 강희기 / 7/13/2007 11:53:00 AM
역시 내공이 충만하시네욧~ 이 포스트로 한수또 배웁니닷~ 수공..
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 눈꽃천사 / 9/27/2007 1:07:00 AM
스마트 클라이언트와는 상관없겠지만, 암복호화를 다룬 아랫 글도 도움이 되겠네요.
Symmetric Key Encryption using Rijndael and C#
http://dotnet.org.za/deon/pages/2998.aspx

포스트 잘 읽었습니다.
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 미지 / 10/29/2007 3:01:00 AM
잘 보았습니다. 항상 이것으로 해야겠다고 생각하고 뒤져보면 쥔장님의 글이 나집니다. 항상 저보단 빠르단 얘깁니다.
"So What?"에 대하여 좀 더 풍부히 얘기 주시면 고맙겠습니다.
일단 기업들에 스마트 클라이언트를 먹이려면 항상 CAS설정이 애를 먹입니다.
이전에는 보안상 위험하기 이를데 없는 OCX잘 쓰다가도 스마트 클라이언트를 위해 뭔가 설정해야 한다면 말들 많습니다.
이런 까다로운 님네들 대상할 때 UI없는 스마트클라이언트가 효과적으로 이용될 수 있다고 생각합니다. 지적하신대로 암호화/해시처리등의 스크립트에서 처리 불가능한거 하는데 알맞거든요.
어쨌든 UI가지는 것보다는 CAS요구가 낮으니 말입니다.
앞말은 이만하고 알고 싶은것은 어떠한 특정의 설정도 하지 않은 "순수한" XP SP2(닷넷프레임워크는 당연 설치되고요)에서 브라우저로 url쳐넣을때 CAS설정에 구애되지 않는 닷넷기능들에 어떤것들이 있는지
실지 이용경험에서 알려주시면 고맙겠습니다. 해보시지 못했어도 그냥 그럴거라고만 하셔도 많이 감사하겠습니다.
원래 건달이여서 확인 하지 않는것도 있고 쥔장님의 체계적인 말도 듣고 싶고요.
좋은글 보고 부탁까지 하는거 미안~_~;
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 블로그쥔장 / 10/31/2007 3:07:00 PM
사실 CAS 설정을 요구하지 않고 할 수 있는 일들은 그다지 많지 않습니다.
간단한 UI 표시와 제한된 방법과 제한된 영역의 로컬 디스크 액세스 정도라고 할 수 있지요.
대개 웹 어플리케이션을 작성할 때 ActiveX나 스마트 클라이언트가 떠오른다면
그건 HTML과 스크립트로 하기 너무 어렵고 시간이 많이 소요되거나 아예 불가능 한 기능들이
요구될 때이지요. 그런 경우라면 대부분 기본 인터넷 영역에 대한 CAS 보안에도 위배되기 마련입니다.
대부분의 기업 내부라면 CAS 설정에 대한 반감은 크지 않습니다.
다만 CAS 설정을 위해 무언가 다운로드 하거나 설치 프로그램을 돌려야 한다는 것에 반감을
가질 뿐이지요. CAS 설정을 설치 프로그램의 다운로드 없이 수행하기 위해서는 ActiveX를 사용하거나
ClickOnce를 이용하는 방법 밖에는 없는 것으로 알고 있습니다.
저의 경험상 스마트 클라이언트를 적용했던 기업은 모두 닷넷 프레임워크가 배포되지 않은 상황
이었습니다. 따라서 닷넷 프레임워크에 대한 배포 패키지를 만들면서 CAS 설정까지 수행하는 설치
프로그램을 만들어 배포했었습니다.

CAS 설정이 없는 환경이라면 기업 내부가 아닌 인터넷 환경인데 인터넷 환경에서 스마트 클라이언트를 이용하여
서비스하는 것은 아직 시기 상조입니다. 닷넷 프레임워크 때문이지요. 닷넷 프레임워크를 탑재하고 출시되는
운영체제는 Windows 2003 Server, Windows Vista 그리고 Windows 2008 Server 뿐입니다.
따라서 Windows Vista가 지금의 XP 처럼 널리 사용되지 않는한 어렵다는 얘기지요.

UI가 없는 스마트 클라이언트의 적용 사례는 클라이언트 PC의 레지스트리 설정이나
기타 설정작업을 해줄 때 였습니다. 간단히 메시지 박스를 표시해서 사용자의 동의를 얻은 후,
클라이언트 PC에서 batch 파일을 수행하거나 레지스트리 값을 변경하는 작업이였죠.
이 사례는 해당 기업이 이미 CAS 설정이 모두 되어 있는 상황이었습니다.
CAS 설정 없이 스마트 클라이언트를 사용하는 사례는 아직 (제가 아는한) 없습니다.

주저리 주저리 말이 많았지만, 결론은....
CAS 설정을 하지 않고 사용할 수 있는 스마트 클라이언트 어플리케이션은
인터넷 환경과 기업 인트라넷 환경을 고려해 보았을 때 아직 시기 상조라 할 수 있겠네요.
인트라 넷 환경이라면 CAS 설정을 사용자의 개입 없이 자동으로 수행해 줄 수 있는 방법을 찾는 것이
중요하다고 할 수 있겠습니다.

도움이 되셨기를......
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 미지 / 11/1/2007 7:23:00 PM
예 CAS설정관련 답변 감사하게 보았고 도움이 되였습니다.
실지 업무관련 프로그래밍 많이 하신 쥔장님의 경험과 생각이 필요하였던 것입니다.
어떠한 기능이 되고 어떠한 기능이 안되는거야 제가 해보면 됩니다.

저희가 실지 스마트 클라이언트로 하려는 기능은 암호화, background에서 서버와의 통신, 복잡한 로직의 처리등이고
UI관련은 자바스크립트로 하렵니다. 지금 Ajax많이 떠들지 않나요. 그것이 좋다니 모두 그걸로 해달랍니다.

Ajax,Web2.0말들은 많이하는데 개발자 입장에서는 그저 background에서 자료받아와 스크립트로 뿌려 화면이 껌벅거리지 않는것
정도로 대하고 있습니다.(그것만이라면 뭐라할 사람들 많겠지만...)

실지 개발을 하다보면 이런저런 기능이 필요해서 CAS설정은 해야 할걸로 생각을 합니다. 그냥 FullTrust로 해버리렵니다.
그리고 그 설정은 첫 사용시에 로그인 페이지 쯤에서 프로그램하나 다운하여 실행하라 하겠습니다.(로컬 계정에서)

모든걸 자바 스크립트로 하면 많은 로직이 클라이언트에 소스상태로 공개가 된다는것이 저의 생각입니다.
그래서 "중요한건 스마트 클라이언트에서 한다"는 입장입니다.

쥔장님이 조언주실것 있어 답변주시면 고맙겠고 그냥 한번 보아 주시기만 해도 감사하겠습니다.
#re: 스마트 클라이언트 절정의 팁 !!! - 궁금하지? 흐흐흐 / 이상철 / 1/21/2009 5:46:00 PM

좋은 자료 감사합니다. 직접 고생하시면서 얻었던 기술자료인지, 불필요한 사설 없이 깔끔한 내용입니다.
다만, Smart Client 가 IE Add In이어야만 한다는 오해의 글(거기서 연결하여 들어왔습니다.)들이 있어 줜장님의 확인사살(?)이 필요하다고 봅니다. :-)