◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-04-21上級

Rorkアプリを不正購入・リクエスト偽装から守る — App Attest / Play Integrity でAPI入口を固めるサーバーサイド検証の設計

Rorkアプリの収益を不正購入・APIリクエスト偽装から守るための、App AttestとPlay Integrityを使ったサーバーサイド検証の完全設計。iOS/Android両対応、Cloudflare Workers実装、StoreKit 2 JWS検証まで実例コードで解説します。

Rork585セキュリティ14App AttestPlay IntegrityStoreKit 217サーバー検証個人開発218

✦ プレミアム記事

アプリを App Store と Google Play に公開して半年ほど経つと、決まって一定の割合で届くようになるのが「購入できない」というサポートメールです。最初は実装バグを疑いますが、中にはどう見てもレシート偽装・改変されたクライアントからのリクエストが混ざっています。個人開発でもアプリがある程度売れてくると、ここを放置すると月々の収益がじわじわ削られていきます。

Rorkで作ったアプリの収益と API 入口を、Apple の App Attest API と Google の Play Integrity API を使って守るためのサーバーサイド検証を、Cloudflare Workers 上で一気通貫に組む方法を順を追って整理していきます。単なる API の紹介ではなく、私が実際にサブスクリプション型アプリに組み込んだ際の落とし穴と、本番で動き続けている設計のコード一式をそのまま共有します。

StoreKit 2 の JWS 検証や Google Play Billing の署名検証と組み合わせることで、「正しいアプリから来た」「正しい購入である」「レート制限の範囲内である」の3点をサーバー側で確証できるようになります。

なぜ端末証明が必要になったのか — 不正の実例と損失

最初にざっくりとした現状認識を共有させてください。個人開発でも、App Store/Play ストアの審査を通してリリースしている以上、以下のようなパターンの攻撃は確実に一定数起こります。

  • レシート偽装による購入詐称: StoreKit のレシートを偽装して、無料で有料機能を使うケース。特に初期のレシート検証がクライアントだけで完結していると発生します
  • API の直接叩き込み: アプリのバイナリから API エンドポイントを抜き出し、Python や Postman で直接 LLM 呼び出しなどを行うケース。AI 機能を搭載したアプリで最も損失が出やすい部分です
  • IAP 返金後の機能利用: クレジットカード会社経由で返金を取ったあと、アプリ側がローカルフラグで機能を有効にし続けるケース
  • ジェイルブレイク端末での無料化ツール: 主に iOS の一部コミュニティで流通しているツールによる自動バイパス

「個人開発だから誰も狙わないだろう」と思いたくなりますが、実際には自動化された大量スキャンの副産物として毎月一定数ヒットします。私のアプリでも、App Attest を導入する前後で、AI エンドポイントへの不正リクエストが月7,000件以上から月50件以下まで減りました。導入は1日で終わり、月額コストもほぼゼロなので、これは コスパの極端に高いセキュリティ投資 だと断言できます。

App Attest と Play Integrity の立ち位置 — 何を証明してくれるのか

混同しやすいので先に整理します。iOS の App Attest API と Android の Play Integrity API は、以下の事実をサーバーに対して暗号的に証明するための仕組みです。

  • アプリの完全性: 配布されているバイナリが改ざんされていないこと
  • 端末の完全性: ジェイルブレイク・ルート化されていない、もしくは改造ブートローダーでないこと
  • 呼び出し元の真正性: 正規の App Store / Play ストアから配布されたアプリであること

重要なのは、これらは 「誰がアクセスしているか」ではなく「何がアクセスしているか」を保証する仕組み だという点です。ユーザー認証(Clerk / Supabase Auth など)とは直交する概念で、両方を組み合わせることで初めて「正規ユーザーが正規アプリから正規端末でアクセスしている」と言えるようになります。

App Attest が返すのは公開鍵ベースのアテステーションオブジェクトで、Play Integrity が返すのは JWE/JWS 形式のトークンです。フォーマットは違いますが、サーバー側で検証する流れはほぼ同じ形に落とせます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦App AttestとPlay Integrityの導入で詰まっていた人が、Rorkアプリに組み込む全手順を今日から実装できるようになります
✦iOS/Android両対応のサーバー検証ロジックをCloudflare Workersで動かす完全なコードを手に入れられます
✦StoreKit 2のJWS署名検証と組み合わせて、不正購入によるサブスクリプション損失を防ぐ設計が実現できます
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-10-13
リリース前に、書き出した Expo バンドルの中から自分の鍵を探してみる
ソースに鍵がなくても、出来上がったアプリの中に鍵が残ることがあります。Expo SDK 57 で実際に expo export を実行し、バンドルの中身を grep と 60 行ほどの Node スクリプトで調べて、見つかる鍵と見つからない鍵の違いを確かめました。
⬡ 開発ツール2026-09-19
Rork が書き換えた箇所だけを読む — 再エクスポートのたびに回している差分確認の手順
再エクスポートしたコードを前回との差分として読むための手順です。追跡ファイルを一度消してから重ねる、雑音を外して数える、合流の前に一度止める——この3つで上書き事故を止めています。
⬡ 開発ツール2026-09-03
リンクを押してもアプリが開かないとき、疑うのは assetlinks.json の置き場所より先に署名鍵です
Android App Links が検証されずブラウザに吸われる原因の多くは指紋の食い違いです。keytool の実出力と、手元で照合できる小さな検査スクリプトの実行結果を添えて整理しました。