前の記事では、公開前に必須の3つの鍵を紹介した。これはその次のレベル、本気のプロダクトが使う防御だ。まず、不快だが解放的な真実から始めよう。何も「完全無敵」ではない。Google、Stripe、銀行 — すべて攻撃されうる。本当の目標は無敵になることではない。攻撃するのが高くつき、面倒すぎて、攻撃者があきらめてもっと簡単な獲物へ行くようにすること、そして何かが起きたときに被害を封じ込めて、一つの失敗が大惨事にならないようにすることだ。それは家と同じ。盗まれない家は存在しない。存在するのは、柵とアラームと犬とカメラがある家 — 泥棒が見て、手間を計算し、隣の家へ行く家だ。それが目標、攻めにくい家になること。ここにそれを実現する8つのレイヤーがある。シンプルな言葉で、それぞれ例えとAIに頼むためのプロンプト付き。
何も「完全無敵」ではない。そう言わない人はあなたに嘘をついている。Google、Stripe、銀行:すべて攻撃されうる。では、セキュリティに何の意味があるのか? 本当の目標は無敵になることではない — 攻撃するのが高くつき、面倒すぎて、攻撃者があきらめ、もっと簡単な獲物へ行くようにすることだ。そして何かが起きたときに被害を封じ込めて、一つの失敗が大惨事にならないようにすることだ。
人がよく混同する2つのこと:認証(authentication)は「あなたは名乗る通りの人物か?」(ログイン)、認可(authorization)は「あなたはこの具体的な操作をする権限があるか?」(このユーザーはこのデータを見られるか?)だ。黄金律:デフォルトで拒否。明示的に開けない限りすべては閉じている — その逆は決してない。ほとんどの漏洩は、誰かが何かを「デフォルトで開いたまま」にして閉じるのを忘れたために起きる。
「デフォルトで拒否」のルールでバックエンドの認証と認可を守りたい。各エンドポイントは閉じた状態で生まれ、明示的な理由がある場合のみ開くべきだ。すべてに認証を要求するグローバルなガードを設定し、私が指定したものだけを公開としてマークできるようにして。認可については、ログインだけでなくアクションごとに権限を検証して。何をしたかシンプルなステップで説明して。
このレイヤーはまさに前のガイドで見たもの(鍵1)だ。ここではそれをアーキテクチャのルールに引き上げる。マルチユーザーのプロダクトでは、RLSはオプションではなく、土台だ。
私のアプリはマルチユーザーだ(同じデータベースに多くの顧客がいる)。Row Level Securityで完全な分離を確保して:ユーザーデータを持つ全てのテーブルでRLSを有効にし、各人が自分のものだけにアクセスできることを保証するポリシーを付けて。コードにバグがあってもデータベースが強制するようにしたい。パフォーマンスのために(SELECT auth.uid())を使い、authenticatedロールに制限して。SQLをくれて、あるユーザーが他人のデータを見られないことをどう検証するか説明して。
バックエンドにレート制限を追加して:ユーザーごと・IPごとに1分あたりのリクエスト上限を設け、機微なエンドポイント(ログイン、登録、AIを呼ぶもの)ではより厳しくして。上限を超えたら、サーバーを倒さずに明確なエラー(429)で応答して。最初に推奨する上限値と、その調整方法を教えて。
悪意あるリクエストがサーバーに触れる前に、外側の盾を通る — Cloudflareが標準だ。その盾は大規模な攻撃(DDoS:数千台のマシンが同時に攻撃してくる)を吸収し、既知のボットをふるいにかけ、攻撃パターンをブロックする。あなたのサーバーはその後ろに隠れ、ドアを直接さらさない。これが最前線、大手が使うものだ。
アプリの前に外側の盾(CloudflareのようなWAF/CDN)を置きたい。シンプルなステップで案内して:ドメインをCloudflareを経由させること、DDoS保護とアプリケーションファイアウォールを有効にすること、そして誰も直接攻撃できないようにオリジンサーバーを隠すこと。最初に有効にすべき設定と、どれが無料かを教えて。
私の秘密(APIキー、パスワード、トークン)を守って。1) コードとgitから取り出す:環境変数に置き、.envを無視する.gitignoreを作って。2) ユーザーの鍵を保存するなら、ユーザーごとの鍵でデータベース内で暗号化して。3) gitleaksを各コミット前のフックとして設定し、誤って秘密をアップロードしようとしたら止めてくれるようにして。各ステップをシンプルに説明して。
ユーザーが送ってくるものを決して信じてはいけない。バックエンドに届く各データは、何かに触れる前に厳格なスキーマで検証する。これで典型的な攻撃をブロックできる:SQLインジェクション(攻撃者がフォームにコマンドを仕込んでデータベースを盗む)、プロンプトインジェクション(ユーザーがあなたのAIを操作してルールを飛び越えさせる)、そしてシステムを壊す不正なデータだ。ルール:各境界で検証する。外部のものはすべて、証明されるまで疑わしい。
バックエンドの全ての入力を、各エンドポイントで処理前に厳格なスキーマ(Zodか同等のもの)で検証して。スキーマを満たさないものは拒否して。特にSQLインジェクション、AIへのプロンプトインジェクション、不正なデータから守って。各境界に適用するパターンと、私のエンドポイントの一つでの例をくれ。
私のアプリはAI(使用量に応じてお金がかかる)を使う。ユーザーにクレジットを出血させられないように守って:1) 各ユーザーにAI使用の1日の予算/上限を設け、達したら明確なメッセージで遮断して。2) 異常な振る舞いを検知するためにユーザーごとの消費を記録して。3) 誰かが支出を跳ね上げたら私に知らせて。通常のユーザーに影響しないように上限をどう定めるか説明して。
見えないものは守れない。重要なアクションはすべて、誰にも消せない不変のログに記録される(誰が、何を、いつ)。何か変なことが起きたら、録画がある。そしてアラートシステムが、後からではなくその最中に知らせてくれる。これがあなたを安眠させるものだ:誰かが何かを試みたら、ライブで見える。
アプリに監査と可観測性を追加して:1) 重要なアクション(ログイン、データ変更、支払い)で誰が何をいつしたかを記録する不変のログを、消したり編集したりできないようにして。2) 疑わしいことが起きたら(多くのログイン失敗、異常な支出、ピーク時のエラー)リアルタイムで知らせるアラート。まず記録すべきイベントと、アラートの受け取り方を教えて。
本気のプロジェクトを立ち上げるときに全部まとめて頼みたいなら、このプロンプトは8つのレイヤーを要約し、AIが土台から考慮できるようにする:
このバックエンドを、初日からenterprise級のセキュリティで、「多層防御」(たくさんのレイヤー)を使って構築しよう。作るものすべてでこの8つのレイヤーを考慮し、どれが欠けているか私に思い出させて: 1. AUTH:「デフォルトで拒否」の認証+認可(明示的に開けるものを除きすべて閉じる)。 2. 分離:全テーブルでRow Level Security(各ユーザーは自分のものだけを見る、データベースが強制)。 3. レート制限:ユーザー/IPごとのリクエスト上限、機微なエンドポイントではより厳しく。 4. 外側の盾:前面にWAF/CDN(Cloudflare)、DDoS保護付き、オリジンは隠す。 5. 秘密:コード/gitに鍵を置かない;vault + 環境変数;ユーザーの鍵は暗号化;各コミット前にgitleaks。 6. 検証:全入力を各境界で厳格なスキーマ(Zod)で検証;SQLインジェクションとプロンプトインジェクションへの保護。 7. コストガードレール:自動遮断付きのユーザーごとAI予算;異常消費の検知。 8. 監査:不変のログ(誰が/何を/いつ)+ リアルタイムアラート。 まず、私のプロジェクトにどれが該当し、どの順で実装するかを教えて。まだ必要ないものへの過剰設計はしないで。
Join 4,200+ builders. No credit card. Build your first app with AI in minutes.