PDF、PPT、請求書などを表示する洗練された UI を展開する際、通常は美観、レスポンシブ対応、ロード時間に注目します。しかし、見落としがちなのは ドキュメントがサーバーからユーザーのブラウザへどのように転送されるか です。たった一つのミスステップが、堅実なアプリケーションをデータ漏洩のベクターに変えてしまうことがあります。
本ガイドでは、プライバシー重視のドキュメントビューアを統合する際に、すぐに組み込める7つのセキュリティ志向機能を解説します。このチェックリストは、余計な複雑さを加えずに埋め込みを強化したいフロントエンドエンジニア向けに書かれています。
1. ドキュメントストリームのエンドツーエンド暗号化
なぜ重要か
HTTPS でファイルを配信していても、破損したブラウザ拡張機能や悪意あるスクリプトがレスポンスを読み取って生のドキュメントを取得できる可能性があります。
実装方法
| ステップ | アクション |
|---|---|
| サーバー側暗号化 | ファイルを保存またはストリーミングする前に暗号化します(AES‑256‑GCM が堅実な選択です)。 |
| 転送セキュリティ | 暗号化されたブロブを TLS 1.3(トランスポート層セキュリティ 1.3) で配信します。 |
| クライアント側復号 | 暗号化ストリームを受け取り、メモリ内で復号し、平文を直接ビューアのキャンバスに供給する Webワーカー を起動します。 |
| キーを決して公開しない | 復号キーを短命なサーバー生成トークンに保持します(Feature #4 を参照)。 |
ビューアがレンダリングする時点で、ドキュメントはネットワーク上でもメインスレッド上でも平文として露出していません。
2. コンテンツセキュリティポリシー (CSP) のホワイトリスト化
リスク
緩い CSP は、攻撃者が悪意あるスクリプトを注入したり、ビューアのキャンバスデータを読み取ることができる不正リソースをロードしたりする余地を与えてしまいます。
Key points
- ‘unsafe‑inline’ と ‘unsafe‑eval’ はスクリプトで禁止されます。
- ビューアの CDN(またはセルフホストされたバンドル)のみが JavaScript を提供できるようにします。
- フレームは信頼できるビューアドメインに制限されます。
厳格な CSP は、埋め込みページの攻撃対象面を大幅に削減します。
3. iframe サンドボックスによる同一オリジン分離
なぜサンドボックスか?
CSP だけでも、侵害されたページがビューアの DOM にアクセスしようとする可能性があります。隔離された <iframe> は、ホストページが明示的な許可なしに突破できない セキュリティケージ を作ります。
回避すべきサンドボックスフラグ
allow-top-navigation– ビューアがトップレベルウィンドウをハイジャックするのを防ぎます。allow-popups– フィッシングに利用され得る予期しないポップアップをブロックします。
ビューアが親ページと通信する必要がある場合(例: UI 同期)、明示的なオリジンチェックを伴う postMessage(ポストメッセージ) を使用してください。
4. トークンベースのアクセス制御
直接URLの問題
公開された静的 URL は、リンクを入手した誰でも永遠にファイルをダウンロードできてしまいます。
トークンはサーバー側で署名されているため、改ざんがあればリクエストは無効となり、ビューアは読み込みを拒否します。
5. ウォーターマーキングと動的オーバーレイ
目的
クライアント側で動的に生成される透かしは、元ファイルを変更せずに責任追跡層を追加します。
実装のヒント
- PDFページの上に配置された canvas overlay(キャンバスオーバーレイ) に透かしを描画します。
- セッションのメールアドレスまたはランダムな UUID を使用し、各ビューアインスタンスを一意にします。
- シンプルなフラグでオーバーレイを切り替え、パフォーマンス負荷を最小限に抑えます。
漏洩したドキュメントが見つかった場合、埋め込まれた識別子が直接発信元を指し示します。
6. ダウンロードと印刷の制限
ブラウザのデフォルト
ほとんどのブラウザは右クリックメニューでキャンバスを画像として保存できるため、実質的にページをエクスポートできます。
ビューアができることとできないこと
ドキュメントビューア SDK はツールバーからエクスポートアクションを隠すことができますが、Doconut の機能カタログにはブラウザ印刷や PDF エクスポートが提供されるかどうかのオプションが列挙されています。インストールするビルドのドキュメントでオプション名を確認してください。バージョン間で設定キーが変わるため、記事(本稿を含む)だけで判断しないでください。
より重要なのは、ツールバー設定だけでカバーできない部分です。ボタンを非表示にするのは UI の選択であり、アクセス制御ではありません。サーバーはページ、サムネイル、エクスポート、ダウンロード、印刷の各リクエストを個別に認可し続ける必要があります。ピクセルが画面に表示された瞬間、スクリーンショット、カメラ、アクセシビリティツールが存在するため、完全に防げるビューアは存在しません。
7. 監査ログとイベントフック
可視性の価値
どんなに堅牢なビューアでも悪用される可能性があります。誰が、いつ、どのドキュメントを開き、どのような操作を行ったかを記録することで、法医学的なトレイルが残ります。
リアルタイムのログを活用すれば、数秒で多数の機密 PDF を開く単一ユーザーといった異常パターンを検知し、アラートや権限剥奪をトリガーできます。
結論
ドキュメントビューアの埋め込みは UI の問題だけでなく、セキュリティ上の責任でもあります。ドキュメントストリームの暗号化、厳格な Content‑Security‑Policy(コンテンツセキュリティポリシー)、隔離された iframe sandbox(iframe サンドボックス)、トークンベースのアクセス、動的透かし、エクスポート制限を UX として扱うこと、そして 監査ログ が、守れる埋め込みと守れない埋め込みを分ける要素です。
これら七つのうち二つは、どのビューアを選んでも必ず自分で実装しなければならない要素です:認可と監査。テナンシーの決定権を奪うコンポーネントは存在しません。
埋め込み構築の準備はできましたか?
- インストールするバージョンのベンダー公式ドキュメントから始める。 Doconut については doconut.com — パッケージ、セットアップガイド、サンプルがあります。記事から設定キーをコピーすると、アップグレード時に統合が壊れる原因になります。
- プルリクエストテンプレートに七つのチェックリストを入れることで、マージ前にセキュリティレビューが行われ、インシデント後ではなく事前に対策できます。
- まずはネガティブケースをテストする: 他テナントのドキュメント識別子、期限切れセッション、ページやエクスポートエンドポイントへの直接リクエスト。これらのテストが実際の脆弱性を見つけ出します。
