DataScience
article thumbnail
Published 2023. 4. 12. 08:25
Tauri 구조 Rust
728x90

Tauri 구조

API (JavaScript / TypeScript)

웹뷰가 백엔드 활동을 호출하고 수신할 수 있도록 프론트엔드 프레임워크로 가져와 cjs  esm JavaScript 끝점을 생성해주는 Typescript 라이브러리입니다. 웹뷰에서 호스트로 메시지를 전달할 때 사용합니다.

 

Bundler (Rust / Shell)

Tauri 앱을 빌드하는 과정에서 감지하거나 플랫폼에 대해 감지하고 알려주는 라이브러리입니다. Tauri 프로젝트 외부에서 사용할 수 있을 것입니다.

 

cli.rs (Rust)

이 Rust 실행 파일은 CLI를 위해 필요로 하는 모든 활동에 대한 전체 인터페이스를 제공합니다.

 

cli.js (JavaScript)

각 플랫폼용 npm 패키지를 만들기 위해 napi-rs를 활용해 cli.rs를 감싼 래퍼입니다.

 

create-tauri-app (JavaScript)

개발 팀이 (미리 구성해둔) 프론트엔드 프레임워크 중 하나를 선택하면 새로운 tauri-apps 프로젝트를 신속하게 스캐폴딩하도록 돕는 도구 묶음입니다.

상위 Crate

Tauri-Apps 조직에서는 Tauri 응용 프로그램의 창를 만들고 관리하는 TAO와 창 안의 웹뷰 인터페이스를 처리하는 두 가지의 상위 Crate를 유지, 관리를 하고 있습니다.

 

TAO

Windows, macOS, Linux, iOS, Android와 같은 모든 주요 플랫폼을 지원하는 교차 플랫폼 창 생성용 Rust 라이브러리입니다. Rust로 작성되었으며 메뉴 표시줄 및 시스템 트레이와 같은 필요에 따라 확장한 winit의 포크(fork) 되었습니다.

 

WRY

Tauri가 사용하는 WRY는 Windows, macOS, Linux와 같은 모든 주요 데스크탑 플랫폼을 지원하는 교차 플랫폼 웹뷰 렌더링 Rust 라이브러리입니다. Tauri는 어떤 웹뷰를 사용할지 (그리고, 어떻게 상호작용할 것인지) 결정해주는 추상화 계층인 WRY를 사용합니다.

 

프로세스 모델

 

다중 프로세스

각 프로세스에 권한을 작업에 필요한 것만 갖도록 최소한으로 부여해 잠재적 취약점의 공격 범위를 제한할 수도 있습니다. 이러한 방식은 최소 권한의 원칙이라고 알려져 있습니다.

 

코어 프로세스

코어의 주된 책임은 그 접근 권한을 사용해 응용 프로그램 창, 시스템 트레이 메뉴, 알림을 만들고 조율하는 것입니다. Tauri는 이를 쉽게 만들기 위해 필요한 교차 플랫폼 추상화를 구현합니다. 또한, 모든 프로세스 간 통신을 코어 프로세스를 거쳐 전달합니다. 그래서 IPC 메시지를 하나의 중심부에서 가로채거나, 조건에 따라 거르거나, 조작할 수 있습니다.

코어 프로세스는 설정이나 데이터베이스 연결 등 전역 상태를 관리하는 책임도 갖습니다. 이것이 창 사이의 상태 동기화를 쉽게 만들고, 프론트엔드에서 업무상 민감한 정보를 캐내려는 시선으로부터 보호합니다.

Tauri의 구현에 Rust를 선택한 것은 Rust의 소유권(Ownership)이 훌륭한 성능을 유지하면서도 메모리 안전성을 보장하기 때문입니다.

그림 1-1: Tauri 프로세스 모델의 단순화된 표현. 하나의 코어 프로세스가 하나 이상의 웹뷰 프로세스를 관리.

웹뷰 프로세스​

운영 체제가 제공하는 웹뷰 라이브러리를 이용하는 웹뷰 프로세스를 돌립니다. 웹뷰는 HTML, CSS, JavaScript를 실행하는 브라우저와 비슷한 환경입니다.

다른 솔루션과 달리 WebView 라이브러리는 최종 실행 파일에 포함되지 않지만 런타임에 동적으로 연결됩니다.(Tauri는 Windows에서 Microsoft Edge WebView2를, macOS에서 WKWebView를, 그리고 Linux에서 webkitgtk를 사용하고 있습니다.) 이로 인해 앱이 꽤나 작아집니다.

 

보안

서버 불필요

Tauri를 사용하면 백엔드와 통신하기 위해 별도의 서버를 사용할 필요 없이 사용자 인터페이스에 웹 기술을 사용하는 애플리케이션을 구축할 수 있습니다.

 

Rust 언어 기능들

메모리 안전성과 속도로 유명한 프로그래밍 언어로 전환함으로써 Tauri는 모든 종류의 기존 공격을 간단하게 없앨 수 있습니다. "해제 후 사용"같은 건 Tauri에서 일어나지 않습니다.

 

동적 선행 시간 컴파일(AOT)

이 컴파일 프로세스는 Tauri 앱의 부트스트랩 단계에서 여러 번 발생하게 됩니다. 우리의 기본 동적 선행 시간 컴파일러를 사용하게 되면, 모든 세션에 대해 고유하고 여전히 기술적으로 정적 코드 단위인 코드 참조를 생성할 수 있습니다.

 

함수의 강화

기능적 주소 공간 레이아웃 무작위화(Functional address Space Layout Randomization) 기술은 런타임에 함수 이름을 무작위로 지정하고 OTP 해싱을 구현할 수 있으므로, 두 세션이 매번 동일하지 않습니다

 

​시스템 특징

UI 혹은 Rust로 사용할 수 있는 API 함수를 고르고 선택할 수 있습니다. API 함수들이 활성화되지 않으면 해당 코드가 앱과 함께 제공되지 않으므로 바이너리 크기와 공격 받을 표면적이 줄어들게 됩니다.

 

Tauri Javascript 프로세스 간 통신

프로세스 간 통신 (IPC)는 격리된 프로세스가 안전하게 통신하도록 합니다.

Tauri에서는 비동기 메시지 전송이라 불리는 특정한 종류의 프로세스 간 통신을 사용하고, 요청  응답 이 간단한 데이터 표현으로 직렬화되어 프로세스 사이를 오갑니다. 

메시지 전송은 받는 이가 올바르지 않은 요청을 거절하거나 무시할 수 있기에 공유 메모리나 직접 함수 접근보다 안전한 기술입니다. 예를 들어, Tauri 코어 프로세스가 요청이 악의적이라 판단하면, 단순히 요청을 무시하고 해당하는 함수를 절대 실행하지 않을 수 있습니다.

 

이벤트

이벤트는 생애 주기 이벤트나 상태 변화 소통 등에 잘 맞는, 보내면 끝인 단방향 IPC 메시지입니다. 명령과 달리, 이벤트는 프론트엔드 그리고 Tauri 코어 양측에서 모두 보낼 수 있습니다.

그림 1-2: 코어에서 프론트엔드로 보내진 이벤트

 

명령

또, 외부 함수 인터페이스와 비슷한 추상화가 IPC 메시지 위에도 제공됩니다. 주된 API, invoke는 브라우저에서 fetch API를 사용하는 것과 비슷하며, 프론트엔드에서 Rust 함수에 인수를 전달해 호출하고 반환값을 받을 수 있습니다.

이 방식이 요청과 응답의 직렬화를 위해 JSON-RPC와 비슷한 통신 규약을 내부적으로 사용하기에, 모든 인수와 반환값은 JSON 직렬화가 가능해야 합니다.

그림 1-3: 명령 호출과 연관된 IPC 메시지

'Rust' 카테고리의 다른 글

Tauri 디버깅  (106) 2023.04.13
Tauri 개발  (31) 2023.04.13
Tauri Project 생성(Sveltekit)  (119) 2023.04.11
TAURI 소개(Electron과 비교) 및 설치  (96) 2023.04.10
Rust 기본 개념  (59) 2023.04.10
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!