본문 바로가기

IT 살이/04. 기술 - 프로그래밍

[연재 04] ClickOnce : Look Into The Internals

앞의 포스트까지는 "보이는대로, 하라는대로" 했다. 이제 그 이면에서 무슨 일들이 일어나는지에 포커스를 두겠다. 주로 다음 3가지 주제를 다루려고 한다.
- ClickOnce와 관련된 메너페스트 파일(애플리케이션 메너페스트, 배포 메너페스트)
- 클라이언트측 캐시
- 애플리케이션 구동 메커니즘

1. 메너페스트 파일

Visual Studio.NET 2005를 이용하면 애플리케이션에 포함된 파일을 지정된 곳으로 복사할뿐만 아니라 몇 개의 메너페스트(manifest)[각주:1]  파일을 자동 생성해준다 : 배포 메너페스트(.application), 애플리케이션 메너페스트(.exe.manifest). ClickOnce 애플리케이션은 인스톨 패키지가 없이 이 두 메너페스트 파일에 애플리케이션 인스톨에 필요한 모든 정보가 기술되어 있다. 이 두 파일에 기술되어 있는 정보를 읽어들어 그대로 수행하는 것은 .NETv2.0이 한다. 메너페스트 파일, .NET v2.0 그리고 IIS 웹 서버 그리고 MIME 타입, MIME 타입 핸들러( MIME 필터)등은 ClickOnce 배포의 근간을 이루는 구성 요소이다.

배포 메너페스트(deployment manifest)
은  다음과 같은 정보가 있는 XML 파일이다.
- 클라이언트가 사용할 애플리케이션의 버전 정보
- 언제 업데이트를 할 것인지, 업데이트는 필수인지 선택적인지 등 업데이트 기준. 선택적이라면 사용자가에 업데이트를 할지 프로프트 대화창이 뜬다.
- 현재 버전의 애플리케이션 메너페스트 파일의 위치
- 확장자 : .application
업데이트 설정은 온라인 전용의 애플리케이션에서는 사용할 수 없다. 업데이트에 대한 자세한 내용은 뒤에 오는 포스트에서 다루겠다.

애플리케이션 메너페스트(application manifest)
파일의 다음과 같은 정보가 있다.
- 애플리케이션을 구성하는 어셈블리 목록과 파일 목록
- 어셈블리의 full name 정보( 어셈블리명, 버전 등 )
- 애플리케이션에서 필요로 하는 권한 정보
- 확장자 : .exe.manifest
ClickOnce 런타임은 참조되는 어셈블리를 알아내기 위해서 .NET의 CLR(어셈블리 메너페스트)를 검색하지 않고 바로 애플리케이션 메너페스트에 있는 정보를 이용하는 구조로 되어 있다. 생각해보면 당연하겠지만 애플리케이션 파일은 버전별로 별도의 디렉토리에 존재한다.
ClickOnce 애플리케이션은 이 두 메너페스트 파일에 애플리케이션 타입(온, 오프라인) 그리고 초기 배포, 업데이트에 대한 모든 정보가 들어있다. ClickOnce 애플리케이션의 배포와 업데이트는 모두 메너페스트 기반(manifest-driven)으로 이해하는 것이 가장 좋은 이해 방식일 것 같다. 이제 이 두 메너페스트 파일을 .NET 프레임워크에서 어떻게 사용하는지를 알아보자.

2. 애플리케이션 구동 메커니즘

이제 애플리케이션이 구동되는 절차를 좀 자세히 알아보자. 클라이언트 PC가 웹 서버에 ClickOnce 애플리케이션을 요청을 하는 것부터 시작하는 절차를 그림으로 그렸다.1402209406

ClickOnce 애플리케이션 구동 절차
그림을 보면 클라이언트 PC에서는 두 단계의 작업이 일어난다.


부트스트래퍼 수행 단계 : setup.exe 실행
ClickOnce 엔진 수행 단계 : dfsvc.exe 실행


1) 부트스트래퍼 실행

ClickOnce 애플리케이션이 클라이언트 PC에 설치되는 것은 결국 서버에 배포 메너페스트 파일.application을 요청하면서부터이다. 이때부터 애플리케이션이 활성화된다고 볼 수 있다. .application 파일이 호출되는 두 가지 방법이 있다. setup.exe를 호출하면 setup.exe는 자기 할일을 한 후 .application 파일을 호출해준다. 또는 직접 .application 파일을 호출할 수도 있다.
setup.exe가 수행되는 단계는 ClickOnce 배포 단계에 반드시 포함되는 단계는 아니다. 만약 클라이언트 PC에 원하는 버전의 .NET 프레임워크가 설치되어 있는 상태에서, 필수 프로그램으로서 .NET 프레임워크만이 선택되었다면 setup.exe는 수행되지 않을 것이다. publish.htm을 요청할때 이미 서버측에서는 HTTP 요청으로 올라오는 헤더 부분을 통해서 클라이언트에 .NET 프레임워크가 설치되었는지를 알 수 있다. 따라서 publish.htm 파일을 만들어서 내려보낼때 "실행"버튼을 클릭하면 setup.exe 대신에 바로 .application 파일을 요청하도록 링크를 수정한다. 그러나 만약 .NET 프레임워크 외에 다른 필수 프로그램도 선택했다면 "실행"버튼을 클릭하면 항상 setup.exe 프로그램이 실행될 것이다.
따라서 실전 프로젝트에서는 애플리케이션을 최초로 호출하는 사용자를 위한 인스톨 페이지와 그리고 인스톨을 정상적으로 마친 사용자를 위한 구동 페이지를 분리하는 것이 적절한 시나리오일 것으로 보인다.
인스톨 페이지에서는 반드시 부트스트래퍼를 사용할 필요는 없을 것이다. 다른 방식(MSI, 셋업 프로그램)을 사용해도 될 것이다. 그리고 구동 페이지에서는 반드시 .applicatoion 페이지를 호출하도록 하는 것이다. 많은 경우 구동 페이지가 로그인 페이지가 될 것이다. 즉 로그인이 완료된 사용자에게 .application을 반환해 줌으로써 애플리케이션이 구동되도록 하는 것이다.

2) 배포 메너페스트 다운

ClickOnce 엔진 수행단계를 보면 일단 서버로부터 .application 페이지가 반환되는 때부터 시작된다. .NETv2.0이 클라이언트에 설치되어 있다면 .application 확장자에 대한 MIME 타입으로 application/x-ms-application이 설정되어 있고 그리고 이 MIME 타입에 대한 핸들러는 .application 파일을 ClickOnce 엔진에게 넘겨준다.

중요한 것은 배포 매너페스트 파일과 애플리케이션 메너페스트 파일은 같은 곳에 있을 필요는 없다는 것이다. 예를 들어 배포 매너페스트 파일은 CD를 통해서 사용자에게 배포될 수 있다. 그것이 활성화될때 ClickOnce 엔진이 가동되고 ClickOnce엔진은 다시 배포 매너페스트에 설정된 애플리케이션 매너페스트 파일을 찾는다.

3) ClickOnce 엔진 수행 단계

ClickOnce 엔진은 dfsvc.exe 프로세스를 말하는데, 이 프로세스는 업데이트 확인 및 다운로드를 처리하는 실제 "ClickOnce" 엔진이다. 이 프로세스는 "ClickOnce" 응용 프로그램의 업데이트가 필요한 경우에 실행되며, 15분간 사용되지 않으면 저절로 종료된다. 
exe 애플리케이션을 직접 호출해서 구동시키는 애플리케이션은 ClickOnce 애플리케이션이 아니다. 즉 ClickOnce 엔진이 시작되지 않는다.

ClickOnce 엔진은  다음과 같은 일들을 한다.
-  애플리케이션은 어떤 권한(permission)들을 필요로 하는가?
- 권한이 필요하다면 사용자에게 프롬프트 대화창을 띄운다.
- 애플리케이션이  (새로운) 매너페스트(.exe.manifest) 파일을 다운받는다. 만약 새롭게 게시되지 않은 애플리케이션이라면 애플리케이션 매너페스트 파일은 다운되지 않는다.
- 새로운 애플리케이션 메너페스트 파일을 다운받았다면, 그 파일에 기록된 어셈블리와 파일들을 다운받는다.

4) 관련 대화창

애플리케이션 파일들이 다운되는 동안 몇가지 대화창이 뜰 수 있다.
- Windows XP SP2 경고창
- 소프트웨어 라이센스 동의 창
- 알려지지 않은 게시자를 알리는 창
1042469086 

보안경고

1397239259 

IE_알려지지 않은 게시자

1274940444 

애플리케이션_알려지지 않은 게시자
이 대화창에 대한 이야기는 뒤에 오는 보안 관련 포스트에서 한번 더 언급할 기회가 있을 것이다.

5) ClickOnce 애플리케이션 캐시

다운된 애플리케이션 파일들은 클라이언트 PC에 캐싱되는데, 이 캐시는 NTD에서 사용하고 있는 캐시와는 별도의 공간을 갖는다.
1277978241 

NTD 어셈블리 다운로드 캐시


ClickOnce 애플리케이션 파일들이 저장된 모습을 보고 싶다면 우선 숨겨진 파일 및 폴더를 보이도록 설정한다.
1251126565 

숨겨진 파일 및 폴더 표시 설정

그리고 탐색기를 통해서 다음 경로의 하위 디렉토리를 보면 다운된 파일을 모습을 볼 수 있다.

C:\Documents and Settings\로그인사용자계정\Local Settings\Apps\2.0\XXX

1000620820 

ClickOnce 애플리케이션 캐시

EXE 파일 및 기타 필요한 어셈블리는 이렇게 일단 클라이언트 PC로 다운된 후 실행된다. 내공있는 독자라면, 애플리케이션 베이스 디렉토리가 NTD 배포와는 다르게 로컬 디렉토리를 가리키고 있을것이라는 추측이 스치고 있을지도 모르겠다. 그렇다. ClickOnce 애플리케이션의 베이스 디렉토리는 로컬 경로를 갖기 때문에 퓨전(fusion)은 모든 어셈블리를 로컬에서 검색하게 된다. NTD에서처럼 참조되는 어셈블리를 서버에서 찾는 일은 없다. 혹시 노파심에서 그러는데, 참조에의한 검색과 업데이트를 혼동하지는 않으리라 믿는다. 런타임시 어셈블리 바인딩시의 검색은 퓨전이 담당하지만, 서버측에 새로운 업데이트 버전이 올라와있다면 퓨전이 다운받는 것이 아니라 ClickOnce 엔진에 의해서 업데이트 규칙에 의해(예를 들어 애플리케이션 시작 전 또는 종료 후에) 업데이트가 수행된다.

6) ClickOnce 애플리케이션 구동

애플리케이션 다운까지 정상적으로 수행이되었다면 ClickOnce 엔진은 이제 애플리케이션을 구동시킨다. 그러나 애플리케이션에 주어진 권한에 따라 다른 방식을 취한다.

만약 Full Trust를 갖는 애플리케이션이라면 로컬 PC에서 구동되는 애플리케이션과 동일한 환경에서 구동된다. 그러나 권한에 제한이 있는 애플리케이션이라면 AppLaunch.exe라는 프로세스가 먼저 실행된다. 그런 다음 ClickOnce 애플리케이션이 구동되는데 AppLaunch.exe는 ClickOnce 애플리케이션의 보안 Security SandBox 역할을 한다. 즉 안전한 실행 환경(Secure Execution Environment, SEE)을 제공한다. 만약 애플리케이션이 권한 밖의 행동을 하려고 하면 SandBox의 제어를 받게 된다. 이것과 관련해서 ClickOnce 보안 모델을 설명하는 포스트를 참조하기 바란다.

7) 다운받은 애플리케이션 삭제하기
추가로 PC에 다운받은 clickonce 애플리케이션 어셈블리들을 삭제하는 명령어를 소개한다.

mage -cc

이 명령어는 디렉토리 Local Settings 밑으로 다운받은 모든 애플리케이션과 데이터 파일을 삭제한다.


참조 문서
ClickOnce and FireFox with a custom setup equals ClickThrice and be disappointed - Scott Hanselman

ClickOnce Deployment Technology - Peter Bromberg
http://www.wise.com/Library/ClickOnce.pdf
ClickOnce : Bringing Ease and Reliability to SmartClient Deployment
http://www.code-magazine.com/article.aspx?quickid=0601041&page=1
Deploying applications - msdn
http://msdn2.microsoft.com/en-us/library/6hbb4k3e(VS.80).aspx

  1. manifest를 영영사전에서 찾아보면 다음과 같다. "a customs document listing the contents put on a ship or plane" 우리나라말로는 "적하 목록, 승객명단"으로 번역을 해 놓고 있다. [본문으로]