なぜAIが作った会員登録コードをそのまま使うと危険なのか

ChatGPT, Claudeのような生成AIに「メールアドレスとパスワードで会員登録機能を作って」と依頼すると、短時間で動作するコードを得られます。しかし実際のサービスにおける会員登録は、単純な入力フォームとデータベース保存機能ではありません。アカウント復旧、パスワード変更、退会、プライバシーポリシー、利用規約、管理者権限、データ保存ポリシーがあわせて設計されるべき運用システムです。

特に韓国でメールアドレス、氏名、携帯電話番号、ソーシャルログイン識別子のように個人を識別できる情報を収集する場合、個人情報保護法上の個人情報処理に関する義務を考慮する必要があります。AIが生成したコードは一般的な例にすぎず、実際のサービスの法的責任と運用責任はサービス運営者に残ります。

核心原則: AIはコードを作れるが、ポリシーを代わりに決定することはできない

AIが作ったコードは「機能が動くか」に焦点が当たりがちです。一方、実際のサービスは次の質問に答えられなければなりません。

  • ユーザーがパスワードを忘れたとき、どの手順でアカウントを復旧するのか?
  • パスワードを変更するとき、現在のパスワードを再確認するのか?
  • 退会要請があった場合、どのデータを削除し、どのデータを保存するのか?
  • プライバシーポリシーに実際の収集項目、目的、保存期間が正確に記載されているのか?
  • 規約違反ユーザーを停止できる契約上の根拠があるのか?
  • 管理者画面で個人情報を最小限に表示し、アクセス記録を残すのか?

AIに「会員登録を作って」とだけ言うと、このような決定は抜け落ちる可能性があります。したがって、運営者が先にポリシーを決め、決められていない項目についてはAIが質問するようにプロンプトを設計する必要があります。

基本セキュリティ: パスワードは絶対に平文で保存しない

サービス運営者もユーザーのパスワードの原文を知ることができないようにすべきです。データベースにパスワードを平文で保存すると、漏えい事故発生時に被害がただちに拡大します。

安全な方法は、パスワードを一方向ハッシュに変換して保存することです。一方向ハッシュは、原文の復元が実質的に不可能になるよう設計された変換方式です。一般的にパスワード保存には、高速な一般ハッシュ関数よりも、bcrypt, Argon2id, PBKDF2のようにパスワード保存のために設計されたアルゴリズムが推奨されます。

パスワード保存時に確認する項目

点検項目 推奨方針 理由
平文保存の有無 絶対禁止 DB漏えい時にすべてのアカウントがただちに危険になる
ハッシュアルゴリズム bcrypt, Argon2id, PBKDF2などを使用 総当たり攻撃のコストを高める
ソルト使用 ユーザーごとに固有ソルトを適用 同じパスワードでも異なるハッシュが生成される
作業コスト設定 サーバー性能を考慮して十分に高く設定 大量の推測攻撃を困難にする
ログ記録 パスワードとリセットトークンをログに残さない ログ漏えいによる二次事故を防止

Ruby on Rails, Django, Laravelのような主要なWebフレームワークは安全なパスワード保存機能を提供していますが、フレームワークのデフォルト値を使うからといって、アカウント復旧、退会、プライバシーポリシーまで自動的に解決されるわけではありません。

AIが見落としやすい5つの必須ポリシー

1. パスワードリセットポリシー

ユーザーは必ずパスワードを忘れます。パスワードリセット機能がなければ、運営者はアカウント復旧要請を手動で処理しなければならず、その過程で本人確認ミスや個人情報露出のリスクが高まる可能性があります。

パスワードリセットは単に「メールでリンクを送る」ことではなく、トークンの寿命、再利用防止、アカウント存在有無の露出防止まで含みます。

決定すべきポリシー

  • リセットリンクの有効期間: たとえば15分または30分のように短く設定します。
  • 1回使用の有無: 一度使用したリンクはただちに無効化します。
  • トークン保存方式: リセットトークンの原文をDBに保存せず、ハッシュ化して保存する方式を検討します。
  • アカウント存在有無の露出防止: 存在しないメールアドレスを入力しても「登録済みのメールアドレスであれば案内メールを送信しました」のように同一の応答を表示します。
  • リクエスト制限: 同じメールアドレスまたはIPから過度なリセット要請が発生した場合、レート制限を適用します。
  • 通知: パスワードが変更されたらユーザーに変更通知を送ります。

2. 会員情報修正ポリシー

会員はメールアドレス、パスワード、ニックネーム、通知受信設定などを変更したいと考えます。AIが作った最小機能には、会員情報修正画面が抜ける場合が多くあります。

特にパスワード変更はセキュリティ上センシティブな操作です。ログイン済みセッションだけを信頼して変更を許可すると、カフェやオフィスで席を離れた間に他人がアカウントを乗っ取る可能性があります。

決定すべきポリシー

  • パスワード変更時に現在のパスワードを再入力させるかを決定します。
  • メールアドレス変更時に新しいメールアドレスの認証を要求するかを決定します。
  • メールアドレス変更後、以前のメールアドレスと新しいメールアドレスに通知を送るかを決定します。
  • 重要な情報変更後、既存のログインセッションを維持するか、再ログインを要求するかを決定します。
  • 会員情報変更履歴を監査ログとして残すかを決定します。

3. 退会とデータ削除ポリシー

退会は実際のサービスで最も重要なポリシーの一つです。ユーザーはサービスをやめられるべきであり、個人情報の削除または処理停止に関する要請を行うことができます。退会機能がなかったり、退会後もログイン可能な状態が維持されたりすると、信頼と法的リスクが同時に大きくなります。

ただし、すべてのデータをただちに物理削除することが常に正解とは限りません。決済、税務、紛争対応、不正利用防止など、合法的な保存理由があるデータは一定期間保管が必要な場合があります。そのため退会ポリシーは「何を削除し、何を匿名化し、何を保存するのか」を区分しなければなりません。

Soft DeleteとHard Deleteの比較

区分 意味 利点 注意点
Hard Delete DBからデータを物理的に削除 個人情報が残存するリスクを減らす 決済・紛争記録まで削除すると法的・会計上の問題が生じる可能性がある
Soft Delete 退会状態として表示しログインを遮断 取引記録、投稿の関係、監査記録の保存が容易 個人情報が残り続ける可能性があるため、匿名化とアクセス制限が必要
匿名化 メールアドレス、氏名などの識別子を復元困難に変換または削除 統計・取引記録を保存しながら識別リスクを下げる 実際に再識別が困難な水準か検討する必要がある

実務でよく使われる方式

  • アカウント状態をactive, suspended, deletedのように区分します。
  • 退会アカウントはただちにログインできないようにします。
  • メールアドレス、氏名、電話番号のような直接識別子は削除または匿名化します。
  • 決済履歴、税務関連記録、不正利用対応記録は、法的根拠と保存期間を定めて限定的に保存します。
  • プライバシーポリシーに退会後に保管される項目、目的、期間を明確に記載します。

4. プライバシーポリシー

メールアドレスを1つだけ収集しても、個人情報処理に関する告知が必要です。プライバシーポリシーは「当社も適当に1つ載せておくべき文書」ではなく、実際のサービスがどの情報をどの目的で処理するのかを説明する公式文書です。

他サイトのプライバシーポリシーをそのままコピーするのは危険です。実際には収集していない情報を書いたり、実際に収集している情報を漏らしたりすると、文書とサービスが不一致になります。AIを活用するなら、まずデータベースフィールド、会員登録フォーム、ソーシャルログインで提供される項目、ログ収集項目、決済連携項目を整理したうえで、それをもとに草案を作らせるべきです。

プライバシーポリシーに含める主な項目

  • 収集する個人情報項目: メールアドレス、氏名、ニックネーム、ソーシャルログイン識別子、決済情報など
  • 収集および利用目的: 会員識別、ログイン、カスタマーサポート、決済処理、不正利用防止など
  • 保管および利用期間: 退会時まで、関連法令上の保存期間など
  • 破棄手続きと方法: DB削除、匿名化、バックアップデータ破棄周期など
  • 第三者提供の有無: 広告、分析、決済、配送など外部提供がある場合
  • 処理委託の有無: クラウド、メール送信、決済代行、顧客相談ツールなど
  • 利用者の権利と行使方法: 閲覧、訂正、削除、処理停止要請など
  • 個人情報保護責任者または問い合わせ窓口

プライバシーポリシーと利用規約の違い

2つの文書はいずれも重要ですが、役割が異なります。

文書 核心的な役割 ない、または不十分な場合のリスク
プライバシーポリシー 個人情報を何のためにどのように処理するかを説明 個人情報保護法上の告知・公開義務違反、利用者の信頼低下
利用規約 サービス利用条件と運営者の措置根拠を定める アビューズ、不正、暴言、スパムアカウントに対する制限根拠の不足

プライバシーポリシーはデータ処理説明書に近く、利用規約はユーザーとサービスの間の契約条件に近いものです。どちらか一方だけでは不十分です。

5. 利用規約と制裁ポリシー

利用規約がなければ、悪質なユーザーがサービスを悪用しても、アカウント停止、投稿削除、利用制限の根拠が弱くなります。特にコミュニティ、マーケットプレイス、SaaS、コンテンツプラットフォームのようにユーザーが活動を残すサービスには、規約と運用ポリシーが必ず必要です。

利用規約に含める主な内容

  • 会員登録条件とアカウント管理責任
  • 禁止行為: 違法行為、不正、スパム、クローリング濫用、暴言、他人の権利侵害など
  • サービス利用制限の事由と手続き
  • 投稿またはユーザー生成コンテンツの処理基準
  • 有料サービスがある場合、決済、返金、解約条件
  • サービス変更、中断、終了に関する案内
  • 責任制限と紛争解決手続き

登録画面には、プライバシーポリシーと利用規約への同意手続きを明確に入れる必要があります。任意同意と必須同意が混在する場合は、利用者が区分して選択できなければなりません。

ソーシャルログインを使ってもポリシーは消えない

Google, Kakao, Appleのようなソーシャルログインを使用すると、自社でのパスワード保存とパスワード検索機能の負担は減ります。しかし会員登録ポリシーがなくなるわけではありません。

ソーシャルログインでも次の項目は依然として必要です。

  • どのソーシャルログイン提供者からどの情報を受け取るのかを明示します。
  • ソーシャルアカウント連携解除とサービス退会を区分します。
  • メールアドレス、プロフィール画像、固有識別子などの収集項目をプライバシーポリシーに反映します。
  • サービス自体の利用規約への同意は別途取得する必要があります。
  • アカウント停止、退会、データ保存ポリシーはサービス運営者が定める必要があります。

管理者ページを作るときのセキュリティ原則

会員が生じると管理者ページも必要になります。しかし管理者ページは個人情報漏えい事故が発生しやすい高リスク領域です。「管理者がすべての情報を見られるようにする」という設計は避けるべきです。

管理者ページ点検項目

項目 推奨ポリシー
アクセス権限 管理者の役割ごとに最小権限のみ付与
表示情報 メールアドレス、登録状態、制裁状態など必要な情報のみ露出
センシティブ情報 パスワード、トークン、全決済情報は表示しない
制裁機能 利用規約の禁止行為と関連する停止理由を記録
監査ログ 誰がいつどの会員情報を閲覧・変更したかを記録
管理者認証 強力なパスワードと多要素認証を適用

AIに依頼するときに良いプロンプト構造

AIには「機能」ではなく「ポリシー」をあわせて伝える必要があります。次の構造を使うと漏れを減らせます。

プロンプトに含める項目

  1. 技術スタック: たとえばRuby on Rails, Next.js, Django, Laravelなど
  2. 会員登録方式: メールアドレス・パスワード、ソーシャルログイン、招待制など
  3. 認証ポリシー: メール認証、ログイン失敗制限、セッション期限、2段階認証の有無
  4. パスワードポリシー: ハッシュ方式、変更手順、リセットリンク有効期間
  5. 退会ポリシー: 削除、匿名化、保存データ、再登録許可の有無
  6. 法務文書: プライバシーポリシーと利用規約の草案生成基準
  7. 管理者ポリシー: 会員閲覧、停止、監査ログ、最小権限
  8. 例外処理: 既に登録済みのメールアドレス、退会アカウントの再登録、停止アカウントのログインなど

プロンプト例

メールアドレスとパスワードで会員登録・ログイン機能を実装して。
パスワードは安全な一方向ハッシュで保存し、平文を保存しないで。
パスワードリセットリンクは30分だけ有効で、1回使用後に破棄されるようにして。
パスワード変更時には現在のパスワードを再入力させるようにして。
退会時にはログインをただちに遮断し、メールアドレスと氏名は匿名化する一方、決済履歴は法的保存の必要性を考慮して別状態で保管できるように設計して。
収集するデータベースフィールドを基準に、プライバシーポリシーと利用規約の草案に入る項目一覧を作成して。
登録画面には必須規約同意チェックボックスを入れて。
管理者ページは最小権限の原則に従い、メールアドレス、登録状態、制裁状態だけが見えるようにし、すべての閲覧・変更を監査ログに残して。
実装する前に、私が決めていないポリシーのうち決定が必要なものがあれば先に質問して。

最後の文である「実装する前に、私が決めていないポリシーのうち決定が必要なものがあれば先に質問して」は非常に重要です。この文を入れると、AIが単にコードを生成するツールではなく、ポリシーの漏れを見つける補助企画者の役割を担うようになります。

デプロイ前チェックリスト

実際のサービスに適用する前に、次の項目を確認する必要があります。

  • パスワードが平文で保存されていないか?
  • パスワードリセットリンクには短い有効期間と1回使用制限があるか?
  • リセット要請画面がアカウント存在有無を露出していないか?
  • パスワード変更時に現在のパスワードの再確認を要求しているか?
  • メールアドレス変更時に新しいメールアドレスの認証手続きがあるか?
  • 退会機能が実際に存在し、ログイン遮断が行われるか?
  • 退会後に削除、匿名化、保存されるデータが区分されているか?
  • プライバシーポリシーが実際の収集項目と一致しているか?
  • 利用規約が禁止行為とアカウント制裁の根拠を含んでいるか?
  • 登録時に規約とプライバシーポリシーへの同意手続きがあるか?
  • 管理者ページが最小権限の原則で設計されているか?
  • 管理者アクセスと個人情報の閲覧・変更履歴がログとして残るか?
  • ログとエラー追跡ツールにパスワード、トークン、センシティブ情報が残っていないか?
  • ソーシャルログインを使う場合、提供を受ける情報と連携解除ポリシーが文書に反映されているか?

結論

AI時代のプロダクト開発能力は、単にコードを速く作る能力だけで決まるものではありません。実際のサービスを運営するには、認証セキュリティ、個人情報保護、退会と保存、規約、管理者権限、例外状況をあらかじめ決定する必要があります。

AIは実装速度を高めてくれますが、どのポリシーが安全で合法的であり、サービスに適しているかは運営者が判断しなければなりません。会員登録機能を作るときは、AIにコードを依頼する前に「何を収集し、どのように保護し、いつ削除し、どのような根拠で制裁するのか」を先に定義する必要があります。