メインコンテンツへスキップ
見出し画像

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

    あなたへのおすすめ