本文へ移動

ホーム / App / 第5部 品質・配信・運用

第5部 品質・配信・運用・第13章

セキュリティとプライバシー

★★☆ 重要6トピック・面接 4問

ユーザーの端末とデータを守るための、アプリ特有のルールと実装を押さえる。

13.1権限の求め方

用語★★☆ 重要
ひとことで

カメラ・位置情報などは必要なときに理由を伝えて求める。ストアのプライバシーの表示も必要。

スマホには位置情報・写真・連絡先・カメラなど個人の情報が集まっているので、OS もストアもプライバシーに厳しいルールを設けています。権限は必要になった場面で、理由を見せてから求めるのが基本です。起動直後にまとめて求めると断られやすく、一度断られると OS の設定画面からしか変えてもらえません。

使う場面で、理由を見せてから求める機能を使う場面理由を自分の画面で説明OS の確認画面許可機能を使う拒否代わりの画面・設定へ案内起動直後にまとめて求めない。一度断られると、OS の設定画面からしか変えてもらえない
権限は使う場面で理由を見せてから求め、断られたときの画面も用意する
Android の権限で気をつけること内容
実行時の許可危険な権限は使う場面で求める。断られたときの画面も作る
写真全部の写真を読む権限ではなく、写真選択ツール(Photo Picker)を使うと権限なしで選んでもらえる
位置情報おおよその位置で足りるならそれだけを。裏での位置情報は特に厳しく審査される
通知Android 13 以降は通知にも許可が必要

面接ではこう答える

スマホの権限は、必要になった場面で理由を見せてから求めるのが基本です。起動直後にまとめて求めると断られやすく、一度断られると OS の設定画面からしか変えてもらえないので、断られたときの画面も用意します。Android では写真は Photo Picker を使えば権限なしで選んでもらえ、位置情報はおおよその位置で足りるならそれだけにし、13 以降は通知にも許可が要ります。

ひとことで

ATT は他社のアプリやサイトをまたいで追跡する前に許可を求める iOS の仕組み。断られたら IDFA も他の追跡もしてはいけない。

iOS には、権限のほかにも、プライバシーのために用意するものがいくつかあります。

iOS で用意するプライバシーの3点ATT の確認画面他社をまたぐ追跡の前に許可を求めるストアのプライバシーの表示集めるデータの申告(栄養成分ラベル)プライバシーマニフェストPrivacyInfo.xcprivacySDK の分も含める入れている SDK が集めるデータも、自分のアプリの申告に含める
確認画面・ストアでの申告・API を使う理由の申告がそろって審査を通る

ATT(App Tracking Transparency)は、他社のアプリや Web サイトをまたいで利用者を追跡する(広告の ID の IDFA を使う、他社とデータを結びつけるなど)前に、許可を求めなければならない仕組みです。ATTrackingManager.requestTrackingAuthorization で確認画面を出し、Info.plist に理由(NSUserTrackingUsageDescription)を書きます。断られたら IDFA は使えず、別の方法で追跡してもいけません。

iOS ではほかに、ストアのページのプライバシーの表示(集めるデータの申告)と、アプリや SDK が使う特定の API の理由を書くプライバシーマニフェスト(PrivacyInfo.xcprivacy)が必要です。

面接ではこう答える

ATT は App Tracking Transparency の略で、他社のアプリや Web サイトをまたいで利用者を追跡する前に、確認画面で許可を求めなければならない iOS の仕組みです。広告の ID の IDFA を使う場合などが対象で、断られたら IDFA は使えず、別の方法で追跡してもいけません。iOS ではほかに、ストアのページで集めるデータを申告するプライバシーの表示と、特定の API を使う理由を書くプライバシーマニフェストが必要で、入れている SDK の分も含めます。

ひとことで

Google Play で、集めるデータ・目的・共有・削除の可否を申告する欄。SDK が集めるデータも含め、実際と合わせる。

Google Play のストアのページで、アプリが集めるデータを利用者に見せる欄です。

Google Play では、ストアのページにデータの安全性の欄があり、集めるデータの種類・目的・他社への共有・暗号化して送っているか・削除を頼めるかを申告します。自分のコードだけでなく、入れている SDK(分析・広告など)が集めるデータも含めます。申告と実際が違うと、更新が止められることがあります。

入れる SDK を選ぶときは、何のデータを集めるかを必ず確かめます。申告の更新を忘れやすいので、SDK を足したらチェックする手順をリリースの作業に入れておきます。

申告する項目例
集めるデータの種類位置情報・連絡先・写真・アプリの操作の記録・端末の ID
目的アプリの機能・分析・広告・不正の防止
他社への共有広告や分析の SDK を通して送っているか
安全への取り組み送るときの暗号化、削除を頼めるか

面接ではこう答える

データの安全性セクションは、Google Play のストアのページで、アプリが集めるデータの種類、目的、他社への共有、送るときの暗号化、削除を頼めるかを利用者に見せる欄です。自分のコードだけでなく、分析や広告の SDK が集めるデータも含めて申告し、申告と実際が違うと更新が止められることがあります。SDK を足したら申告を見直す手順を、リリースの作業に入れておきます。

ひとことで

アプリは配布物なので中身を解析されうる。秘密はアプリに入れず、大事な判定はサーバーで行う。

配ったアプリ(iOS の IPA・Android の APK や AAB)は、利用者の手元にあるので、中身を解析される前提で考えます。Android はツールでほぼ元のコードに近い形に戻せ、iOS も文字列やクラス名は読めます。

対策できること限界
難読化(R8 など)名前を読みにくくし、解析の手間を増やす処理の流れや文字列は残る
アプリの中の改ざん検知簡単な改造や脱獄・root の端末を見つける検知の結果ごと書き換えられる
サーバーでの証明の検証本物のアプリ・端末からの通信かを確かめるOS の仕組みに頼る。端末の条件で使えない場合もある
秘密をアプリに入れない漏れても困らない設計にする設計の手間が増える

難読化の限界

Android の R8 はクラスや関数の名前を短い記号に変え、使っていないコードを消します。読みにくくはなりますが、処理の流れや文字列(URL・API キー)は残り、時間をかければ読めます。難読化は「手間を増やす」ものであって、秘密を守る仕組みではありません。

面接ではこう答える

配ったアプリは利用者の手元にあるので、中身を解析される前提で考えます。Android はツールで元のコードに近い形に戻せ、iOS も文字列やクラス名は読めます。R8 などの難読化は名前を読みにくくして手間を増やすだけで、処理の流れや URL・API キーのような文字列は残るので、秘密を守る仕組みではありません。なので秘密はアプリに入れず、大事な判定はサーバーで行う設計にします。

13.5App Attest・Play Integrity

用語★★☆ 重要
ひとことで

OS の仕組みでアプリと端末が本物かを証明してもらい、その証明をサーバーで検証する。アプリの中だけの判定は書き換えられる。

改造したアプリや端末からの不正な通信をどう見分けるか、という話です。

判定はサーバーで。アプリは証明を付けて送るだけアプリOS が証明を作るApp Attest・Play Integrity証明付きで送るサーバーが検証判断はここアプリの中だけの判定(脱獄・root の検出)は、Frida などで結果を書き換えられる
改ざんの判定はアプリの中ではなく、OS の証明をサーバーで検証して行う

脱獄・root 化した端末や、改造したアプリを見つける方法もあります。ただし、アプリの中だけで判定する仕組みは、Frida などのツールで判定の結果を書き換えられてしまいます。より確かなのは、OS の仕組みでアプリと端末が本物かを証明してもらい、サーバー側で検証する方法です。iOS は App Attest(DeviceCheck)、Android は Play Integrity API を使います。不正なリクエストを判断するのはサーバーで、アプリは「証明を付けて送る」だけにします。

面接ではこう答える

改造したアプリや脱獄・root 化した端末を、アプリの中だけで見つける仕組みは、Frida などのツールで判定の結果を書き換えられてしまいます。より確かなのは、iOS の App Attest や Android の Play Integrity API のように、OS の仕組みでアプリと端末が本物だと証明してもらい、その証明をサーバーで検証する方法です。アプリは証明を付けて送るだけにし、不正かどうかの判断はサーバーが行います。

ひとことで

漏れたら困るキーはアプリに入れず、サーバーに置いて中継する。公開前提のキーは使える範囲を絞る。

アプリに入れた文字列は、難読化しても取り出せます。なので、漏れたら困るキーはアプリに入れないのが原則です。

秘密のキーはアプリに入れないアプリ利用者のトークンだけ自社のサーバーキーを持つ・回数を制限外部の API決済・AI などキーを付けるアプリに入れたキーは、時間をかければ必ず取り出される前提で考える
外部の API のキーはサーバーに置き、アプリは自社のサーバー経由で呼ぶ
キーの種類アプリに入れてよいかやり方
決済・AI・メール送信など、使うとお金や権限が動くキー入れない自社のサーバーに置き、アプリはサーバー経由で呼ぶ。回数の制限もサーバーで
地図・分析の SDK のように公開前提のキー入れてよい(漏れる前提)使えるアプリ(バンドル ID・署名)や API を絞る設定をする
自社 API のアクセストークン利用者ごとに発行したものだけログインで受け取り、Keychain・Keystore に保存

キーをビルドの設定やリポジトリに書いていないかも確かめます。リポジトリに入ったキーは、消しても履歴に残るので、作り直して古いものを無効にします。

面接ではこう答える

アプリに入れた文字列は難読化しても取り出せるので、決済や AI のようにお金や権限が動くキーはアプリに入れず、自社のサーバーに置いて、アプリはサーバー経由で呼びます。サーバーなら利用者ごとの回数の制限もかけられます。地図や分析の SDK のように公開前提のキーは入れてよいですが、使えるアプリや API を絞る設定をします。リポジトリに入ってしまったキーは作り直して古いものを無効にします。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 権限の求め方と、ATT・プライバシーマニフェスト
  • 端末に残るデータとリバースエンジニアリングへの対策
  • 権限の求め方:カメラ・位置情報などは必要なときに理由を伝えて求める。ストアのプライバシーの表示も必要。
  • ATT とプライバシーマニフェスト(iOS):ATT は他社のアプリやサイトをまたいで追跡する前に許可を求める iOS の仕組み。断られたら IDFA も他の追跡もしてはいけない。
  • データの安全性セクション(Google Play):Google Play で、集めるデータ・目的・共有・削除の可否を申告する欄。SDK が集めるデータも含め、実際と合わせる。
  • 解析・改ざんへの対策:アプリは配布物なので中身を解析されうる。秘密はアプリに入れず、大事な判定はサーバーで行う。
  • App Attest・Play Integrity:OS の仕組みでアプリと端末が本物かを証明してもらい、その証明をサーバーで検証する。アプリの中だけの判定は書き換えられる。
  • API キーと秘密をアプリに入れない:漏れたら困るキーはアプリに入れず、サーバーに置いて中継する。公開前提のキーは使える範囲を絞る。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1アプリに API キーを入れてよいですか?

模範回答

アプリに入れたものは読まれる前提で考えるので、漏れて困るキーは入れません。アプリは利用者の手元にあり、解析すれば文字列は取り出せますし、難読化も手間を増やすだけです。外部の有料 API の秘密のキーや、管理者の権限を持つキーは、自社のサーバーに置き、アプリはサーバー経由で使います。サーバー側では利用者の認証やレート制限をかけられます。

一方で、地図や分析の SDK のように、もともとアプリに入れる前提のキーもあります。これらは読まれても被害が小さくなるよう、使えるアプリ(バンドル ID・署名)やドメインを制限し、使える量に上限を付けます。さらに不正な利用を防ぎたいなら、App Attest や Play Integrity でアプリが本物であることの証明を付けて送り、サーバーで検証します。キーが漏れたときに差し替えられるよう、サーバーから配る形にしておくのも有効です。

深掘りされたら

  • Firebase の設定ファイルに入っているキーは秘密ですか?
  • キーが漏れたと分かったらどうしますか?

見られているポイント入れたものは読まれる前提での設計

Q2権限を求めるタイミングと、断られたときの対応は?

模範回答

権限は、それを使う場面で、理由を自分の画面で先に説明してから求めます。起動直後にまとめて求めると、何に使うか分からず断られやすいからです。一度断られると、OS の設定画面からしか変えてもらえないので、最初の1回を大事にします。

断られても、アプリが使えなくならないようにします。写真なら写真選択ツールを使えば権限なしで選んでもらえますし、位置情報なら手で地域を選べるようにします。どうしても必要な機能では、設定画面へ案内するボタンを出します。

深掘りされたら

  • Android の写真選択ツールの利点は?
  • おおよその位置で足りるのはどんなときですか?

見られているポイント利用者の立場で、断られた後まで考えているか

Q3iOS の ATT と、Google Play のデータの安全性セクションとは何ですか?

模範回答

ATT(App Tracking Transparency)は、他社のアプリや Web サイトをまたいで利用者を追跡する前に、許可を求めなければならない iOS の仕組みです。広告の ID である IDFA を使うときなどに確認画面を出し、断られたら IDFA は使えず、別の方法で追跡してもいけません。

データの安全性セクションは、Google Play のストアのページで、集めるデータの種類・目的・他社への共有・削除を頼めるかなどを申告する欄です。どちらも、自分のコードだけでなく入れている SDK が集めるデータも含めて考える必要があり、SDK を足したら申告を見直します。

深掘りされたら

  • プライバシーマニフェストとは何ですか?
  • 申告と実際が違うとどうなりますか?

見られているポイント追跡の許可と、集めるデータの申告の違い

Q4改造したアプリからの不正なリクエストを防ぐにはどうしますか?

模範回答

アプリの中だけで脱獄や改ざんを判定しても、その判定ごと書き換えられるので、それだけには頼りません。iOS の App Attest や Android の Play Integrity API で、アプリと端末が本物だという証明を受け取り、リクエストに付けて送り、サーバー側で検証します。

そのうえで、大事な判定(ポイントの付与・価格・回数の制限)はすべてサーバーで行い、アプリから送られた値を信用しない設計にします。証明が取れない端末もあるので、いきなり全部を拒否せず、怪しいものは追加の確認や制限にとどめるなど、段階的に扱います。

深掘りされたら

  • Play Integrity の結果が取れない端末はどう扱いますか?

見られているポイントサーバー側での検証と、アプリを信用しない設計