보안(WPF)

WPF(Windows Presentation Foundation) 독립 실행형 애플리케이션과 브라우저에서 호스트되는 애플리케이션을 개발할 때 보안 모델을 고려해야 합니다. WPF 독립 실행형 애플리케이션은 Windows Installer(.msi)를 사용하여 배포되건 XCopy 또는 ClickOnce를 사용하여 배포되건 무제한 권한(CASFullTrust 권한 집합)으로 실행됩니다. ClickOnce를 포함한 부분 신뢰, 독립 실행형 WPF 애플리케이션 배포가 지원되지 않습니다. 그러나 완전 신뢰 호스트 애플리케이션은 .NET Framework 추가 기능 모델을 사용하여 부분 신뢰 AppDomain을 만들 수 있습니다. 자세한 내용은 WPF 추가 기능 개요를 참조하세요.

WPF 브라우저에서 호스트되는 애플리케이션은 Windows Internet Explorer 또는 Firefox에서 호스트되며, XBAP(XAML 브라우저 애플리케이션) 또는 느슨한 XAML(Extensible Application Markup Language) 문서일 수 있습니다. 자세한 내용은 WPF XAML 브라우저 애플리케이션 개요를 참조하세요.

Warning

XBAP를 사용하려면 Internet Explorer 및 Firefox와 같은 레거시 브라우저가 작동해야 합니다. 이러한 이전 브라우저 버전은 일반적으로 Windows 10 및 Windows 11에서 지원되지 않습니다. 최신 브라우저는 보안 위험으로 인해 XBAP 앱에 필요한 기술을 더 이상 지원하지 않습니다. XBAP를 사용하도록 설정하는 플러그 인은 더 이상 지원되지 않습니다.

WPF 브라우저에서 호스트되는 애플리케이션은 기본적으로 부분 신뢰 보안 샌드박스 내에서 실행되며, 기본 CAS인터넷 영역 권한 집합으로 제한됩니다. 실제로 WPF 브라우저에서 호스트되는 애플리케이션은 일반적인 웹 애플리케이션의 분리가 예상되는 동일한 방식으로 클라이언트 컴퓨터에서 분리됩니다. XBAP는 배포 URL 및 클라이언트의 보안 구성의 보안 영역에 따라 권한을 완전 신뢰까지 높일 수 있습니다. 자세한 내용은 WPF 부분 신뢰 보안을 참조하세요.

이 항목은 Windows Presentation Foundation(WPF) 독립 실행형 애플리케이션과 브라우저에서 호스트되는 애플리케이션의 보안 모델에 대해 설명합니다.

이 항목에는 다음과 같은 섹션이 포함되어 있습니다.

안전한 탐색

XBAP의 경우 WPF는 두 가지 유형의 탐색, 즉 애플리케이션과 브라우저를 구별합니다.

애플리케이션 탐색은 브라우저에서 호스트되는 애플리케이션 내의 콘텐츠 항목 간을 탐색합니다. 브라우저 탐색은 브라우저 자체의 콘텐츠 및 위치 URL을 변경하는 탐색입니다. 애플리케이션 탐색(일반적으로 XAML)과 브라우저 탐색(일반적으로 HTML) 간의 관계는 다음 그림에 나와 있습니다.

Relationship between application navigation and browser navigation.

XBAP가 탐색하기에 안전하다고 간주되는 콘텐츠의 유형은 주로 애플리케이션 탐색이 사용되는지, 브라우저 탐색이 사용되는지에 따라 결정됩니다.

애플리케이션 탐색 보안

네 가지 유형의 콘텐츠를 지원하는 팩 URI로 식별될 수 있는 경우 애플리케이션 탐색은 안전하다고 간주됩니다.

콘텐츠 유형 설명 URI 예제
리소스 빌드 유형이 리소스인 프로젝트에 추가된 파일. pack://application:,,,/MyResourceFile.xaml
콘텐츠 빌드 유형이 콘텐츠인 프로젝트에 추가된 파일. pack://application:,,,/MyContentFile.xaml
원래 사이트 빌드 유형이 없음인 프로젝트에 추가된 파일. pack://siteoforigin:,,,/MySiteOfOriginFile.xaml
애플리케이션 코드 컴파일된 코드 숨김이 있는 XAML 리소스.

또는

빌드 유형이 페이지인 프로젝트에 추가된 XAML 파일.
pack://application:,,,/MyResourceFile .xaml

참고

애플리케이션 데이터 파일 및 팩 URI에 대한 자세한 내용은 WPF 애플리케이션 리소스, 콘텐츠 및 데이터 파일을 참조하세요.

이러한 콘텐츠 형식의 파일은 사용자 또는 프로그래밍 방식으로 탐색할 수 있습니다.

  • 사용자 탐색. 사용자는 Hyperlink 요소를 클릭하여 탐색합니다.

  • 프로그래밍 방식 탐색. 예를 들어 NavigationWindow.Source 속성을 설정하여 애플리케이션이 사용자의 관여 없이 탐색합니다.

브라우저 탐색 보안

브라우저 탐색은 다음 조건에서만 안전한 것으로 간주됩니다.

  • 사용자 탐색. 사용자는 중첩된 Frame이 아니라 기본 NavigationWindow 내에 있는 Hyperlink 요소를 클릭하여 탐색합니다.

  • 영역. 탐색 대상 콘텐츠는 인터넷 또는 로컬 인트라넷에 있습니다.

  • 프로토콜. 사용되는 프로토콜은 http, https, file 또는 mailto입니다.

XBAP가 이러한 조건에 맞지 않는 방식으로 콘텐츠를 탐색하려고 하는 경우, SecurityException이 throw됩니다.

웹 브라우징 소프트웨어 보안 설정

컴퓨터의 보안 설정은 웹 브라우징 소프트웨어 권한이 부여된 액세스 권한을 결정합니다. 웹 브라우징 소프트웨어는 Internet Explorer 및 PresentationHost.exe를 포함하여 WinINet 또는 UrlMon API를 사용하는 애플리케이션이나 구성 요소를 포함합니다.

Internet Explorer는 다음을 포함하여 Internet Explorer에서 실행하도록 허용되는 기능을 구성할 수 있는 메커니즘을 제공합니다.

  • .NET Framework 의존 구성 요소

  • ActiveX 컨트롤 및 플러그인

  • 다운로드

  • 스크립팅

  • 사용자 인증

이러한 방식으로 보호할 수 있는 기능 컬렉션은 인터넷, 인트라넷, 신뢰할 수 있는 사이트제한된 사이트 영역에 따라 구성됩니다. 다음 단계는 보안 설정을 구성하는 방법을 설명합니다.

  1. 제어판을 엽니다.

  2. 네트워크 및 인터넷을 클릭한 다음 인터넷 옵션을 클릭합니다.

    인터넷 옵션 대화 상자가 나타납니다.

  3. 보안 탭에서 보안 설정을 구성할 영역을 선택합니다.

  4. 사용자 지정 수준 단추를 클릭합니다.

    보안 설정 대화 상자가 표시되며 선택한 영역의 보안 설정을 구성할 수 있습니다.

    Screenshot that shows the Security Settings dialog box.

참고 항목

Internet Explorer에서 인터넷 옵션 대화 상자에 액세스할 수도 있습니다. 도구를 클릭한 다음 인터넷 옵션을 클릭합니다.

Windows Internet Explorer 7부터 .NET Framework에 특별히 다음 보안 설정이 포함됩니다.

  • 느슨한 XAML. Internet Explorer가 느슨한 XAML 파일로 이동할 수 있는지 여부를 제어합니다. (설정, 해제 및 확인 옵션).

  • XAML 브라우저 애플리케이션. Internet Explorer가 XBAP로 이동하여 XBAP를 실행할 수 있는지 여부를 제어합니다. (설정, 해제 및 확인 옵션).

기본적으로 이 설정은 인터넷, 로컬 인트라넷신뢰할 수 있는 사이트 영역에 모두 사용되며, 제한된 사이트 영역에는 사용되지 않습니다.

인터넷 옵션을 통해 사용할 수 있는 보안 설정 외에 다음 레지스트리 값은 선택적으로 다양한 보안 관련 WPF 기능을 차단하는 데 사용할 수 있습니다. 해당 값은 다음 키에서 정의됩니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\Features

다음 표에서는 설정할 수 있는 값을 보여 줍니다.

값 이름 값 형식 값 데이터
XBAPDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
LooseXamlDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
WebBrowserDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
MediaAudioDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
MediaImageDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
MediaVideoDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.
ScriptInteropDisallow REG_DWORD 1은 허용되지 않으며 0은 허용됩니다.

WebBrowser 컨트롤 및 기능 컨트롤

WPF WebBrowser 컨트롤을 사용하여 웹 콘텐츠를 호스트할 수 있습니다. WPF WebBrowser 컨트롤은 기본 WebBrowser ActiveX 컨트롤을 래핑합니다. WPF WebBrowser 컨트롤을 사용하여 신뢰할 수 없는 웹 콘텐츠를 호스트하는 경우 WPF는 애플리케이션 보안을 위해 약간의 지원을 제공합니다. 그러나 일부 보안 기능은 WebBrowser 컨트롤을 사용하여 애플리케이션에서 바로 적용되어야 합니다. WebBrowser ActiveX 컨트롤에 대한 자세한 내용은 WebBrowser 컨트롤 개요 및 자습서를 참조하세요.

참고

Frame 컨트롤은 WebBrowser를 사용하여 HTML 콘텐츠로 이동하므로 이 섹션은 해당 컨트롤에도 적용됩니다.

WPF WebBrowser 컨트롤이 신뢰할 수 없는 웹 콘텐츠를 호스트하는 데 사용하는 경우, 애플리케이션은 부분 신뢰 AppDomain을 사용하여 악의적인 HTML 스크립트 코드에서 애플리케이션 코드를 분리해야 합니다. 특히 애플리케이션이 InvokeScript 메서드와 ObjectForScripting 속성을 사용하여 호스트된 스크립트와 상호 작용하는 경우 그렇습니다. 자세한 내용은 WPF 추가 기능 개요를 참조하세요.

애플리케이션이 WPF WebBrowser 컨트롤을 사용하는 경우, 보안을 강화하고 공격을 완화하는 또 다른 방법은 Internet Explorer 기능 컨트롤을 사용하도록 설정하는 것입니다. 기능 컨트롤은 관리자와 개발자가 Internet Explorer 및 WebBrowser ActiveX 컨트롤을 호스트하는 애플리케이션의 기능을 구성할 수 있도록 허용하는 Internet Explorer의 추가 기능입니다. 이 컨트롤은 WPF WebBrowser 컨트롤에서 래핑합니다. 기능 컨트롤은 CoInternetSetFeatureEnabled 함수를 사용하거나 레지스트리에서 값을 변경하여 구성할 수 있습니다. 기능 컨트롤에 대한 자세한 내용은 기능 컨트롤 소개인터넷 기능 컨트롤을 참조하세요.

WPF WebBrowser 컨트롤을 사용하는 독립 실행형 WPF 애플리케이션을 개발하는 경우 WPF는 애플리케이션에 다음 기능 컨트롤을 자동으로 사용하도록 설정합니다.

기능 컨트롤
FEATURE_MIME_HANDLING
FEATURE_MIME_SNIFFING
FEATURE_OBJECT_CACHING
FEATURE_SAFE_BINDTOOBJECT
FEATURE_WINDOW_RESTRICTIONS
FEATURE_ZONE_ELEVATION
FEATURE_RESTRICT_FILEDOWNLOAD
FEATURE_RESTRICT_ACTIVEXINSTALL
FEATURE_ADDON_MANAGEMENT
FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
FEATURE_SECURITYBAND
FEATURE_UNC_SAVEDFILECHECK
FEATURE_VALIDATE_NAVIGATE_URL
FEATURE_DISABLE_TELNET_PROTOCOL
FEATURE_WEBOC_POPUPMANAGEMENT
FEATURE_DISABLE_LEGACY_COMPRESSION
FEATURE_SSLUX

이러한 기능 컨트롤은 조건에 상관 없이 사용되므로 이 컨트롤로 인해 완전 신뢰 애플리케이션가 손상될 수 있습니다. 이 경우 특정 애플리케이션 및 호스팅하는 콘텐츠에 대한 보안 위험이 없다면, 해당 기능 컨트롤을 비활성화할 수 있습니다.

기능 컨트롤은 WebBrowser ActiveX 개체를 인스턴스화하는 프로세스에 의해 적용됩니다. 따라서 신뢰할 수 없는 콘텐츠를 탐색할 수 있는 독립 실행형 애플리케이션을 만드는 경우, 추가 기능 컨트롤 사용을 심각하게 고려해야 합니다.

참고

이 권장 사항은 MSHTML 및 SHDOCVW 호스트 보안을 위한 일반 권장 사항을 기반으로 합니다. 자세한 내용은 MSHTML 호스트 보안 FAQ: 파트 1/2MSHTML 호스트 보안 FAQ: 파트 2/2를 참조하세요.

실행 파일의 경우, 레지스트리 값을 1로 설정하여 다음 기능 컨트롤을 사용하도록 설정하는 것이 좋습니다.

기능 컨트롤
FEATURE_ACTIVEX_REPURPOSEDETECTION
FEATURE_BLOCK_LMZ_IMG
FEATURE_BLOCK_LMZ_OBJECT
FEATURE_BLOCK_LMZ_SCRIPT
FEATURE_RESTRICT_RES_TO_LMZ
FEATURE_RESTRICT_ABOUT_PROTOCOL_IE7
FEATURE_SHOW_APP_PROTOCOL_WARN_DIALOG
FEATURE_LOCALMACHINE_LOCKDOWN
FEATURE_FORCE_ADDR_AND_STATUS
FEATURE_RESTRICTED_ZONE_WHEN_FILE_NOT_FOUND

실행 파일의 경우, 레지스트리 값을 0으로 설정하여 다음 기능 컨트롤을 사용하지 않도록 설정하는 것이 좋습니다.

기능 컨트롤
FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT

Windows Internet Explorer에서 WPF WebBrowser 컨트롤을 포함하는 부분 신뢰 XAML 브라우저 애플리케이션(XBAP)을 실행하는 경우, WPF는 Internet Explorer 프로세스의 주소 공간에서 WebBrowser ActiveX 컨트롤을 호스트합니다. WebBrowser ActiveX 컨트롤이 Internet Explorer 프로세스에서 호스트되기 때문에 Internet Explorer의 모든 기능 컨트롤은 WebBrowser ActiveX 컨트롤에도 사용됩니다.

또한 Internet Explorer에서 실행하는 XBAP는 일반 독립 실행형 애플리케이션보다 추가된 보안 수준이 제공됩니다. 이 추가 보안은 Internet Explorer와 WebBrowser ActiveX 컨트롤이 Windows Vista 및 Windows 7에서 기본적으로 보호 모드로 실행되기 때문입니다. 보호 모드에 대한 자세한 내용은 보호 모드 Internet Explorer 이해 및 작업을 참조하세요.

참고

인터넷 영역에 있을 때 Firefox에서 WPF WebBrowser 컨트롤을 포함하는 XBAP를 실행하려고 하면 SecurityException이 throw됩니다. 이는 WPF 보안 정책에 의한 것입니다.

부분적으로 신뢰할 수 있는 클라이언트 애플리케이션에 대한 APTCA 어셈블리를 사용하지 않도록 설정

관리되는 어셈블리가 전역 어셈블리 캐시(GAC)에 설치되는 경우 설치를 위해 사용자가 명시적 권한을 제공해야 하므로 이 어셈블리는 완전히 신뢰할 수 있게 됩니다. 완전히 신뢰할 수 있기 때문에 완전히 신뢰할 수 있는 관리 클라이언트 애플리케이션에서 사용할 수 있습니다. 부분적으로 신뢰할 수 있는 애플리케이션이 이 어셈블리를 사용하려면 AllowPartiallyTrustedCallersAttribute(APTCA)로 표시되어야 합니다. 부분 신뢰로 실행하기에 안전한 것으로 테스트된 어셈블리만 이 특성으로 표시되어야 합니다.

그러나 APTCA 어셈블리가 GAC에 설치된 후 보안 결함을 드러낼 수 있습니다. 보안 결함이 발견되면 어셈블리 게시자는 기존 설치에서 문제를 해결하는 보안 업데이트를 생성할 수 있으며, 문제가 발견된 후 발생할 수 있는 설치를 방지할 수 있습니다. 업데이트에 대한 한 가지 옵션은 어셈블리를 제거하는 것이지만 어셈블리를 사용하는 완전히 신뢰할 수 있는 다른 클라이언트 애플리케이션이 중단될 수 있습니다.

WPF는 APTCA 어셈블리를 삭제하지 않고 APTCA 어셈블리가 부분적으로 신뢰할 수 있는 XBAP에 대해 사용할 수 없는 메커니즘을 제공합니다.

APTCA 어셈블리를 사용하지 않도록 설정하려면 특수한 레지스트리 키를 만들어야 합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\<AssemblyFullName>, FileVersion=<AssemblyFileVersion>

이에 대한 예는 다음과 같습니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy\APTCA\aptcagac, Version=1.0.0.0, Culture=neutral, PublicKeyToken=215e3ac809a0fea7, FileVersion=1.0.0.0

이 키는 APTCA 어셈블리에 대한 항목을 설정합니다. 어셈블리를 사용할지를 지정하는 이 키에서 값을 만들 수도 있습니다. 다음은 값의 세부 정보입니다.

  • 값 이름: APTCA_FLAG.

  • 값 형식: REG_DWORD.

  • 값 데이터: 사용하지 않도록 설정하려면 1, 사용하도록 설정하려면 0.

어셈블리를 부분적으로 신뢰할 수 있는 클라이언트 애플리케이션에 사용하지 않도록 설정해야 하는 경우, 레지스트리 키와 값을 만드는 업데이트를 작성할 수 있습니다.

참고

핵심 .NET Framework 어셈블리는 관리 애플리케이션을 실행하는 데 필요하기 때문에 이러한 방식으로 사용하지 않도록 설정해도 영향을 받지 않습니다. APTCA 어셈블리를 사용하지 않도록 설정하는 것에 대한 지원은 기본적으로 타사 애플리케이션을 대상으로 합니다.

느슨한 XAML 파일에 대한 샌드박스 동작

느슨한 XAML 파일은 코드 숨김, 이벤트 처리기 또는 애플리케이션 관련 어셈블리에 관계없는 표시 전용 XAML 파일입니다. 느슨한 XAML 파일은 브라우저에서 직접 탐색되는 경우, 기본 인터넷 영역 권한 집합에 따라 보안 샌드박스에서 로드됩니다.

하지만 독립 실행형 애플리케이션의 NavigationWindow 또는 Frame에서 느슨한 XAML 파일을 탐색하는 경우 보안 동작이 다릅니다.

두 경우 모두, 탐색된 느슨한 XAML 파일은 호스트 애플리케이션의 권한을 상속합니다. 그러나 이 동작은 특히 느슨한 XAML 파일이 신뢰할 수 없거나 알 수 없는 엔터티에서 생성된 경우 보안 면에서 적절하지 않을 수 있습니다. 이 콘텐츠 유형을 외부 콘텐츠라고 하며, FrameNavigationWindow는 모두 탐색될 때 이 콘텐츠를 격리하도록 구성할 수 있습니다. 다음 FrameNavigationWindow 예제에 나온 것처럼 SandboxExternalContent 속성을 true로 설정하면 격리가 가능합니다.

<Frame 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</Frame>
<!-- Sandboxing external content using NavigationWindow-->
<NavigationWindow 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  Source="ExternalContentPage.xaml" 
  SandboxExternalContent="True">
</NavigationWindow>

이 설정을 통해 외부 콘텐츠가 애플리케이션을 호스팅하는 프로세스와 별개인 프로세스로 로드됩니다. 이 프로세스는 효과적으로 호스팅 애플리케이션과 클라이언트 컴퓨터에서 격리되어 기본 인터넷 영역 권한 집합으로 제한됩니다.

참고

독립 실행형 애플리케이션의 NavigationWindow 또는 Frame에서 느슨한 XAML 파일 탐색이 PresentationHost 프로세스와 관련된 WPF 브라우저 호스팅 인프라를 기반으로 구현되더라도 Window Vista 및 Windows 7의 Internet Explorer에서 여전히 PresentationHost를 통해 직접 콘텐츠가 로드되는 경우보다 보안 수준이 약간 낮습니다. 웹 브라우저를 사용하는 독립 실행형 WPF 애플리케이션은 Internet Explorer의 추가 보호 모드 보안 기능을 제공하지 않습니다.

보안을 승격하는 WPF 애플리케이션 개발을 위한 리소스

다음은 보안을 증진하는 WPF 애플리케이션을 개발하는 데 도움이 되는 몇 가지 추가 리소스입니다.

영역 리소스
관리 코드 애플리케이션에 대한 패턴 및 사례 보안 지침
CAS 코드 액세스 보안
ClickOnce ClickOnce 보안 및 배포
WPF WPF 부분 신뢰 보안

참고 항목