RORK LABEN
ENGINE — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、ネイティブSwiftアプリを直接生成しますCORE ML — Rork MaxからCore MLの端末内推論・HealthKit・HomeKit・NFC・App Clipsといった機能に手が届きますSEED — Rorkは2026年4月にLeft Lane Capital主導で$15Mのシードを調達し、Peak XVやa16z Speedrunが参加しましたM&A — Rorkはアプリビルダー Paperline を買収し、エンジニアリング人材の獲得を目的に買収を継続する方針ですMARKET — Gartnerは2026年末までに新規アプリの75%がローコードまたはノーコードで作られると予測していますGROWTH — ノーコードAI市場は2024年の$4.9Bから2029年に$24.8Bへ、年38.2%の成長が見込まれていますENGINE — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、ネイティブSwiftアプリを直接生成しますCORE ML — Rork MaxからCore MLの端末内推論・HealthKit・HomeKit・NFC・App Clipsといった機能に手が届きますSEED — Rorkは2026年4月にLeft Lane Capital主導で$15Mのシードを調達し、Peak XVやa16z Speedrunが参加しましたM&A — Rorkはアプリビルダー Paperline を買収し、エンジニアリング人材の獲得を目的に買収を継続する方針ですMARKET — Gartnerは2026年末までに新規アプリの75%がローコードまたはノーコードで作られると予測していますGROWTH — ノーコードAI市場は2024年の$4.9Bから2029年に$24.8Bへ、年38.2%の成長が見込まれています
記事一覧/開発ツール
開発ツール/2026-07-10上級

クライアントに置いた鍵は公開情報 — Rork 生成アプリの秘密境界とローテーション手順

生成された Expo アプリの .ipa を展開すると、環境変数がそのまま文字列として現れます。鍵を3層に分類し、置けないものをプロキシへ逃がし、漏れた前提のローテーション手順書を用意するまでの設計をまとめます。

Rork497セキュリティ13Expo138環境変数4運用設計6

プレミアム記事

ビルド済みの .ipa を手元で展開し、strings を通したのは、ある夜のことでした。

出力の中に、自分が EXPO_PUBLIC_ANALYTICS_KEY と名付けた文字列がそのまま並んでいました。難読化もエンコードもされていません。ビルドから抽出まで、かかった時間は10秒ほどです。

頭では知っていたはずのことでした。それでも、自分のアプリのバイナリから自分の鍵が読み上げられるのを目で見た瞬間、背筋が冷えました。

個人開発で6本のアプリを並行して運用していると、鍵の本数はすぐに二桁になります。広告、課金、分析、クラッシュレポート、翻訳 API。生成 AI にアプリの骨格を書いてもらうと、それらの初期化コードは驚くほど素早く揃います。ただし「その鍵をどこに置くべきか」という判断だけは、生成物の外側に残されたままです。

この記事は、その判断を自分の中で言語化し、6本のアプリに一巡させた記録です。

クライアントに置いた鍵は、暗号ではなく公開情報

まず前提を固めます。モバイルアプリのバンドルは、ユーザーの端末に配布される時点で「読める状態」になります。

Expo(React Native)であれば JavaScript バンドルの中に、Swift であればバイナリの文字列テーブルの中に、鍵は文字列として存在します。難読化はコストを上げますが、境界にはなりません。

実際に確認してみるのが最短です。手元のビルド成果物に対して次を実行します。

# iOS: .ipa は zip なので展開してバイナリに strings を通す
unzip -q MyApp.ipa -d /tmp/ipa
strings /tmp/ipa/Payload/MyApp.app/MyApp | grep -iE 'key|secret|token' | head -20
 
# Expo(JS バンドル): バンドル本体を直接 grep する
grep -oE 'EXPO_PUBLIC_[A-Z_]+"[^"]*"' /tmp/ipa/Payload/MyApp.app/main.jsbundle | head -20
 
# Android: apk からも同様に取り出せる
unzip -q app-release.apk -d /tmp/apk
strings /tmp/apk/classes.dex | grep -iE 'AIza|sk_live|pk_live' | head

この3コマンドで、自分のアプリが何を公開しているかが分かります。私はこれを、新しいアプリをストアに出す前の儀式にしました。

ここで見つかった文字列は、すべて「公開情報」です。隠すのではなく、公開されても損害が出ない設計にするしかありません。

鍵を3つの層に分類する

「秘密かどうか」の二択で考えると判断が止まります。実運用では3層に分けると、置き場所が自動的に決まります。

性質 具体例 置き場所 漏洩時の影響
層1: 公開識別子 そもそも秘密ではない AdMob アプリ ID / ユニット ID、RevenueCat の公開 SDK キー、Sentry DSN クライアントに直書きで可 実質なし(悪用は別の防御層で止める)
層2: 制限付き公開鍵 公開前提だが制約が必須 Firebase Web API キー、Maps API キー、分析の書き込み専用キー クライアント可。ただし発行元でバンドル ID・リファラ・スコープを制限する 制限が甘い場合のみ従量課金の被害
層3: 真の秘密 持つ者がサーバーとして振る舞える OpenAI / Gemini の API キー、Stripe シークレットキー、RevenueCat のシークレット API キー、Supabase の service_role キー クライアント禁止。サーバー / エッジ関数のみ 課金の直撃、データ全件の読み書き

判定に迷ったときの問いはひとつです。「その鍵を持った他人が、私の代わりに課金できるか、私のデータを全件読めるか」。答えが「はい」なら層3であり、EXPO_PUBLIC_ を頭に付けた瞬間に負けが確定します。

層2で最も見落とされやすいのは、発行元での制限です。Google Cloud のコンソールでキーに「アプリケーションの制限(Android パッケージ名 / iOS バンドル ID)」と「API の制限(このキーで叩ける API の列挙)」を設定していない鍵は、層2のふりをした層3です。

環境変数そのものの読み込みでつまずいている段階であれば、先にRork で環境変数が読み込まれないときの原因と対処を確認しておくと、この先の話が地続きになります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
アプリバンドルから環境変数を実際に抽出して確認する手順と、その結果に基づく鍵の3層分類
クライアントに置けない鍵をエッジプロキシへ逃がす、そのまま動く実装とレート制限の考え方
「漏れている前提」で回すキーローテーション手順書と、CI で再発を止める検査スクリプト
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-27
無料プレビューがスクショで丸ごと持ち出される前に — Rork/Expo でスクリーンショットと画面収録を検知して目隠しする設計
Rork/Expo アプリで有料プレビュー画像をスクリーンショットと画面収録から守る実装。expo-screen-capture の限界、isCaptured のネイティブ監視、iOS/Android の差を踏まえた目隠し設計を解説します。
開発ツール2026-06-22
Rork(Expo)生成アプリに OpenAI の鍵を直書きすると抜かれます — Workers で薄い中継を1枚挟む設計
Rork が生成した Expo アプリに OpenAI や Gemini の API キーをそのまま埋め込むと、ビルド済みアプリから抜き取られます。なぜ「アプリに入れた鍵」は秘密にならないのかを整理し、Cloudflare Workers で鍵を隠す最小の中継、濫用対策、審査不要の鍵ローテーションまでを実装で示します。
開発ツール2026-06-16
Expo のプッシュ通知トークンを本番で取りこぼさないために整えたこと
Rork で生成した Expo アプリに再訪促進のプッシュ通知を入れたところ、配信数がアクティブ数より明らかに少ない事態に直面しました。原因はトークンの取りこぼしと失効放置でした。取得から更新、サーバー保存、失効掃除までの運用設計を実装コード付きで記録します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →