본문으로 건너뛰기

ADR-005: Tauri v2 거버넌스

날짜: 2026-03-08 상태: Accepted 결정자: Maekon maintainer 관련: ADR-004: Tauri v2 마이그레이션 | ADR-006: IPC Command 계약


배경

MAEKON 은 생산성 에이전트를 위한 크로스플랫폼 데스크톱 셸을 필요로 합니다. 이 셸은 다음 요구사항을 충족해야 합니다.

  1. 두 번째 UI 코드베이스를 만들지 않고 기존 React 웹 대시보드를 그대로 렌더링.
  2. 네이티브 시스템 통합 제공 — 시스템 트레이, 데스크톱 알림, 자동 시작.
  3. 엔터프라이즈 배포에 적합한 작고 감사 가능한 바이너리 생성.
  4. macOS notarization 과 Windows code signing 지원.
  5. Rust 백엔드와 JavaScript 프론트엔드 사이의 안전하고 감사 가능한 IPC 표면 노출.

이전 GUI 는 immediate-mode GUI 라이브러리 iced (crate maekon-ui) 로 구현되어 있었으며, ADR-004 에서 교체되었습니다.


결정

데스크톱 셸로 Tauri v2 를 사용합니다.

  • UI 렌더러: WKWebView (macOS), WebView2 (Windows), WebKitGTK (Linux).
  • 백엔드: Rust (src-tauri/), 기존 Cargo 워크스페이스 공유.
  • IPC: 강타입 Rust ↔ JavaScript 호출을 위한 tauri::command 매크로.
  • 시스템 트레이: tauri::tray API.
  • 알림: tauri-plugin-notification.
  • 자동 업데이트: semver 게이팅 + 서명 검증을 적용한 tauri-plugin-updater.

검토된 대안

대안거부 이유
iced 유지Immediate-mode 렌더링은 복잡한 데이터 시각화(타임라인, 히트맵)에서 성능이 저하됨. 두 개의 UI(iced + React)를 유지하면 프론트엔드 비용이 두 배.
Electron~60 MB 바이너리 vs Tauri 의 ~5 MB. Electron 은 자체 Chromium 을 동봉해 attack surface 를 늘리고 엔터프라이즈 바이너리 크기 예산을 초과.
Raw winit + wgpuWebView 통합 부재. 기존 React 대시보드를 처음부터 다시 구현해야 함.
eguiiced 와 동일한 한계 — immediate-mode, WebView 부재, 데이터 시각화 지원 제한.

결과

긍정

  • 단일 UI 코드베이스(React) — 기존 crates/maekon-web/frontend/ 를 수정 없이 재사용.
  • 시스템 WebView (WKWebView / WebView2) 를 통한 크로스플랫폼 렌더링 일관성.
  • 바이너리 크기 약 5 MB(Rust 바이너리) + WebView(시스템 제공). Chromium 동봉 없음.
  • 표준 Apple Developer ID 워크플로우로 macOS notarization 지원.
  • 표준 Authenticode 워크플로우로 Windows code signing 지원.
  • Tauri 의 CSP 강제 적용이 IPC 보안의 강력한 기본값을 제공 (ADR-006 참조).

부정 / 리스크

  • WKWebView 버전 의존성: macOS 업데이트가 WKWebView 동작을 변경할 수 있음. tauri.conf.json 의 최소 macOS 버전은 10.15 로 설정. macOS 메이저 업데이트 후 Tauri 릴리스 노트 모니터링 필요.
  • Windows 의 WebView2: WebView2 런타임이 반드시 존재해야 함. 인스톨러는 미설치 머신을 위해 WebView2 부트스트래퍼를 동봉.
  • Tauri IPC 학습 곡선: 기여자가 invoke_handler! 등록 패턴과 allowlist 모델을 이해해야 함. ADR-006 참조.
  • WebView 메모리 오버헤드: WebView 프로세스 런타임 메모리 약 50 MB. 단순 레이아웃의 iced 와 비교 시 거의 0 에 가까웠음.

업데이트 정책

Minor 릴리스 (x.Y.z)

Tauri minor 릴리스는 발행 후 30 일 이내에 따라갑니다. Minor 릴리스는 IPC 계약을 깨지 않으면서 기능을 추가하고 버그를 수정합니다.

절차:

  1. src-tauri/Cargo.tomltauri 버전 업데이트.
  2. cargo check --workspace + cargo test --workspace 실행.
  3. tauri.conf.json schema URL 이 최신인지 확인.
  4. 머지 전 전체 CI 파이프라인 실행.

Patch 릴리스 (x.y.Z)

보안 패치는 발행 후 7 일 이내에 적용합니다. CVE 가 태깅된 패치는 지연 금지.

Major 릴리스 (X.y.z)

Tauri major 릴리스는 케이스별로 평가합니다. Tauri major 버전을 채택하기 전에 신규 ADR 작성이 필수입니다. 평가 기준:

  • IPC 계약 호환성 (ADR-006 versioning 정책 참조).
  • 기존 command 에 영향을 주는 WebView API 변경.
  • macOS notarization / Windows signing 워크플로우 영향도.
  • 플러그인 API 안정성 (tauri-plugin-notification, tauri-plugin-updater).

보안 모델

Tauri v2 는 src-tauri/tauri.conf.json 에 설정된 Content Security Policy 를 강제합니다.

"security": {
"csp": "default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self' http://127.0.0.1:10090; object-src 'none'; base-uri 'self'",
"dangerousDisableAssetCspModification": false
}

핵심 사항:

  • script-src 'self': 애플리케이션과 함께 번들된 스크립트만 실행 가능. 인라인 스크립트, 외부 CDN 스크립트 모두 차단.
  • connect-src 'self' http://127.0.0.1:10090: 프론트엔드는 임베디드 자산과 로컬 Axum 웹 서버에만 fetch 가능. WebView 의 임의 외부 연결 차단.
  • object-src 'none': 플러그인 객체(Flash 등) 차단.
  • dangerousDisableAssetCspModification: false: 프론트엔드가 CSP 를 변경하려 해도 Tauri 가 강제 유지.

IPC 표면은 명시적으로 등록된 command 로 한정됩니다. 전체 command 계약은 ADR-006 참조.


거버넌스 책임

책임담당
Tauri minor/patch 업데이트엔지니어링 리드
Tauri major 버전 평가아키텍처 리뷰 (신규 ADR 필수)
CSP 정책 변경머지 전 보안 리뷰 필수
IPC 표면 확장아키텍처 리뷰 (ADR-006 업데이트 필수)
macOS notarization 자격 증명DevOps / 릴리스 엔지니어링
Windows 서명 인증서DevOps / 릴리스 엔지니어링