この記事の目次
AIと作ったメモアプリに、ログイン機能を付けました。自分でログインすると、自分のメモだけが並びます。ログアウトすると、一覧は消えます。
ここまで確認したなら、「ちゃんと分かれている」と思いますよね。では、別の利用者として、同じメモを開こうとしたときはどうでしょう。
この記事は、予約・メモ・会員ページなど、利用者ごとにデータを分けるアプリを公開する人に向けたものです。ログインを付ける大切さの先にある、「相手の記録を返さない仕組み」を見ていきます。コードを読まない方も、例の結果と確認表から追えます。

「誰ですか」と「このメモを読んでいいですか」は別の質問
認証は、ログインなどで「誰か」を確かめること。認可は、「その人が、このデータに、この操作をしてよいか」を決めることです。
利用者Aとしてログインできたとしても、利用者Bのメモまで読んでよいわけではありません。会員であることと、すべての会員の情報を扱えることは違います。
認証したあとに、認可の判断がある
- 本人の確認:認証
ログインした利用者はAと確認する。
- 対象と操作の確認:認可
そのメモの所有者か。読む・変える権限があるか。
- 許可した内容だけ返す
条件を満たさなければ、本文を返さない。
会員番号やメモの番号を推測しにくくする工夫は役立ちますが、権限確認の代わりにはなりません。番号を知っていても、権限がなければ返さない設計が必要です。OWASP:IDORの防止
自分の画面が正しいだけでは、まだ分からないこと
画面に自分のメモしか出ていない理由には、二つあります。
一つは、サーバーが自分の分だけ返している場合。もう一つは、全員分をブラウザへ送った後に、画面で自分の分だけ表示している場合です。見た目が同じでも、後者では表示しないデータも利用者の端末に届いています。
同じ見た目でも、端末に届く情報が違う
- 画面で絞るだけ
全員のデータを受け取ってから、自分の分を表示。
表示しない情報も端末へ届く
- 処理側で制限
本人と対象の権限を確認し、許可したデータだけ返す。
拒否する内容は返さない
同じように、「削除ボタンを隠した」「管理画面の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自身の所有で許可 | 拒否 |
| 共有設定を変える | 許可 | 拒否 | 拒否 |
「管理者なら全部見られる」と決める前にも、本当にその権限が必要かを考えます。役割を増やしたら、許可表と拒否のテストも増やします。
本文だけでなく、操作と添付も分ける
- 対象:Aの非公開メモ
誰の、どの記録を扱うかを決める。
- 読む・変える・消す
操作ごとに許可する相手を決める。
- 画像・添付
別の保存先でも、閲覧範囲を確認。
- 共有の変更
相手・期間・取り消し方を確認。
画像や添付ファイルは別の保存サービスに置くことがあります。メモの本文を守っていても、添付のURLが一般公開なら、そちらから見える場合があります。共有リンクを作るときは、対象、閲覧できる人、有効期間、取り消し方も確認します。
非公開アプリでも、裏側の制限が問題になった事例
分類:脆弱性の公表。 Wizが2025年7月29日に公表したBase44の報告では、非公開アプリへの登録・認証の制限に問題がありました。7月9日の報告後に修正され、提供元は過去の悪用を示す証拠はないと説明しています。Wizの一次報告
これは、上のメモの所有者判定と同一の欠陥ではありません。また、すべてのAI開発サービスに同じ問題がある証拠でもありません。持ち帰りたいのは、「非公開」の表示やログイン画面の存在と、実際に受け付ける条件を分けて確かめるという視点です。
自分のアプリでは、3つの視点で確かめる
作る人:誰が何をできるかを言葉にする
「会員だけが使える」から一歩進めて、「誰の、どの記録を、読む・作る・変える・消すか」を決めます。AIへは許可表を渡し、どのファイルやDBルールがそれを強制するか、秘密の値を表示せずに説明してもらいます。
テストする人:うまくいかない側も確認する
自分が管理するテスト環境に、架空のA/Bのアカウントとデータを用意します。Aの通常操作だけでなく、Bと未ログインで、許可されない内容が返らず、変更も起きないことを確認します。
本番の利用者のデータや、他人が運営するサービスで試す必要はありません。画面だけでは処理側の拒否を確かめられないときは、APIやDBルールを確認できる人へレビューを依頼します。
管理する人:本番でも同じ制限が働くかを見る
テスト環境と本番で、プロジェクト・ルール・利用者の役割が一致しているかを確認します。管理用の強いキーで試して通った結果は、一般利用者の権限の検証になりません。管理キーはブラウザへ渡さず、通常の利用者の経路も別に確かめます。
許可される結果と、拒否される結果をそろえる
- 本人Aの操作
Aのメモが読め、許可した変更が反映される。
正常側の確認
- 別のB・未ログイン
Aの本文が返らず、許可外の変更も起きない。
拒否側の確認
AIの「認可済み」は、どのテストの結果?
「認可を入れました」で終えず、A・B・未ログイン、閲覧・編集・削除それぞれの結果と、確認した実装の場所を見ます。新しい共有機能を付けたら、この確認も更新します。
公開前に、ここまで説明できる?
- 許可表: 利用者・対象データ・操作を分け、共有や管理者の権限も決めた。
- 認証の根拠: 本人情報をどこで検証するか確認し、画面から渡したIDだけを信用していない。
- 処理側の制限: サーバーまたはDBで拒否する実装・ルールを確認できる。
- 拒否の結果: 自分のテスト用Bと未ログインで、本文が返らず、許可外の変更も起きないことを確かめた。
- 添付と本番: ファイルの公開設定と、本番に適用したルールを別々に確かめた。
未確認が残ったら、実際の顧客データを入れる前に、その部分を説明できる人へ依頼します。チェック印だけで埋める必要はありません。
次は、権限以外の公開条件も確かめる
公開するファイルとサービス全体の公開前確認へ進みます。すでに他人のデータが見えた場合は、追加で開いたり証拠を公開したりせず、異常時の対応で相談と拡大防止を先に整理します。
一次資料
情報確認日:2026年10月24日。認証・DB・ファイル保存の具体的な設定は、利用するサービスと版の公式資料で確認してください。
- OWASP:認可 — 要求ごとの権限制御、確認を行う場所、検証の原則。
- OWASP:IDORの防止 — 識別番号と権限確認の違い。
- Wiz:Base44の脆弱性報告 — 事例の確認範囲と修正。本文のメモと演習は独自の架空例です。
書いた人
マーケティングの現場から、AIをつくり、仕事で使う側へ。実際に試したことや、つまずいたことを、図解と具体例で伝えています。
この記事のURL:https://nekoai-lab.github.io/ai-security-playbook/learn/access-control/
続けて読む
読む順番・ルートを見る
AIで作って公開する基本- AIに渡す情報を、送る前に分ける
- 「学習しない」AIなら、仕事の個人情報を使える?
- AIで作ったアプリの、動く場所を知る
- AIに「APIキーを設定して」と言われた。どこに入れるのが正解?
- APIキーを替えたのに、古いキーが使われている?
- ログインと、データを使う権限を分ける
- 公開したのは、本当に見せたいファイルだけ?
- コードには書いていない。名前やメールは、どこから公開される?
- 緑のチェックが付いた。その変更を公開していい?
- AIレビューが合格した。その結果を、どこまで信じていい?
- AIにデプロイを頼んだ。その認証情報は、どこまでできる?
- AIで作ったサービスを、公開する前に確かめる
- 外部サービスが止まったら、自分のアプリはどうなる?
- 漏えい・異常・消失に気づいたとき、最初にすること





