---
title: 애플리케이션 라이프사이클에서의 위협
sidebar:
  order: 9
i18nReady: true
---

Tauri 애플리케이션은 애플리케이션 라이프사이클(제품 수명)의 다양한 시점에서 만들어진 수많은 부분으로 구성되어 있습니다.
여기서는 기존의 위협과 그에 대해 **어떻게 대처해야 하는지**에 대해 설명합니다.

그 개별적인 처리 절차를 모두 아래 각 섹션별로 설명합니다.

![Threat Stages During Development](@assets/concept/application-flow-simple.svg)

> > > Upstream: [상류 공정에서의 위협](#상류-공정에서의-위협)
> > > Development: [개발 시의 위협](#개발-시의-위협)
> > > Building: [빌드 시의 위협](#빌드-시의-위협)
> > > Distribution: [배포 시의 위협](#배포-시의-위협)
> > > Runtime: [실행 시의 위협](#실행-시의-위협)

:::note[(참고)]
애플리케이션 라이프사이클에서 가장 약한 연결 고리가 기본적으로 보안 내용을 결정하는 곳이 됩니다.
각 단계에서의 처리가 그 이후의 모든 단계의 전제와 정합성을 해칠 수 있으므로, 항상 전체 그림을 파악하는 것이 중요합니다.
:::

## 상류 공정에서의 위협

Tauri는 여러분의 프로젝트의 직접적인 의존 대상이며, 커밋, 검토, 풀 리퀘스트, 릴리스의 엄격한 작성자 관리를 수행하고 있으며,
종속성을 최신 상태로 유지하고 업데이트 또는 포크 수정을 수행하기 위한 조치를 취하는 데 최선을 다하고 있습니다. Tauri 이외에서 만드는 프로젝트에서는 그렇게 적절하게 관리되지 않고 감사도 한 번도 이루어지지 않았을 수 있습니다.

다른 프로젝트를 통합할 때는 그 건전성을 고려하십시오. 그렇지 않으면 모르는 사이에 아키텍처 유래의 "부채"를 떠안게 될 수 있습니다.

### 자신의 애플리케이션을 최신 상태로 유지하기

앱을 "야생에" 릴리스하는 경우, Tauri가 포함된 번들도 배송하게 됩니다.
Tauri에 영향을 미치는 취약점이 있다면 애플리케이션의 보안에도 영향을 미칠 수 있습니다.
Tauri를 최신 버전으로 업데이트하면 이미 중대한 취약점에 패치가 적용되어 애플리케이션에서 악용되지 않게 됩니다.
또한 컴파일러(`rustc`)와 트랜스파일러(`nodejs`)도 최신 상태로 유지하십시오. 보안 문제가 해결되는 경우가 많기 때문입니다.
이는 개발 시스템 전반에도 해당됩니다.

### 종속성 평가

NPM(Node Package Manager)과 Crates.io는 많은 유용한 패키지를 제공하지만,
신뢰할 수 있는 타사 라이브러리를 선택하는 것은 여러분의 책임입니다. 또는 Rust로 전부 다시 작성하십시오.
알려진 취약점의 영향을 받거나 유지 관리되지 않는 오래된 라이브러리를 사용하면 애플리케이션의 보안과 편안한 하룻밤의 잠이 위험에 처하게 될 수 있습니다.

이 프로세스를 자동화하기 위해 [`npm Audit`](https://docs.npmjs.com/cli/v10/commands/npm-audit)나 [`cargo Audit`](https://crates.io/crates/cargo-audit)과 같은 도구를 이용하고, 보안 커뮤니티의 중요한 노력에 의존하십시오.

[`cargo-vet`](https://github.com/mozilla/cargo-vet)이나 [`cargo crev`](https://github.com/crev-dev/cargo-crev)와 같은 Rust 생태계의 최근 경향은 공급망 공격의 가능성을 더욱 줄이는 데 도움이 될 것입니다.
자신이 누구의 어깨 위에 서 있는지, 즉 어떤 선구자의 지식을 이용하고 있는지 알기 위해서는 [`cargo supply chain`](https://github.com/rust-secure-code/cargo-supply-chain) 도구를 사용하십시오.

우리가 강력히 권장하는 방법은, 최선책으로 "리비전 해시 값(hash revisions)"을, 차선책으로 "이름 있는 태그(named tags)"를 사용하여 git에서 중요한 종속성만 사용하는 것입니다.
이는 Rust뿐만 아니라 Node 생태계에도 적용됩니다.

## 개발 시의 위협

개발자인 여러분은 개발 환경에 신경을 쓰고 있을 것입니다.
사용하는 운영 체제, 빌드 툴체인 및 관련 종속성이 최신 상태로 유지되고 적절하게 보호되는지 확인하는 것은 사용자인 여러분의 책임입니다.

우리 모두가 직면하고 있는 진정한 위험은 "공급망 공격"이라고 불리는 것으로, 이는 일반적으로 여러분의 프로젝트의 직접적인 종속성에 대한 공격으로 간주됩니다.
그러나 개발 머신을 직접 대상으로 하는 공격이巷에서 증가하고 있으므로, 이 문제에 정면으로 대처하고 대비합시다.

### 개발 서버

Tauri 애플리케이션의 프론트엔드는 다양한 웹 프레임워크를 사용하여 개발할 수 있습니다.
이러한 프레임워크는 모두 일반적으로 자체 개발 서버를 제공하며, 프론트엔드 자산은 열린 포트를 통해 로컬 시스템이나 네트워크에 공개됩니다.
이를 통해 프론트엔드를 Webview 또는 브라우저 내에서 "핫 리로드"(앱 실행 중 코드 변경 적용)하여 디버깅할 수 있습니다.

실제로 이 연결은 기본적으로 대부분 암호화되거나 인증되지 않습니다.
이는 내장된 Tauri 개발 서버에도 해당되며, 여러분의 프론트엔드와 자산이 로컬 네트워크에 공개됩니다. 또한 이를 통해 공격자는 공격자와 동일한 네트워크 내의 개발 장치에 공격자 자신의 프론트엔드 코드를 푸시할 수 있습니다.
어떤 기능, 내용이 공개되는지에 따라 다르지만, 최악의 경우 장치의 보안 침해로 이어질 수 있습니다.

개발 장치를 안전하게 공개할 수 있는 신뢰할 수 있는 네트워크에서만 개발을 수행해야 합니다.
그것이 불가능한 경우, 개발 서버가 개발 장치와의 연결에 **상호** 인증과 암호화(mTLS 등)를 사용하는지 **절대적으로** 확인하십시오.

> > > 《번역 주》mTLS = mutual Transport Layer Security: 상호 TLS 인증.

:::note[(참고)]
내장된 Tauri 개발 서버는 현재 "상호 인증"과 "전송 암호화"를 지원하지 않으므로 신뢰할 수 없는 네트워크에서는 사용하지 마십시오.
:::

### 개발 머신 강화

자신의 개발 시스템을 강화하는 것에 대해서는 다양한 요인과 개인의 위협 모델에 따라 다르지만, 일반적인 조언으로 다음과 같은 것을 권장합니다:

- 코딩과 같은 일상적인 작업에 관리자 계정을 사용하지 않기
- 개발 머신에서 프로덕션 환경의 비밀 정보를 사용하지 않기
- 비밀 정보를 소스 코드 버전 관리에서 검증하지 않기
- 보안 하드웨어 토큰 등을 사용하여 보안 침해된 시스템의 영향을 완화하기
- 자신의 시스템을 최신 상태로 유지하기
- 설치하는 애플리케이션을 최소한으로 줄이기

더 실용적인 방법에 대한 다양한 정보는 [훌륭한 보안 강화 컬렉션](https://github.com/decalage2/awesome-security-hardening) (영어 사이트)에서 볼 수 있습니다.

물론 자신의 개발 환경을 가상화하여 공격자를 막을 수도 있지만, 그것만으로는 개발 머신만을 대상으로 한 것이 아니라 프로젝트 자체를 대상으로 하는 공격에는 대처할 수 없습니다.

### 소스 관리 인증 및 승인 확실히 시행

대다수의 개발자와 작업하는 경우와 마찬가지로, 소스 코드 버전 관리 도구와 서비스 제공업체를 이용하는 것은 개발 중 필수적인 절차입니다.

소스 코드가 권한 없는 자에 의해 변경되지 않도록 하려면, 소스 코드 버전 관리 시스템의 접근 제어를 이해하고 올바르게 설정하는 것이 중요합니다.

또한 악의적인 커밋이 보안 침해를 받지 않았거나 악의가 없는 기여자에 의한 것으로 오인되는 상황을 방지하기 위해, 모든 (평소의) 기여자에게 커밋에 서명하도록 요청하는 것을 고려하십시오.

## 빌드 시의 위협

현대 시스템 개발에서는 바이너리 결과물을 만들기 위해 "CI/CD"(지속적 통합/지속적 배포)라는 애플리케이션 개발 자동화 프로세스를 사용합니다.

이러한 원격 시스템(및 타사 소유 시스템)에서는 소스 코드나 시크릿에 접근할 수 있고, 생성된 바이너리가 자신의 로컬 코드와 동일한지 검증할 수 있는 형태로 증명할 수 없는 형태로 빌드를 변경할 수 있으므로, 이러한 시스템을 완전히 신뢰할 수 있어야 합니다.
즉, 신뢰할 수 있는 제공업체에 의존하거나, 자신의 관리된 하드웨어에서 이러한 시스템을 호스팅해야 합니다.

Tauri에서는 여러 플랫폼에서 앱을 구축하기 위한 GitHub 워크플로를 제공합니다.
만약 직접 CI/CD를 구축하고 타사 도구에 의존하는 경우, 버전을 명시적으로 고정하지 않은 작업에는 주의하십시오.

배포 대상 플랫폼에 맞게 만든 앱의 바이너리에 서명해야 합니다.
이 방법은 설정이 복잡하고 다소 비용이 들 수 있지만, 최종 사용자는 앱이 공식적으로 여러분으로부터 발행된 것임을 증명하는 증거를 원합니다.

암호화 비밀이 하드웨어 토큰에 적절하게 저장된 경우, 보안 침해된 빌드 시스템에서는 관련 서명 키를 유출할 수 없지만, 악의적인 릴리스 서명에 사용될 수는 있습니다.

### 재현 가능한 빌드

빌드 시 "백도어 주입"(백도어형 공격)에 대항하려면 빌드를 재현 가능하게 만들어야 합니다. 그렇게 하면 자신의 PC에서 빌드했을 때나 다른 독립적인 제공업체에서 빌드했을 때나 빌드 자산이 완전히 동일하다는 것을 검증할 수 있습니다.

첫 번째 문제는 Rust가 완전히 **신뢰할 수 있는** 재현 가능한 빌드를 기본적으로 생성하지 않는다는 것입니다. 이론적으로는 이를 지원하지만, 아직 버그가 있고 최근 릴리스에서는 중단되었습니다.

현재 상황은 Rust 프로젝트의 [공개 버그 트래커](https://github.com/rust-lang/rust/labels/A-reproducibility)에서 추적할 수 있습니다.

다음에 마주칠 문제는 많은 일반적인 프론트엔드 번들러도 재현 가능한 출력을 생성하지 않아, 번들된 자산이 재현 가능한 빌드를 손상시킬 수 있다는 것입니다.

즉, 기본적으로 재현 가능한 빌드에 완전히 의존할 수는 없으며, 안타깝게도 자신의 빌드 시스템을 전적으로 신뢰할 수밖에 없습니다.

## 배포 시의 위협

우리는 앱에 대한 핫 업데이트(재시작 불필요한 업데이트)를 가능한 한 쉽고 안전하게 제공할 수 있도록 최선을 다했습니다.
그러나 매니페스트 서버, 빌드 서버 또는 바이너리 호스팅 서비스의 관리가 불가능하면 모든 것이 무용지물이 됩니다.

직접 시스템을 구축하는 경우, 전문 OPS 아키텍트와 상담하여 적절하게 구축하십시오.

> > > 《번역 주》 OPS = Official Production System(프로덕션 시스템 기술 언어)?

만약 Tauri 앱의 신뢰할 수 있는 배포 서비스를 찾고 있다면, Tauri의 파트너인 CrabNebula가 클라우드 서비스를 제공합니다: [https://crabnebula.dev/cloud](https://crabnebula.dev/cloud)

## 실행 시의 위협

우리는 Webview가 안전하지 않다고 생각하며, 신뢰할 수 없는 사용자 영역 콘텐츠를 로드한다는 관점에서 Webview에서 시스템 API에 대한 접근에 대해 몇 가지 보호 기능을 Tauri에 구현하기로 결정했습니다.

> > > 《번역 주》 **사용자 영역** 운영 체제의 핵심(커널) 이외의 부분. 일반 사용자의 권한으로 조작할 수 있는 영역.

[콘텐츠 보안 정책](/ko/security/csp/)을 사용하면 Webview가 실행할 수 있는 통신 유형을 차단합니다.
또한 [보안 수준](/ko/security/capabilities/) 설정을 통해 신뢰할 수 없는 콘텐츠나 스크립트가 Webview 내의 API에 액세스하는 것을 방지할 수 있습니다.

또한 [Tauri에 정보 제공](/ko/security/#협력적-정보-공개)과 유사한, 취약점을 보고하기 위한 쉽고 안전한 방법을 설정하는 것도 권장합니다.
