mcpField
U
understanding-tauri-process-model

understanding-tauri-process-model

github.com/dchuk開発36170 回インストール40 週間前に更新
リポジトリ

understanding-tauri-process-model について

Tauri アプリ開発者向けのアーキテクチャガイドです。Rust の Core と WebView の連携を説明し、IPC、マルチウィンドウ、プロセス分離、ケイパビリティベースのセキュリティを扱います。

主な機能

  1. 01Core と WebView の役割
  2. 02IPC の要求・応答フロー
  3. 03マルチウィンドウ管理
  4. 04プロセス分離と障害の局所化
  5. 05ケイパビリティベースのアクセス制御
  6. 06フロントエンドとバックエンドの安全対策

活用シーン

  1. 01Rust と WebView の役割分担
  2. 02フロントエンドから Core への IPC の追跡
  3. 03アプリのウィンドウ間での状態共有
  4. 04ウィンドウごとの権限制限

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dchuk/claude-code-tauri-skills --skill understanding-tauri-process-model

インストール後、Claude Code で/understanding-tauri-process-modelを入力して読み込まれたか確認します。

詳細

Tauri のプロセスモデル

Tauri は、Electron や最新の Web ブラウザーに似たマルチプロセスアーキテクチャを採用しています。このモデルを理解することは、安全で高性能な Tauri アプリケーションを構築するうえで不可欠です。

アーキテクチャの概要

+------------------------------------------------------------------+
|                        TAURI APPLICATION                          |
+------------------------------------------------------------------+
|                                                                   |
|  +-----------------------------+                                  |
|  |       CORE PROCESS          |                                  |
|  |         (Rust)              |                                  |
|  |                             |                                  |
|  |  +----------------------+   |                                  |
|  |  | Window Manager       |   |                                  |
|  |  +----------------------+   |                                  |
|  |  | System Tray          |   |                                  |
|  |  +----------------------+   |                                  |
|  |  | Global State         |   |                                  |
|  |  +----------------------+   |                                  |
|  |  | IPC Router           |   |                                  |
|  |  +----------------------+   |                                  |
|  |  | OS Abstractions      |   |                                  |
|  +-------------+---------------+                                  |
|                |                                                  |
|                | IPC (Inter-Process Communication)                |
|                |                                                  |
|     +----------+----------+----------+                            |
|     |          |          |          |                            |
|     v          v          v          v                            |
|  +------+  +------+  +------+  +------+                           |
|  |WebView|  |WebView|  |WebView|  |WebView|                       |
|  |  #1   |  |  #2   |  |  #3   |  |  #N   |                       |
|  +------+  +------+  +------+  +------+                           |
|  | HTML |  | HTML |  | HTML |  | HTML |                           |
|  | CSS  |  | CSS  |  | CSS  |  | CSS  |                           |
|  | JS   |  | JS   |  | JS   |  | JS   |                           |
|  +------+  +------+  +------+  +------+                           |
|                                                                   |
+------------------------------------------------------------------+

コアプロセス

コアプロセスは、アプリケーションのエントリーポイントであり、中核となるハブです。Rust コードを実行し、オペレーティングシステムの機能に排他的にアクセスできます。

役割
役割説明
ウィンドウ管理アプリケーションのウィンドウを作成し、統括します
システム統合システムトレイのメニューや通知を管理します
IPC ルーティングすべてのプロセス間通信を処理します
グローバル状態アプリケーション全体の設定やデータベース接続を管理します
OS 抽象化クロスプラットフォーム API を提供します
コアプロセスに Rust を使う理由

コアプロセスでは、メモリー安全性が保証されるため Rust が使われています。所有権システムによって、次の問題を防げます。

  • NULL ポインターのデリファレンス
  • バッファーオーバーフロー
  • データ競合
  • 解放後使用バグ

コアプロセスはシステム全体にアクセスできるため、これは非常に重要です。

+------------------------------------------+
|            CORE PROCESS                   |
|                                          |
|  Memory Safety via Rust Ownership:       |
|  - No null pointers                      |
|  - No buffer overflows                   |
|  - No data races                         |
|  - No use-after-free                     |
|                                          |
|  Full OS Access:                         |
|  - File system                           |
|  - Network                               |
|  - System APIs                           |
|  - Hardware interfaces                   |
+------------------------------------------+

WebView プロセス

WebView プロセスは、オペレーティングシステム標準の WebView ライブラリを使ってユーザーインターフェイスを描画します。

プラットフォーム固有の WebView
+------------------+------------------+------------------+
|     WINDOWS      |      MACOS       |      LINUX       |
+------------------+------------------+------------------+
|                  |                  |                  |
|  Microsoft Edge  |    WKWebView     |    webkitgtk     |
|    WebView2      |                  |                  |
|                  |                  |                  |
|  Chromium-based  |  Safari engine   |  WebKit engine   |
|                  |                  |                  |
+------------------+------------------+------------------+
         |                  |                  |
         +------------------+------------------+
                           |
                    Dynamic Linking
                    (Not bundled)
                           |
                    Smaller executables
主な特性
  1. 動的リンク:WebView ライブラリはバンドルされず、実行時にリンクされます
  2. Web 技術:HTML、CSS、JavaScript を実行します
  3. フレームワークのサポート:React、Vue、Svelte、Solid などで動作します
  4. 分離:各 WebView は独立したプロセス空間で実行されます

プロセス間通信(IPC)

すべてのプロセス間の通信は、コアプロセスを経由します。

+----------------+                              +----------------+
|   WebView A    |                              |   WebView B    |
|                |                              |                |
|  invoke()  ----+---->+----------------+<------+---- invoke()   |
|                |     |  CORE PROCESS  |       |                |
|  <---- listen  |<----+                +------>|  listen ---->  |
|                |     |  - Validates   |       |                |
+----------------+     |  - Routes      |       +----------------+
                       |  - Filters     |
                       |  - Transforms  |
                       +----------------+
                              |
                              v
                       +----------------+
                       |   OS / System  |
                       |   Resources    |
                       +----------------+
IPC の流れ
  1. WebView がコマンド名とペイロードを指定して invoke() を呼び出します
  2. コアプロセスがメッセージを受信します
  3. コアプロセスがリクエストを検証して処理します
  4. コアプロセスが OS のリソースとやり取りする場合があります
  5. コアプロセスが WebView にレスポンスを返します
例:基本的な IPC

フロントエンド(JavaScript)

import { invoke } from '@tauri-apps/api/core';

// Call a Rust command
const result = await invoke('greet', { name: 'World' });

バックエンド(Rust)

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

マルチウィンドウの処理

1 つのコアプロセスで複数の WebView プロセスを管理します。

                    +-------------------+
                    |   CORE PROCESS    |
                    |                   |
                    |  Shared State:    |
                    |  - User session   |
                    |  - App config     |
                    |  - DB connection  |
                    +-------------------+
                           /|\
                          / | \
                         /  |  \
                        /   |   \
                       /    |    \
                      v     v     v
               +------+ +------+ +------+
               |Main  | |Settings| |About|
               |Window| |Window | |Window|
               +------+ +------+ +------+
ウィンドウ管理のパターン

ウィンドウの作成

use tauri::Manager;

#[tauri::command]
fn open_settings(app: tauri::AppHandle) {
    tauri::WebviewWindowBuilder::new(
        &app,
        "settings",
        tauri::WebviewUrl::App("settings.html".into())
    )
    .title("Settings")
    .build()
    .unwrap();
}

ウィンドウ間通信

use tauri::Manager;

#[tauri::command]
fn broadcast_update(app: tauri::AppHandle, data: String) {
    // Emit to all windows
    app.emit("data-updated", data).unwrap();
}

ウィンドウ固有のイベント

use tauri::Manager;

#[tauri::command]
fn notify_window(app: tauri::AppHandle, window_label: String, data: String) {
    if let Some(window) = app.get_webview_window(&window_label) {
        window.emit("notification", data).unwrap();
    }
}

プロセスの分離とセキュリティ

最小権限の原則

「庭師に生け垣の刈り込みを頼むときは、庭に入る鍵を渡します。家の鍵まで渡すことはありません。」

+------------------------------------------------------------------+
|                     SECURITY BOUNDARIES                           |
+------------------------------------------------------------------+
|                                                                   |
|  +---------------------------+   +---------------------------+    |
|  |      CORE PROCESS         |   |     WEBVIEW PROCESS       |    |
|  |      (Trusted Zone)       |   |    (Untrusted Zone)       |    |
|  +---------------------------+   +---------------------------+    |
|  |                           |   |                           |    |
|  |  - File system access     |   |  - Render UI only         |    |
|  |  - Database connections   |   |  - User input handling    |    |
|  |  - Network requests       |   |  - Display data           |    |
|  |  - Crypto operations      |   |  - Call allowed commands  |    |
|  |  - Secrets management     |   |                           |    |
|  |  - Business logic         |   |  NO DIRECT ACCESS TO:     |    |
|  |                           |   |  - File system            |    |
|  |                           |   |  - Network (direct)       |    |
|  |                           |   |  - System APIs            |    |
|  +---------------------------+   +---------------------------+    |
|                                                                   |
+------------------------------------------------------------------+
プロセス分離によるセキュリティ上の利点
利点説明
クラッシュの封じ込めあるプロセスで障害が発生しても、アプリ全体はクラッシュしません
状態の復旧不正なプロセスを個別に再起動できます
攻撃対象領域の縮小侵害された WebView の機能は制限されます
リソースの保護機密データはコアプロセス内に保持されます
セキュリティのベストプラクティス

フロントエンド(WebView)

  1. すべてのユーザー入力をサニタイズします
  2. シークレットを扱わないでください
  3. ビジネスロジックはコアプロセスに委ねます
  4. コンテンツセキュリティポリシー(CSP)を実装します

バックエンド(コアプロセス)

  1. すべての IPC 入力を検証します
  2. ケイパビリティシステムを使ってコマンドを制限します
  3. 各ウィンドウに最小権限の原則を適用します
ケイパビリティベースのセキュリティ

Tauri はケイパビリティシステムを使い、各ウィンドウがアクセスできるものを制御します。

+------------------+     +------------------+     +------------------+
|   Main Window    |     | Settings Window  |     |  Viewer Window   |
+------------------+     +------------------+     +------------------+
| Capabilities:    |     | Capabilities:    |     | Capabilities:    |
| - read_file      |     | - read_config    |     | - read_file      |
| - write_file     |     | - write_config   |     | (read only)      |
| - network        |     |                  |     |                  |
| - notifications  |     |                  |     |                  |
+------------------+     +------------------+     +------------------+

例:ケイパビリティの設定

{
  "identifier": "main-capability",
  "description": "Capability for the main window",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "fs:read-files",
    "fs:write-files",
    "http:default"
  ]
}

プロセスのライフサイクル

+------------------------------------------------------------------+
|                      APPLICATION LIFECYCLE                        |
+------------------------------------------------------------------+
|                                                                   |
|  1. App Launch                                                    |
|     +------------------+                                          |
|     | Core Process     |  <-- Starts first                        |
|     | Initializes      |                                          |
|     +------------------+                                          |
|              |                                                    |
|              v                                                    |
|  2. Window Creation                                               |
|     +------------------+                                          |
|     | WebView Process  |  <-- Core creates WebViews               |
|     | Spawned          |                                          |
|     +------------------+                                          |
|              |                                                    |
|              v                                                    |
|  3. Running                                                       |
|     +--------+    IPC    +----------+                             |
|     | Core   |<--------->| WebViews |                             |
|     +--------+           +----------+                             |
|              |                                                    |
|              v                                                    |
|  4. Shutdown                                                      |
|     +------------------+                                          |
|     | WebViews close   |  <-- WebViews terminate first            |
|     | Core cleans up   |  <-- Core process exits last             |
|     +------------------+                                          |
|                                                                   |
+------------------------------------------------------------------+

概要

項目コアプロセスWebView プロセス
言語RustJavaScript/TypeScript
数量アプリごとに 1 つアプリごとに 1 つ以上
OS へのアクセス完全なし(IPC 経由のみ)
役割バックエンド、オーケストレーションUI のレンダリング
セキュリティ信頼済み信頼されていない
クラッシュ時の影響アプリが終了ウィンドウが閉じる

Tauri のプロセスモデルは、信頼されたコアプロセスと脆弱性を含む可能性のある WebView プロセスを厳格に分離し、デスクトップアプリケーションを構築するための安全な基盤を提供します。すべての機密性の高い操作はコアプロセスに実装し、WebView はプレゼンテーション層としてのみ機能させる必要があります。

コメント