understanding-tauri-process-model について
Tauri アプリ開発者向けのアーキテクチャガイドです。Rust の Core と WebView の連携を説明し、IPC、マルチウィンドウ、プロセス分離、ケイパビリティベースのセキュリティを扱います。
主な機能
- 01Core と WebView の役割
- 02IPC の要求・応答フロー
- 03マルチウィンドウ管理
- 04プロセス分離と障害の局所化
- 05ケイパビリティベースのアクセス制御
- 06フロントエンドとバックエンドの安全対策
活用シーン
- 01Rust と WebView の役割分担
- 02フロントエンドから Core への IPC の追跡
- 03アプリのウィンドウ間での状態共有
- 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
主な特性
- 動的リンク:WebView ライブラリはバンドルされず、実行時にリンクされます
- Web 技術:HTML、CSS、JavaScript を実行します
- フレームワークのサポート:React、Vue、Svelte、Solid などで動作します
- 分離:各 WebView は独立したプロセス空間で実行されます
プロセス間通信(IPC)
すべてのプロセス間の通信は、コアプロセスを経由します。
+----------------+ +----------------+
| WebView A | | WebView B |
| | | |
| invoke() ----+---->+----------------+<------+---- invoke() |
| | | CORE PROCESS | | |
| <---- listen |<----+ +------>| listen ----> |
| | | - Validates | | |
+----------------+ | - Routes | +----------------+
| - Filters |
| - Transforms |
+----------------+
|
v
+----------------+
| OS / System |
| Resources |
+----------------+
IPC の流れ
- WebView がコマンド名とペイロードを指定して
invoke()を呼び出します - コアプロセスがメッセージを受信します
- コアプロセスがリクエストを検証して処理します
- コアプロセスが OS のリソースとやり取りする場合があります
- コアプロセスが 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)
- すべてのユーザー入力をサニタイズします
- シークレットを扱わないでください
- ビジネスロジックはコアプロセスに委ねます
- コンテンツセキュリティポリシー(CSP)を実装します
バックエンド(コアプロセス)
- すべての IPC 入力を検証します
- ケイパビリティシステムを使ってコマンドを制限します
- 各ウィンドウに最小権限の原則を適用します
ケイパビリティベースのセキュリティ
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 プロセス |
|---|---|---|
| 言語 | Rust | JavaScript/TypeScript |
| 数量 | アプリごとに 1 つ | アプリごとに 1 つ以上 |
| OS へのアクセス | 完全 | なし(IPC 経由のみ) |
| 役割 | バックエンド、オーケストレーション | UI のレンダリング |
| セキュリティ | 信頼済み | 信頼されていない |
| クラッシュ時の影響 | アプリが終了 | ウィンドウが閉じる |
Tauri のプロセスモデルは、信頼されたコアプロセスと脆弱性を含む可能性のある WebView プロセスを厳格に分離し、デスクトップアプリケーションを構築するための安全な基盤を提供します。すべての機密性の高い操作はコアプロセスに実装し、WebView はプレゼンテーション層としてのみ機能させる必要があります。