Skip to content

Commit 7ad4262

Browse files
J1-takaivasfvitor
andauthored
i18n(ja): Add Japanese texts for Concept section (tauri-apps#3197)
Co-authored-by: Ayres Vitor <[email protected]>
1 parent 0100420 commit 7ad4262

File tree

12 files changed

+1456
-16
lines changed

12 files changed

+1456
-16
lines changed

public/d2/docs/ja/concept/Inter-Process Communication/index-0.svg

Lines changed: 191 additions & 0 deletions
Loading

public/d2/docs/ja/concept/Inter-Process Communication/index-1.svg

Lines changed: 194 additions & 0 deletions
Loading

public/d2/docs/ja/concept/architecture-0.svg

Lines changed: 198 additions & 0 deletions
Loading

public/d2/docs/ja/concept/process-model-0.svg

Lines changed: 197 additions & 0 deletions
Loading
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
title: ブラウンフィールド型(Brownfield Pattern)
3+
i18nReady: true
4+
---
5+
6+
_**デフォルトの IPC パターンです**_
7+
8+
このパターンは、Tauri を使用する上で最も明快で分かりやすいものです。というのも、既存のフロントエンド・プロジェクトと可能な限り互換性を持たせようとしているからです。手短に言えば、既存の Web フロントエンドがブラウザー内で使用するもの以外には、他に何も必要としないようになっているということです。
9+
ただ、これは既存のブラウザー・アプリケーションで動作する _**すべて**_ が、そのまま動作するというわけではありません。
10+
11+
一般的な「ブラウンフィールド」型のソフトウェア開発について馴染みがない場合は、Wikipedia の記事 [Brownfield Wikipedia article](日本語版なし)に判りやすい概説があります。
12+
Tauri の場合、(ブラウンフィールド型開発の対象となる)既存のソフトウェアとは、レガシー・システムではなく、現行ブラウザーのサポートと動作です。
13+
14+
## 設定
15+
16+
ブラウンフィールド型開発はデフォルトのパターンなので、設定オプションを指定する必要はありません。
17+
明示的に設定するには、`tauri.conf.json` 構成ファイル内の `tauri > pattern` オブジェクトを使用します。
18+
19+
```json
20+
{
21+
"tauri": {
22+
"pattern": {
23+
"use": "brownfield"
24+
}
25+
}
26+
}
27+
```
28+
29+
_**ブラウンフィールド型では追加の設定オプションはありません。**_
30+
31+
[brownfield wikipedia article]: https://en.wikipedia.org/wiki/Brownfield_(software_development)
32+
33+
<div style="text-align:right">
34+
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】<br />
35+
Doc-JP 2.00.00
36+
</div>
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
---
2+
title: プロセス間通信
3+
sidebar:
4+
label: Overview
5+
order: 1
6+
i18nReady: true
7+
---
8+
9+
import { CardGrid, LinkCard } from '@astrojs/starlight/components';
10+
11+
「プロセス間通信 Inter-Process Communication」(IPC)は、単独のプロセスが安全に通信することを可能にし、より複雑なアプリケーションを構築するための鍵となります。
12+
13+
具体的な「プロセス間通信(IPC)」の型(パターン)については、次の説明内容を参照してください:
14+
15+
<CardGrid>
16+
<LinkCard
17+
title="Brownfield<br>ブラウンフィールド型"
18+
href="/ja/concept/inter-process-communication/brownfield/"
19+
/>
20+
<LinkCard
21+
title="Isolation<br>アイソレーション型"
22+
href="/ja/concept/inter-process-communication/isolation/"
23+
/>
24+
</CardGrid>
25+
26+
Tauri は、[Asynchronous Message Passing](非同期メッセージ・パッシング、[日本語版リンク](<https://ja.wikipedia.org/wiki/メッセージ_(コンピュータ)>))と呼ばれる特別なスタイルのプロセス間通信を使用します。この方法では、プロセス同士が単純なデータ表現を使用してシリアル化された「_リクエスト_(要求)」と「_レスポンス_(応答)」をやり取りします。メッセージ・パッシングは、インターネット上のクライアント・サーバー通信に使用される仕組みであるため、Web 開発の経験がある人なら誰でも馴染みがあるはずです。
27+
28+
また、メッセージ・パッシングは受信者が必要に応じて「リクエスト」を拒否または破棄できるため、「共有メモリ方式」や「直接関数アクセス方式」よりも安全な手法です。たとえば、Tauri コア・プロセスが「リクエスト」を悪意のあるものと判断した場合、そのリクエストは破棄され、対応する関数処理は実行されません。
29+
30+
以下では、Tauri の二つの「IPC プリミティブ(同期基本命令)」、すなわち「イベント `Events` 」と「コマンド `Commands` 」について詳しく説明します。
31+
32+
## イベント
33+
34+
「イベント」は、自動追尾型・一方向性の「IPC メッセージ」で、ライフサイクル中の各イベントと状態の変化を伝達するのに最適です。
35+
[コマンド](#コマンド)」とは異なり、「イベント」はフロントエンドと Tauri Core(コア部)の両方から発行できます。
36+
37+
<figure>
38+
39+
```d2 sketch pad=50
40+
shape: sequence_diagram
41+
42+
Frontend: {
43+
shape: rectangle
44+
label: "Webview\nFrontend"
45+
}
46+
Core: {
47+
shape: rectangle
48+
label: "Core\nBackend"
49+
}
50+
51+
Frontend -> Core: "イベント"{style.animated: true}
52+
Core -> Frontend: "イベント"{style.animated: true}
53+
```
54+
55+
<figcaption>コア部と Webview 間でやり取りされるイベント</figcaption>
56+
</figure>
57+
58+
## コマンド
59+
60+
Tauri は、また、「IPC メッセージ」に加えて、[foreign function interface](外部関数インターフェース、[日本語版リンク](https://ja.wikipedia.org/wiki/Foreign_function_interface))のような抽象化も提供します[^1]。基本主要 API である `invoke` は、ブラウザの `fetch` API に似ており、フロントエンドが Rust 関数を呼び出し、引数を渡して、データを受信できるようにします。
61+
62+
このメカニズムは、内部で [JSON-RPC] のようなプロトコルを使用してリクエストとレスポンスをシリアル化するので、すべての引数と戻り値データは JSON の規格に従ってシリアル化可能である必要があります。
63+
64+
<figure>
65+
66+
```d2 sketch pad=50
67+
shape: sequence_diagram
68+
69+
70+
Frontend: {
71+
label: "Webview\nFrontend"
72+
}
73+
74+
Core: {
75+
label: "Core\nBackend"
76+
}
77+
InvokeHandler: {
78+
label: "Invoke\nHandler"
79+
}
80+
81+
Frontend -> Core: "IPC リクエスト"{style.animated: true}
82+
Core -> InvokeHandler: "コマンド 呼び出し"{style.animated: true}
83+
InvokeHandler -> Core: "戻り値 シリアル化"{style.animated: true}
84+
Core -> Frontend: "レスポンス"{style.animated: true}
85+
```
86+
87+
<figcaption>コマンド呼び出しに関与する IPC メッセージ</figcaption>
88+
</figure>
89+
90+
[^1]: コマンドは、内部ではメッセージ・パッシングを使用しているため、実際の「外部関数インターフェース(FFI)」と同じようなセキュリティ上の落とし穴はありません。
91+
92+
[Asynchronous Message Passing]: https://en.wikipedia.org/wiki/Message_passing#Asynchronous_message_passing
93+
[json-rpc]: https://www.jsonrpc.org
94+
[foreign function interface]: https://en.wikipedia.org/wiki/Foreign_function_interface
95+
96+
<div style="text-align:right">
97+
【※ この日本語版は、「Feb 22, 2025 英語版」に基づいています】
98+
<br />
99+
Doc-JP 2.00.00
100+
</div>
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
---
2+
title: アイソレーション型(Isolation Pattern)
3+
i18nReady: true
4+
---
5+
6+
アイソレーション(分離・隔絶)型は、フロントエンドから送信された Tauri API メッセージが Tauri コア部に到達する前に、JavaScript を使用して傍受・変更する方法です。アイソレーション型で挿入される安全な JavaScript コードは、アイソレーション型アプリケーションと呼ばれます。
7+
8+
## アイソレーション型の必要性
9+
10+
アイソレーション型の目的は、Tauri コア部への望ましくないあるいは悪意のあるフロントエンドからの呼び出しから、アプリケーションを保護するための仕組みを開発者に提供することです。アイソレーション型が必要となったのは、フロントエンドで実行される信頼できないコンテンツから生じる脅威に対応するために生まれました。このような脅威は多くの依存関係を持つアプリケーションによくあるケースです。アプリケーションが遭遇する可能性のある多くの脅威源のリストについては、[セキュリティ:脅威モデル] を参照してください。
11+
12+
上記の最大の脅威モデルは「開発時の脅威」でしたが、このような脅威は、アイソレーション型を設計する際に念頭に置かれていたものです。多くのフロントエンドのビルド・ツールが、しばしば深くネスト化された数十(もしくは数百)の依存関係で成り立っているだけではなく、複雑なアプリケーション側にも、数多くの(こちらもしばしば深くネスト化された)依存関係があり得るので、最終出力版にバンドルされるのです。
13+
14+
## アイソレーション型を使用する局面
15+
16+
Tauri は、アイソレーション型が使用できる場合には常に使用することを強く推奨しています。アイソレーション型のアプリケーションではフロントエンドからの _**すべての**_ メッセージを「捕捉」(インターセプト)するため、アイソレーション型が _常に_ 使用されます。
17+
18+
さらに Tauri では、外部の Tauri API を使用するときは常に、アプリケーションを「封鎖」(ロックダウン)することを強く推奨しています。アプリの開発者は、安全なアイソレーション型アプリケーションを利用して IPC 入力を検証し、その入力内容が確実に想定されるパラメータの範囲内にあることを確かめます。事例としては、ファイルの読み取りまたは書き込みの呼び出しが、そのアプリケーションの想定外の場所へのパスにアクセスしようとしていないかを確認したり、あるいは、Tauri API の「HTTP フェッチコール」が 「Origin ヘッダー」にそのアプリケーションが想定しているもののみを設定しているかを確認したりすることです。
19+
20+
とはいえ、フロントエンドからの _**すべての**_ メッセージを捕捉するため、常時動作 API、たとえば [Events] など、でも動作します。一部のイベントでは、アプリ独自の Rust コードにアクションを実行させる可能性があるので、それにも同様の検証手法で対応することができます。
21+
22+
## アイソレーション型の適用
23+
24+
アイソレーション型で重要なのは、フロントエンドと Tauri Core(タウリ・コア部)との間に安全なアプリケーションを挿入して、IPC 受信メッセージを捕捉し修正することです。これには、`<iframe>` のサンドボックス機能(隔離機能)を使用して、メインのフロントエンド・アプリケーションと並行して JavaScript を安全に実行することで実現します。Tauri は、ページの読み込み中にアイソレーション型を発動し、Tauri Core に対するすべての IPC 呼び出しを、直接ではなく、サンドボックス化(隔離化)されたアイソレーション型アプリケーション経由で行なうように強制的にルートを切り替えます。Tauri Core に渡されるメッセージの準備が整うと、メッセージはブラウザ実装の [SubtleCrypto] を使用して暗号化され、メインのフロントエンド・アプリケーションに返されます。
25+
フロントエンドに戻されるとすぐに、メッセージは直接 Tauri Core に渡され、そこで通常どおりに復号化されて読み取られます。
26+
27+
誰かがアプリケーションの特定のバージョンのキーを手動で読み取り、暗号化後にそのキーを用いてメッセージの変更を行なえないことを確実にするために、アプリケーションが実行されるたびに新しいキーが生成されます。
28+
29+
### IPC メッセージのおおよその手順
30+
31+
動作の流れを判りやすくするために、アイソレーション型の IPC メッセージが Tauri Core に送信されるときに実行されるおおよその手順を、順序付きリストで以下に示します:
32+
33+
1. Tauri の IPC ハンドラーがメッセージを受け取ります
34+
2. IPC ハンドラー → アイソレーション型アプリケーション
35+
3. `[sandbox]` アイソレーション型アプリケーションのフックが実行され、メッセージの変更を行なう可能性があります。
36+
4. `[sandbox]` メッセージは「実行時に生成されるキー」を使用して AES-GCM で暗号化されます
37+
5. `[encrypted]` アイソレーション型アプリケーション → IPC ハンドラー
38+
6. `[encrypted]` IPC ハンドラー → Tauri Core
39+
40+
_注記: 矢印(→)は、メッセージ・パッシング(受け渡し)を示します。_
41+
42+
### パフォーマンスへの影響
43+
44+
安全なアイソレーション型アプリケーションは、メッセージの暗号化が行なわれるため、何も行なわない場合ですら [ブラウンフィールド型] と比較して追加のオーバーヘッド・コストが発生します。(適切なパフォーマンスを維持するために、慎重に保守され依存関係も少ないであろう)パフォーマンス重視のアプリケーションを除けば、ほとんどのアプリケーションは比較的小型で AES-GCM 暗号化方式も比較的高速であるため、IPC メッセージの暗号化/復号化の実行時コストを意識する必要はありません。もし AES-GCM について馴染みがないとしても、ここで関連するのは、それが [SubtleCrypto] に含まれる唯一の認証モード・アルゴリズムであり、おそらく「[TLS][transport_layer_security] 暗号化プロトコル」の内部で既に毎日使用しているということだけです。
45+
46+
Tauri アプリケーションが起動されるたびに一度、暗号化された安全なキーも生成されますが、システムがすでに十分なエントロピー(ランダム性)を備えていて、即座に十分な乱数を返すのであれば、この処理には通常気付きません。これは「デスクトップ環境」では極めて一般的です。「ヘッドレス環境」で [WebDriver との統合テスト] などを実行する場合で、オペレーティング・システムにエントロピー生成サービス《訳注: 「乱数生成」機能》が含まれていない場合には、`haveged` などの何らかのエントロピー生成サービスをインストールすることをお勧めします。<sup>Linux 5.6 (March 2020) 版から、投機的実行によるエントロピー生成が含まれるようになりました。</sup>
47+
48+
### 制限事項
49+
50+
アイソレーション型には、プラットフォームとの不整合から生じる制限事項がいくつかあります。最も重大な制限は、Windows 上のサンドボックス化された `<iframes>` 内に外部ファイルが正しく読み込まれないことによるものです。このため、アイソレーション型アプリケーションに関連するスクリプトの内容を取得してインラインに挿入する、ビルド時の簡単なスクリプト・インライン化手順を実装しました。つまりこれは、`<script src="index.js"></script>` のようなファイルの典型的なバンドル、あるいは単純な挿入は依然として正常に機能しますが、ES Modules(ECMAScript Modules)などの新しいメカニズムは上手く読み込ま**ない**ということを意味します。
51+
52+
## 推奨事項
53+
54+
アイソレーション型アプリケーションの目的は開発時の脅威から保護することであるため、アイソレーション型アプリケーションはできる限り簡素化しておくことを強くお勧めします。依存関係を最小限に抑えるよう努めるだけでなく、必要なビルド手順を最小限に抑えることを検討する必要もあります。これにより、フロントエンド・アプリケーションを覆っているアイソレーション型アプリケーションへのサプライ・チェーン攻撃には心配する必要がなくなります。
55+
56+
## アイソレーション型アプリケーションの作成
57+
58+
次の例では、小さな「hello-world」のようなアイソレーション型アプリケーションを作成し、それを仮に既存の Tauri アプリケーションに接続することを想定します。このアプリでは、通過するメッセージの検証は行なわれず、WebView コンソールに内容が出力されるだけです。
59+
60+
この事例の目的のため、`tauri.conf.json` と同じディレクトリにあると仮定します。既存の Tauri アプリケーションの `distDir``../dist` に設定されています。
61+
62+
`../dist-isolation/index.html`:
63+
64+
```html
65+
<!doctype html>
66+
<html lang="en">
67+
<head>
68+
<meta charset="UTF-8" />
69+
<title>Isolation Secure Script</title>
70+
</head>
71+
<body>
72+
<script src="index.js"></script>
73+
</body>
74+
</html>
75+
```
76+
77+
`../dist-isolation/index.js`:
78+
79+
```javascript
80+
window.__TAURI_ISOLATION_HOOK__ = (payload) => {
81+
// 何も検証や修正せず、ただ hook から内容を印字するだけです。
82+
console.log('hook', payload);
83+
return payload;
84+
};
85+
```
86+
87+
あとは、アイソレーション型を使用するように `tauri.conf.json`[設定](#設定) を変更し、ブート処理経路を [ブラウンフィールド型] からアイソレーション型に切り替えるだけです。
88+
89+
## 設定
90+
91+
メインのフロントエンド `distDir``../dist` に設定されていると仮定します。また、アイソレーション型アプリケーションを `../dist-isolation` に出力します。
92+
93+
```json
94+
{
95+
"build": {
96+
"distDir": "../dist"
97+
},
98+
"app": {
99+
"security": {
100+
"pattern": {
101+
"use": "isolation",
102+
"options": {
103+
"dir": "../dist-isolation"
104+
}
105+
}
106+
}
107+
}
108+
}
109+
```
110+
111+
[transport_layer_security]: https://ja.wikipedia.org/wiki/Transport_Layer_Security
112+
[セキュリティ:脅威モデル]: /ja/security/lifecycle/
113+
[events]: /ja/reference/javascript/api/namespaceevent/
114+
[subtlecrypto]: https://developer.mozilla.org/ja-JP/docs/Web/API/SubtleCrypto
115+
[ブラウンフィールド型]: /ja/concept/inter-process-communication/brownfield/
116+
[WebDriver との統合テスト]: /ja/develop/tests/webdriver/
117+
118+
<div style="text-align:right">
119+
[※ この日本語版は、「Feb 22, 2025 英語版」に基づいています]<br />
120+
Doc-JP 2.00.00
121+
</div>

0 commit comments

Comments
 (0)