
APIキーをアプリの中に直接書いていた ― 公開前に全部サーバーへ移した話
AIと英語で話せるアプリを作りました。コードは書けません。ノーコードのツールを使っています。
作り始めたころ、私はAIのAPIキーを、アプリの中に直接書いていました。
const apiKey = 'sk-proj-ここに長い文字列';
こういう行が、アプリのあちこちに入っていました。10箇所です。
これが危ないと知ったのは、だいぶ後になってからでした。
なぜ危ないのか
APIキーというのは、AIのサービスを使うための鍵です。これを持っている人は、私の代わりにAIを呼べます。そして料金は私に請求されます。
私はこう思っていました。
アプリの中に書いてあるだけなんだから、 見えないんじゃないか
見えます。
アプリは配布すると、中身を取り出せます。専門的な作業が必要なわけでもなく、やり方は調べればすぐ出てきます。つまり**公開した瞬間に、鍵を配っているのと同じ**です。
盗まれるとどうなるか。他人が私のキーで好きなだけAIを使って、請求だけ私に来ます。気づくのは、料金の通知が届いたときです。
さらにまずかったこと
書いた場所は、コードの中だけではありませんでした。
通信の設定を登録する画面があるのですが、そこにも同じキーを平文で入れていました。こちらも5箇所。
**しかも、作業中の画面をスクリーンショットに撮っていました。**
後から確認したら、キーが写り込んでいるものがありました。そのときは外部に出していなかったので事なきを得ましたが、記事に貼ったり人に送ったりしていたら、それで終わりでした。
キーは「書かない」だけでなく「写さない」も要ります。
どう直したか、考え方はこうです。
**キーをアプリから全部消して、自分のサーバーに置く。**
アプリは、AIのサービスを直呼ぶのをやめます。代わりに自分のサーバーを呼びます。サーバーがキーを持っていて、AIを呼んで、結果をアプリに返す。
【前】アプリ → AIのサービス(キーはアプリの中)
【後】アプリ → 自分のサーバー → AIのサービス(キーはサーバーの中)
サーバーの中身は配布されないので、キーは外に出ません。
私はFirebaseのCloud Functionsというものを使いました。常時動かすサーバーを借りるのではなく、呼ばれたときだけ動く仕組みです。使った分だけの料金なので、個人でも現実的でした。
キーそのものは、専用の保管場所(Secret Manager)に入れました。コードの中には一切書きません。
作業の中身
やったことを並べると、こうなります。
**1. サーバー側を作る**
AIを呼ぶ処理を、サーバー側に書き直しました。会話の生成、音声の読み上げ、音声の文字起こし、日本語訳。この4つです。
**2. キーを保管場所に登録する**
コマンドを1行打って登録します。これ以降、コードの中でキーを見ることはありません。
**3. アプリ側を1件ずつ書き換える**
ここが一番長かったです。全部で10箇
所。AIを直接呼んでいた部分を、自分のサーバーを呼ぶ形に書き換えていきます。
**4. 古いキーを無効にする**
全部移し終わってから、元のキーを無効化して、新しいキーを作り直しました。
一度でも外に出た可能性があるキーは、作り直すのが確実です。
ここで3日ハマった
キーを新しくした後、アプリを動かしたらマイクが反応しなくなりました。
音声を録音して、文字に起こして、AIに渡す。この流れのどこかが止まっている。マイクの権限を疑い、録音の設定を疑い、端末を変えて試しました。
原因は、全然違うところにありました。
**書き換えの作業で、1箇所だけ取りこぼしていました。**
文字起こしの処理の中に、古いキーが直書きのまま残っていたのです。そのキーはもう無効にしてあるので、呼んでも弾かれます。
弾かれた結果、文字起こしの結果が空になり、アプリ側からは「マイクが反応していない」ように見えていました。
**原因の場所と、症状が出る場所は違うことがあります。
** 私はマイクの周りをずっと調べていました。
その後、こういう確認の仕方に変えました。
コードを1件ずつ開いて、
「sk-」という文字が残っていないか目で見る
地味ですが、これが一番確実でした。10件なら10分で終わります。
移してみて、良かったこと
セキュリティのためにやった作業でしたが、別の利点がありました。
**AIへの指示を変えるのに、アプリの作り直しが要らなくなりました。**
AIにどう振る舞ってほしいかを書いた文章(システムプロンプト)も、一緒にサーバー側へ移しました。
前は、この文章を1文字直すたびに、アプリをビルドし直して、端末に入れ直して、という手順が必要でした。1回20分くらいかかります。
今はサーバー側を更新するだけです。コマンドを1行打てば、その場で反映されます。
会話の質を良くする作業は、文章を少し変えては試す、の繰り返しです。ここが20分から1分になったのは、作業の進み方が変わるくらいの差でした。
**セキュリティのためにやったことが、開発の速度を上げました。**
もし今、キーを直書きしている方がいたら、危ないからという理由だけでなく、この利点のためにも移す価値があります。
まとめ
・APIキーをアプリの中に書くと、配布した時点で読み取られる
・スクリーンショットへの写り込みにも注意する
・直すなら、アプリ → 自分のサーバー → AIのサービス、という形にする
・キーはコードに書かず、専用の保管場所に入れる
・全部移し終わってから、古いキーを無効にして作り直す
・取りこぼしが1件あると、まったく別の症状に化ける。「sk-」で目視確認する
・AIへの指示もサーバー側に置くと、直すたびのビルドが要らなくなる
私は作り始めてから半年くらい、直書きのまま進めていました。公開する前に気づいてよかったです。
同じところで止まっている人の役に立てば。
※ このアプリは Sumi といいます。よかったら触ってみてください。
https://play.google.com/store/apps/details?id=com.givehopestudio.sumi