참 오래됐다.

.NET Smart Client, 즉 Embedded WinForm이 ActiveX를 대체하는 개념으로 사용되기 시작한 지도...

대략 .NET 1.1 버전이 나온 2002년 무렵부터 본격적으로 쓰기 시작했으니 벌써 15년째.


그간 .NET Smart Client도 ActiveX 보안 이슈와 맞물려 보안 정책이 갈수록 까다로워졌고,

결국 .NET Framework 4버전부터는 아예 사용할 수 없는 지경에까지 이르게 되었다.

결론을 한 마디로 말하자면, 웹 환경에서는 로컬 시스템이나 네트워크에 접근하지 말라는 얘기.

굳이 접근할 필요가 있다면 별도 어플리케이션을 개발하여 해당 어플리케이션을 통해 사용하라는...

(여기서 파생된 개념이 ClickOnce에서 시작해 발전한 Silverlight의 OOB(Out of Browser) 쯤 되겠다.

이것 역시 MVVM, UWP 등 계속 새로 등장하는 개념들에 묻혀 슬슬 사라져 가고 있긴 하지만.)


그런데 어디 세상 일이 꼭 그렇게만 될 수 있나?

살다 보면, 특히 기업 내부에서는 IE에 이런저런 기능들을 붙여 써야 하는 경우가 꽤 많다.


최근에 나 역시 IE 환경에서 출입카드 리더기를 읽어야 하는 일을 담당하게 되었다.

보통 이런 경우 해당 화면 자체를 IE가 아닌 데스크톱 어플리케이션으로 만들어 버리고

IE를 임베딩시켜 버리면 생각보다 더 간단히 해결될 수 있지만

이미 일 자체가 그렇게 진행되지 않았기 때문에 어쩔 수 없이 ActiveX나 .NET Smart Client로 만들어야 했다.






처음엔 ActiveX로 만들까 고려해봤지만 VB로 만들기엔 왠지 시대착오적인 것 같기도 하고, 

VC로 만들자니 시간이 너무 걸릴 것 같아서 포기했다. OCX Signing도 걸렸고...


그래서 어떻게든 .NET으로 만들어봐야겠다 싶었는데 이것도 보안 문제 때문에 쉽지는 않았다.

우여곡절 끝에 Silverlight로 만들어 보려고 했는데 이건 아예 보안의 장벽을 넘을 방법이 없어서 포기.

결국 .NET Framework 2.0 환경에서 Smart Client를 만드는 것으로 결정할 수밖에 없었다.

(.NET Framework 4버전부터는 아예 Smart Client가 동작되지 않기 때문에

Visual Studio로 Smart Client를 만들 때 2.0 버전 기반(최대 3.5 sp1)으로 만들어야 했다.)


카드 리더기는 대부분 로컬 컴퓨터의 시리얼 포트를 통해 통신하기 때문에

별로 웹 보안에 위배될 만한 것이 없으니 사용 가능할 수도 있지 않을까 했는데

시리얼 통신 역시 네트워크로 분류되어 강력하게 금지된 보안 제한 항목 중 하나였다!


즉, 별도 클라이언트 설정 없이 그냥은 못쓴다는 얘기.


그나마 기업 내부용에다 제한된 소수 컴퓨터에서만 쓰는 기능이다 보니

배포까지 세심하게 고려할 필요는 없으니 다행이랄까?






클라이언트에서 설정해야 하는 내용은 크게 보면 두 가지다.


하나는 IE에서 .NET Smart Client가 동작되도록 하는 레지스트리 설정,

또 하나는 개발된 .NET Smart Client의 보안 설정.


여기에 추가로, 혹시 쿠키라도 사용한다면 필요한 "신뢰할 수 있는 사이트" 설정까지.

(요즘은 점점 보안이 강화되어 그냥 인터넷 영역에서는 쿠키를 잘 사용할 수 없는 경우가 많다.

IE 인터넷 옵션에서 설정해도 되지만 레지스트리로 설정하면 더 간단하다.)






가장 먼저,

최신 컴퓨터 환경(.NET 4 이상 + IE10 이상)에서 .NET Smart Client가 구동되게 하려면

아래 레지스트리 설정이 필수다.




굳이 글로 다시 적어 보면,


; IE Hosting enabled for .NET Smart Client

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]

"EnableIEHosting"=dword:00000001


[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]

"EnableIEHosting"=dword:00000001



여기에, "https://myhost.domain.com" 사이트를 신뢰할 수 있는 사이트에 추가하려면
아래 설정을 추가해주면 된다.


; Security Zone: 0-internet, 1-local intranet, 2-trusted

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\domain.com\myhost]

"https"=dword:00000002



여기까지 하면 일단,

웹으로 배포한 .NET Smart Client가 다운로드되어 실행되는 것까지는 OK.

(이때 .NET Assembly cache의 다운로드 목록에 추가된다: "gacutil.exe /ldl" 명령으로 확인 가능.)


이후는 보안 문제를 해결할 차례.


정말 다운로드되어 실행되는지 확인하려면 Visual Studio에 포함되어 있는 도구인 어셈블리 바인딩 로그 뷰어(fuslogvw.exe)를 사용하면 된다.




이렇게 실행하면,




이런 화면이 나오는데,

최초에는 "로그 사용 안 함"으로 설정되어 있으므로 아무 것도 나오지 않는다.


왼쪽의 "설정" 버튼을 클릭해서 아래 화면과 같이 설정하고 나면

그 다음부터 로그가 기록된다.




보다 보면 엄청나게 많은 로그가 기록되는데

IE로 .NET Smart Client를 실행하는 것을 확인하기 위한 목적이므로 IEXPLORE.EXE 부분만 확인하면 된다.


다행히 정상 실행되면 상관없지만, 정상 실행이 되지 않거나 중간에 오류라도 발생한다면

위 어셈블리 바인딩 로그에 오류까지 상세하게 기록되므로

해당 오류를 찾아서 수정하거나 오류가 무시되도록 실행환경을 바꿔주면 된다.






앞에서도 말했지만, 로컬 네트워크 사용 등과 같이

코드를 수정해서 해결할 수 없는 보안 오류가 발생하는 경우에는 실행환경을 바꿔야 하는데

이 때 사용하는 도구가 .NET Framework에 포함되어 있는 caspol.exe 라는 도구다.


그런데 이 caspol.exe는 .NET Framework 버전 별로 따로 있다.

즉, .NET Framework의 베이스 버전인 1.0, 1.1, 2.0, 4.0까지 최대 4가지 버전이 있는 셈인데

Smart Client의 빌드 버전에 맞춰서 caspol.exe 역시 2.0 버전의 것을 사용해야 한다.



위에서 https://myhost.domain.com 사이트에서 Smart Client가 동작되어야 하는 환경이라고 가정했으니

caspol.exe 실행 예제도 동일한 환경으로 만들어 보면 아래와 같다.


@echo off

@set path=%SystemRoot%\Microsoft.NET\Framework\v2.0.50727;%path%


:.NET Smart Client 보안 설정

caspol -pp off

caspol -q -m -rg My.SmartClient

caspol -q -m -ag Trusted_Zone -url https://myhost.domain.com/* FullTrust -n My.SmartClient


즉, https://myhost.domain.com 사이트 하위에서는 모든 .NET Smart Client를

항상 FullTrust로 실행되도록 설정하겠다는 것.


이렇게 설정한 다음부터는 오류 없이 정상적으로 실행된다.

혹시 잘 안되면 재부팅.


끝.




Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]