トップ›実践編›第8章
実践編第8章

点検の準備:自分のアプリの全体図を描く

読む目安:約40分データの流れと信頼境界を、A4一枚の図にする

実践編では、あなたが公開しているアプリを自分の手で点検します。最初の一歩はコードを読むことではありません。紙とペンで、アプリの全体図を描くことです。どこに何があり、データがどう流れ、どこから先が「信用できない世界」なのかが見えれば、以降5つの演習で何を見ればよいかが決まります。

この章の学習目標

  • 自分のアプリの登場人物、画面、サーバー処理、データベース、外部サービス、秘密情報を、1枚のデータフロー図に描けるようになる
  • 「信頼境界」の考え方を理解し、ブラウザ側の処理を信用してはいけない理由を説明できるようになる
  • 自分のアプリが預かっている「資産」を棚卸しし、漏れたら誰が困るかを言葉にできるようになる

なぜ最初に図を描くのか

内部統制の整備を思い出してください。最初にやるのは業務フロー図の作成です。どこで証憑が発生し、誰が承認し、どの段階にリスクがあるか。それを図にしてから、統制(チェックや承認)を置く場所を決めます。フローが分からないまま「とりあえずダブルチェック」を増やしても、肝心の場所が抜けます。

セキュリティも同じ順番です。専門家はこの作業を脅威モデリング(threat modeling。どこが狙われうるかを事前に洗い出すこと)と呼び、出発点としてデータフロー図(DFD、Data Flow Diagram)を使います。OWASPのThreat Modeling Cheat Sheetでも、システムを図にすることが最初の手順として示されています。

バイブコーディングでは、この図を描ける人が意外と少ないのです。AIが設計も実装もしてくれたので、持ち主が「自分のアプリにどんなサーバー処理があるか」を知らないことが珍しくありません。第1章で見た論文の失敗モードのうち、「デモ志向の設計」174件や「利用者任せ」72件は、AIが本番向けの守りを省いたり、持ち主に委ねたりしたものでした。全体図を描くと、こうした「省かれた場所」が空白として見えてきます。

図に描く6つの要素

難しい記法は要りません。四角と矢印と点線だけで十分です。描くべき要素は次の6つです。あなたの学習用ミニ銀行アプリを例にします。

登場人物
アプリに触る人や外部の仕組み。利用者、管理者(あなた)、そして自動で呼んでくる外部サービス。ミニ銀行なら「口座を持つ利用者」と「管理者」。
画面
ブラウザに表示されるページ。ログイン、口座一覧、振込、取引履歴、管理画面。URLの単位で書き出すと漏れにくいです。
サーバー処理
ブラウザからの依頼を受けて動く処理。「残高を返す」「振込を実行する」「利用者一覧を返す」など。Next.jsならAPIルートやサーバーアクションがこれに当たります。
データベース
データの保管場所。Supabaseなら、テーブルの単位で書きます。利用者、口座、取引、といった具合です。
外部サービス
自分のサーバーの外にあって、呼び出して使うもの。認証(Supabase Auth)、メール送信、決済、AIのAPIなど。
秘密情報
APIキー、データベースの接続文字列、管理者パスワード。どこに置かれているかを、鍵のマークで図に書き込みます。

経理の言葉に置き換えるなら、登場人物は「起票者と承認者」、画面は「伝票の様式」、サーバー処理は「会計システムの処理」、データベースは「総勘定元帳」、外部サービスは「銀行や取引先」、秘密情報は「金庫の鍵と銀行印」です。

信頼境界:どこから先を信用しないか

図を描いたら、点線を1本引きます。「ここから先は、相手が自由に書き換えられる領域」と「ここから先は、自分が管理している領域」の境目です。これを信頼境界(trust boundary)と呼びます。

ブラウザ 画面・入力欄・ボタン 利用者の手元にある 自由に書き換えられる サーバー 検証・権限確認・処理 鍵(環境変数)はここに置く データベース 利用者・口座・取引 あなたが管理する領域 ここで検証するのが原則 外部サービス 認証・メール・決済 他社が管理する領域 信頼境界 信頼境界
図8-1 データフロー図の最小形。点線が信頼境界です。境界をまたぐ矢印の1本1本が、点検すべき場所になります。

いちばん大切な境界は、ブラウザとサーバーの間です。ブラウザで動いている画面は、利用者のパソコンの中にあります。ブラウザに付いている開発者ツールを使えば、画面の表示も、ボタンの有効・無効も、サーバーに送る内容も、利用者が自由に書き換えられます。これは不正でも何でもなく、ブラウザの仕様です。

ですから、「残高が足りないときは振込ボタンを押せないようにしてある」だけでは、守りになりません。ボタンを押せるようにするのは利用者側の自由だからです。残高の確認は、サーバー側でもう一度やる必要があります。ブラウザ側の確認は、利用者の操作を助けるための親切であって、統制ではありません。

経理に置き換えると分かりやすいでしょう。申請者が自分で書いた伝票に「承認済み」と書いてあっても、それを信じる経理担当者はいません。承認は承認者の側で行い、承認者の記録だけを正とします。ブラウザは申請者、サーバーは承認者です。「サーバー側で検証する」が原則、というのはこの意味です。

もう1本の境界は、サーバーと外部サービスの間です。外部サービスから戻ってくるデータ(決済完了の通知など)も、本当にそのサービスから来たものかを確かめる必要があります。ただし、この章では存在を知っておけば十分です。

補足:点線をまたぐ矢印が点検箇所 信頼境界をまたいで「入ってくる」矢印は、すべて「外から来たもの」です。ログインの情報、入力欄の内容、URLに含まれるID、外部サービスからの通知。第9章から第13章の演習は、この矢印を1本ずつ確かめる作業だと考えてください。

資産の棚卸し:何を預かり、漏れたら誰が困るか

図ができたら、データベースと秘密情報の箱の中身を棚卸しします。金庫の中に何が入っているかを数える作業です。問いはひとつ、「これが漏れたら、誰が、どう困るか」です。

資産の種類ミニ銀行での例漏れたら困る人目安
個人情報利用者のメールアドレス、氏名利用者本人。報告・通知の義務が生じうる大
認証情報パスワード(のハッシュ)、ログイン中のセッション利用者本人。他サイトで使い回しがあれば被害が広がる大
業務データ残高、取引履歴利用者本人。改ざんされれば信頼が失われる中〜大
秘密情報Supabaseの秘密鍵、外部APIのキーあなた。全データの読み書きや、課金の悪用につながる大
公開前提のもの教材の本文、紹介ページほぼ誰も困らない。ただし改ざんは困る小

学習用アプリでも、テストで使ったメールアドレスが同僚の実在のものなら、それは個人情報です。「学習用だから」は、預かっているデータの重さを軽くしません。第3章のリスク区分(見るだけ・入力やログインがある・他人のデータやお金を扱う)に、ここで自分のアプリを当てはめ直してください。

点検ノートを用意する

以降の演習では、確認した結果を1か所に記録します。監査調書と同じで、「いつ、何を、どう確かめて、どうだったか」が残っていなければ、点検したことになりません。次の表を、表計算ソフトかメモ帳に写してください。

No.点検項目対象(図の矢印・箱)確認日結果対応内容再確認日
1秘密情報の棚卸し(第9章)鍵マークの場所すべて問題なし/要対応/未確認
2認証と権限の点検(第10章)境界をまたぐ矢印のうち、IDを含むもの
3入力欄の安全確認(第11章)入力欄のある画面すべて
4公開先の設定(第12章)Vercel/Supabase/GitHub
5AIレビュー(第13章)リポジトリ全体
注意:点検ノートは公開しない 点検ノートには「ここに穴がある」という情報が書かれます。公開リポジトリには入れず、手元のファイルか、非公開の場所に置いてください。全体図も同様です。

演習:A4一枚に、自分のアプリの全体図を描く

所要時間:約25分(紙とペン、またはお好みの作図ツール)
  1. 紙を横に置き、左端に「登場人物」(利用者、管理者)、右端に「外部サービス」を書きます。
  2. 左から2列目に「画面」を、URLごとに四角で並べます。ログイン、一覧、詳細、編集、管理画面。
  3. 中央に「サーバー処理」を四角で並べます。分からなければ、下の定型文でAIに一覧を出してもらいます。
  4. その右に「データベース」のテーブルを四角で並べます。Supabaseなら、管理画面のTable Editorに並んでいる名前をそのまま写します。
  5. 秘密情報(APIキーなど)がある場所に、鍵のマークを書きます。サーバーの環境変数、Vercelの設定画面、それ以外の場所にあれば要注意の印を付けます。
  6. データの流れを矢印で結びます。「利用者がログイン画面に入力し、サーバーがSupabase Authに問い合わせ、結果が画面に戻る」のように、1操作ずつたどります。
  7. ブラウザとサーバーの間、サーバーと外部サービスの間に、点線で信頼境界を引きます。
  8. 信頼境界をまたいで「入ってくる」矢印に番号を振り、点検ノートの「対象」欄に転記します。
  9. データベースの箱ごとに、上の表の「資産の種類」を書き添えます。「大」が1つでもあれば、第9章から第13章を飛ばさずに進んでください。
AIへの頼み方(全体図の材料を出してもらう)
このリポジトリについて、全体図を描くための材料を一覧にしてください。

1. 画面(ページやルート)の一覧と、それぞれの役割
2. サーバー側の処理(APIルート、サーバーアクション、サーバー関数)の一覧と、それぞれが読み書きするデータ
3. データベースのテーブルの一覧と、主な列
4. 呼び出している外部サービス(認証、メール、決済、AIなど)の一覧
5. 環境変数の「名前」の一覧(値は絶対に出力しないでください)

それぞれについて、該当するファイル名を添えてください。
推測で補わず、コードから読み取れることだけを書いてください。
これ以降の演習について 第9章から第13章の確認手順は、すべて「自分が作り、自分が管理しているアプリ」に対してのみ行ってください。他人のサイトやサービスで同じことを試すと、たとえ悪意がなくても不正アクセス禁止法に触れるおそれがあります。

まとめ

  • 点検の前に全体図(データフロー図)を描く。登場人物、画面、サーバー処理、データベース、外部サービス、秘密情報の6要素を四角と矢印で表す。
  • ブラウザ側は利用者が自由に書き換えられるので信用しない。検証と権限確認はサーバー側で行う。申請者の伝票ではなく承認者の記録を正とするのと同じ。
  • 預かっている資産を棚卸しし、「漏れたら誰が困るか」を書き出す。点検ノートを用意し、以降の演習の結果を監査調書のように残す。

出典