【第9回】セキュリティ・退会機能編:ユーザー保護は妥協しない!データ完全消去への道

はじめに
皆様、こんにちは。『ねむりのガチャ』アプリ開発記の第9回です。
前回までにアプリの全機能が完成し、バグの修正も終えました。しかし、Webサービスとして世界に公開する前に、絶対に妥協してはいけない最後の総仕上げがあります。それが「セキュリティ強化」と「退会(データ消去)機能」の実装です。
ユーザーの大切な情報を預かる以上、安全にデータを管理し、ユーザー自身が望んだときに完全にデータを消去できる仕組みを用意するのは開発者の義務です。今回は、データの完全消去を実現する退会ロジックと、思わぬ情報漏洩を防ぐための設定について解説します。

鉄則:退会処理は「データベース」と「認証」の2本立て
アプリを退会する際、単に画面からログインできなくするだけでは不十分です。裏側のデータベースにはユーザーのポイントやガチャの履歴が残り続けてしまいます。
完全な退会処理を実現するため、フロントエンドとバックエンドを連携させた「2段階の削除フロー」を設計しました。

確認ダイアログの表示:ユーザーが「退会する」ボタンを押すと、まず window.confirm で「本当に退会しますか?データはすべて消去されます」と最終確認を行います。

D1データベースからの完全削除:承認されると、まずはバックエンド(Cloudflare Pages Functions)に作成した DELETE APIを呼び出します。ここでリクエスト元のFirebase UIDを検証し、紐づくすべてのデータ(ユーザー情報、ガチャ履歴など)をCloudflare D1から DELETE 文で物理削除します。

Firebase認証アカウントの削除:データベースの削除が成功したことを確認したのち、最後にフロントエンド側で deleteUser(auth.currentUser) を実行し、Firebase上の認証アカウントそのものを消し去ります。

この順序を守ることで、「認証アカウントは消えたのにデータベースにゴミデータが残ってしまった」という不整合を完全に防ぐことができます。

セキュリティの壁:「最近のログインが必要です」
退会機能のテスト中、Firebase特有の強固なセキュリティ機構に直面しました。
長時間ログインしたままの状態で退会処理を行おうとすると、auth/requires-recent-login というエラーで弾かれてしまったのです。これは、「放置されたスマートフォンを他人が勝手に操作してアカウントを削除する」という悪意ある操作を防ぐため、重大な変更の前には直近のログイン(再認証)を要求する仕様でした。
エラーが発生した場合は、一度ログアウトして再ログインを促すか、自動的に再認証のポップアップを出すフローを追加することで、安全かつスムーズに処理を完結させることができました。
(あわせて、Firebaseの sendPasswordResetEmail を使ったパスワード再設定機能も実装し、ユーザーサポートの基盤を固めました。)

.assetsignore で内部ファイルを隠蔽する
もう一つ、公開直前のテスト環境でヒヤリとした出来事がありました。
デプロイ(アップロード)を行った際、開発ツールの権限設定ファイルが含まれる .claude/ ディレクトリや、Mac特有の隠しファイル .DS_Store が、誤って静的アセットとして公開サーバーにアップロードされそうになったのです。
機密のAPIキーなどは含まれていなかったものの、内部設定の公開はセキュリティリスクに繋がります。そこで、プロジェクト直下に .assetsignore ファイルを新規作成し、これらのディレクトリやファイルを除外するよう設定しました。再度デプロイし、当該URLが「404 Not Found」になることを確認して、無事に情報漏洩の穴を塞ぐことができました。

まとめ
今回は、ユーザー保護に欠かせない退会機能の実装と、デプロイ前のセキュリティ対策についてお話ししました。
派手な機能ではありませんが、こうした「見えない部分の丁寧な作り込み」こそが、ユーザーに安心して使ってもらえるアプリの条件です。すべての準備が整いました。次回【第10回】は、ついにこのアプリを全世界へ公開(デプロイ)し、次なる「自動計測アプリ」への夢を語る最終回です!

【編集後記】
「退会機能」は、作る側からすると少し寂しい機能ですし、テストのために何度も自分のテストアカウントを作っては消すという地味な作業が続きます(笑)。しかし、この「自分のデータをいつでも完全に消せる」という透明性があるからこそ、ユーザーは安心して最初の「登録」ボタンを押すことができます。
.assetsignore によるファイル隠蔽も、静的サイトホスティングでは本当に「あるある」の事故なので、本番公開前に気付けて心底ホッとしました。戸締まりは完璧です。いよいよ次でリリースボタンを押します!