AI Security Playbook

手順 / 約18分

ログインと、データを使う権限を分ける

自分の画面が正しく見える、その先へ。本人・他人・未ログインの結果で、認可と添付・共有の境界を理解する。

実践 · ログインと保存先の基本を知り、利用者別のアクセスを確認する方へ。

読む前の補足
  • 認証と認可の違いを説明する。
  • 利用者と操作ごとの許可表を作る。
  • 架空データとテスト用アカウントで確認する。
この記事の目次

AIと作ったメモアプリに、ログイン機能を付けました。自分でログインすると、自分のメモだけが並びます。ログアウトすると、一覧は消えます。

ここまで確認したなら、「ちゃんと分かれている」と思いますよね。では、別の利用者として、同じメモを開こうとしたときはどうでしょう。

この記事は、予約・メモ・会員ページなど、利用者ごとにデータを分けるアプリを公開する人に向けたものです。ログインを付ける大切さの先にある、「相手の記録を返さない仕組み」を見ていきます。コードを読まない方も、例の結果と確認表から追えます。

利用者ごとにデータを分けるアプリで自分のメモは見えた。他の人からも見えない?

「誰ですか」と「このメモを読んでいいですか」は別の質問

認証は、ログインなどで「誰か」を確かめること。認可は、「その人が、このデータに、この操作をしてよいか」を決めることです。

利用者Aとしてログインできたとしても、利用者Bのメモまで読んでよいわけではありません。会員であることと、すべての会員の情報を扱えることは違います。

認証したあとに、認可の判断がある

  1. 本人の確認:認証

    ログインした利用者はAと確認する。

  2. 対象と操作の確認:認可

    そのメモの所有者か。読む・変える権限があるか。

  3. 許可した内容だけ返す

    条件を満たさなければ、本文を返さない。

ログイン済みという条件だけで、全利用者の記録を返しません。

会員番号やメモの番号を推測しにくくする工夫は役立ちますが、権限確認の代わりにはなりません。番号を知っていても、権限がなければ返さない設計が必要です。OWASP:IDORの防止

自分の画面が正しいだけでは、まだ分からないこと

画面に自分のメモしか出ていない理由には、二つあります。

一つは、サーバーが自分の分だけ返している場合。もう一つは、全員分をブラウザへ送った後に、画面で自分の分だけ表示している場合です。見た目が同じでも、後者では表示しないデータも利用者の端末に届いています。

同じ見た目でも、端末に届く情報が違う

  1. 画面で絞るだけ

    全員のデータを受け取ってから、自分の分を表示。

    表示しない情報も端末へ届く

  2. 処理側で制限

    本人と対象の権限を確認し、許可したデータだけ返す。

    拒否する内容は返さない

画面の非表示と、情報を渡さない制御を分けます。

同じように、「削除ボタンを隠した」「管理画面のURLを案内していない」だけでは、その処理を呼べないとは限りません。データを返す・変更する側で、要求のたびに権限を判断します。OWASP:認可の原則

入口を付けたあと、部屋の鍵も確かめる。

ログインは建物の入口、そのメモの権限は部屋の鍵、と考えると分けやすくなります。入口を通れた人が、すべての部屋へ入れる設計にはしません。

架空のメモで、許可と拒否を見比べる

ここでは、実際のサービスへ接続しません。メモリ上の架空の利用者A/Bと1件のメモだけを使います。認証済みの利用者情報は、信頼できるサーバー側で確認済みという前提です。

次のreadMemoは、利用者がいるか、メモの所有者かを見てから、必要な内容だけを返します。nullは「内容を返さない」という、この例での表現です。

const memo = { id: "note-1", ownerId: "A", text: "架空の旅メモ" };
function readMemo(sessionUser, record) {
  if (!sessionUser || !record || sessionUser.id !== record.ownerId) return null;
  return { id: record.id, text: record.text };
}
for (const user of [{ id: "A" }, { id: "B" }, null]) {
  const label = user ? user.id : "未ログイン";
  console.log(label + ": " + JSON.stringify(readMemo(user, memo)));
}
A: {"id":"note-1","text":"架空の旅メモ"}
B: null
未ログイン: null

大事なのは、Bや未ログインの場合に、メモの本文を返す前に止まることです。返した後で画面から隠す処理ではありません。

この短いコードだけで、実際の認証・認可は完成しません。ブラウザから送られたuserIdを、そのままログイン済みの本人として信用してはいけません。実装では、提供元の認証機能で検証した利用者と、DBのルールやサーバーの処理をつなぎます。

「読む」だけでなく、変える・消す・共有するも分ける

同じメモでも、閲覧と編集の権限は別です。共同編集を付けるなら、「所有者」「編集できる共同利用者」「閲覧だけの人」の違いも決めます。

最初は複雑にせず、自分のアプリで必要な操作を表にします。これは、本人だけが使うメモアプリの架空例です。

表がはみ出す場合は、横にスクロールして読めます。

操作 本人A 別の利用者B 未ログイン
Aの非公開メモを読む 許可 拒否 拒否
Aのメモを編集・削除 許可 拒否 拒否
新しいメモを作る 自分の所有で許可 B自身の所有で許可 拒否
共有設定を変える 許可 拒否 拒否

「管理者なら全部見られる」と決める前にも、本当にその権限が必要かを考えます。役割を増やしたら、許可表と拒否のテストも増やします。

本文だけでなく、操作と添付も分ける

  1. 対象:Aの非公開メモ

    誰の、どの記録を扱うかを決める。

  2. 読む・変える・消す

    操作ごとに許可する相手を決める。

  3. 画像・添付

    別の保存先でも、閲覧範囲を確認。

  4. 共有の変更

    相手・期間・取り消し方を確認。

共有や共同編集を追加したら、権限表とテストも更新します。

画像や添付ファイルは別の保存サービスに置くことがあります。メモの本文を守っていても、添付のURLが一般公開なら、そちらから見える場合があります。共有リンクを作るときは、対象、閲覧できる人、有効期間、取り消し方も確認します。

非公開アプリでも、裏側の制限が問題になった事例

分類:脆弱性の公表。 Wizが2025年7月29日に公表したBase44の報告では、非公開アプリへの登録・認証の制限に問題がありました。7月9日の報告後に修正され、提供元は過去の悪用を示す証拠はないと説明しています。Wizの一次報告

これは、上のメモの所有者判定と同一の欠陥ではありません。また、すべてのAI開発サービスに同じ問題がある証拠でもありません。持ち帰りたいのは、「非公開」の表示やログイン画面の存在と、実際に受け付ける条件を分けて確かめるという視点です。

自分のアプリでは、3つの視点で確かめる

作る人:誰が何をできるかを言葉にする

「会員だけが使える」から一歩進めて、「誰の、どの記録を、読む・作る・変える・消すか」を決めます。AIへは許可表を渡し、どのファイルやDBルールがそれを強制するか、秘密の値を表示せずに説明してもらいます。

テストする人:うまくいかない側も確認する

自分が管理するテスト環境に、架空のA/Bのアカウントとデータを用意します。Aの通常操作だけでなく、Bと未ログインで、許可されない内容が返らず、変更も起きないことを確認します。

本番の利用者のデータや、他人が運営するサービスで試す必要はありません。画面だけでは処理側の拒否を確かめられないときは、APIやDBルールを確認できる人へレビューを依頼します。

管理する人:本番でも同じ制限が働くかを見る

テスト環境と本番で、プロジェクト・ルール・利用者の役割が一致しているかを確認します。管理用の強いキーで試して通った結果は、一般利用者の権限の検証になりません。管理キーはブラウザへ渡さず、通常の利用者の経路も別に確かめます。

許可される結果と、拒否される結果をそろえる

  1. 本人Aの操作

    Aのメモが読め、許可した変更が反映される。

    正常側の確認

  2. 別のB・未ログイン

    Aの本文が返らず、許可外の変更も起きない。

    拒否側の確認

自分が管理するテスト環境と架空データで確認します。

AIの「認可済み」は、どのテストの結果?

「認可を入れました」で終えず、A・B・未ログイン、閲覧・編集・削除それぞれの結果と、確認した実装の場所を見ます。新しい共有機能を付けたら、この確認も更新します。

公開前に、ここまで説明できる?

  • 許可表: 利用者・対象データ・操作を分け、共有や管理者の権限も決めた。
  • 認証の根拠: 本人情報をどこで検証するか確認し、画面から渡したIDだけを信用していない。
  • 処理側の制限: サーバーまたはDBで拒否する実装・ルールを確認できる。
  • 拒否の結果: 自分のテスト用Bと未ログインで、本文が返らず、許可外の変更も起きないことを確かめた。
  • 添付と本番: ファイルの公開設定と、本番に適用したルールを別々に確かめた。

未確認が残ったら、実際の顧客データを入れる前に、その部分を説明できる人へ依頼します。チェック印だけで埋める必要はありません。

次は、権限以外の公開条件も確かめる

公開するファイルとサービス全体の公開前確認へ進みます。すでに他人のデータが見えた場合は、追加で開いたり証拠を公開したりせず、異常時の対応で相談と拡大防止を先に整理します。

一次資料

情報確認日:2026年10月24日。認証・DB・ファイル保存の具体的な設定は、利用するサービスと版の公式資料で確認してください。

書いた人

マーケティングの現場から、AIをつくり、仕事で使う側へ。実際に試したことや、つまずいたことを、図解と具体例で伝えています。

この記事のURL:https://nekoai-lab.github.io/ai-security-playbook/learn/access-control/

続けて読む

シリーズ · 全14記事のうち6記事目

次に読むサイトやZIPを公開する人へ。作業フォルダーと配布物を分け、受け取る人の入口から中身を確かめる。
読む順番・ルートを見るAIで作って公開する基本
  1. AIに渡す情報を、送る前に分ける
  2. 「学習しない」AIなら、仕事の個人情報を使える?
  3. AIで作ったアプリの、動く場所を知る
  4. AIに「APIキーを設定して」と言われた。どこに入れるのが正解?
  5. APIキーを替えたのに、古いキーが使われている?
  6. ログインと、データを使う権限を分ける
  7. 公開したのは、本当に見せたいファイルだけ?
  8. コードには書いていない。名前やメールは、どこから公開される?
  9. 緑のチェックが付いた。その変更を公開していい?
  10. AIレビューが合格した。その結果を、どこまで信じていい?
  11. AIにデプロイを頼んだ。その認証情報は、どこまでできる?
  12. AIで作ったサービスを、公開する前に確かめる
  13. 外部サービスが止まったら、自分のアプリはどうなる?
  14. 漏えい・異常・消失に気づいたとき、最初にすること

ログインと権限の教材へ戻る →