Upgrade to Pro — share decks privately, control downloads, hide ads and more …

タクシーアプリ『GO』の reCAPTCHA Enterprise 導入

タクシーアプリ『GO』の reCAPTCHA Enterprise 導入

GO TechTalk #26 タクシーアプリ『GO』AndroidでのreCAPTCHA導入・WebADBでの自動化 で発表した資料です。

■ YouTube
https://www.youtube.com/live/QN57jX1P-ik?si=e7nXI9IHJswlfksY&t=1982

■ connpass
https://jtx.connpass.com/event/320032/

GO Inc. dev

June 21, 2024
Tweet

More Decks by GO Inc. dev

Other Decks in Programming

Transcript

  1. © GO Inc. 2 自己紹介 プロフィール写真 正方形にトリミングした写 真を「図形に合わせてトリ ミング」で円形にすると真 円になる

    GO株式会社 ユーザーシステム開発部 / YAMAMOTO Kohei 新卒でIT企業に入社後、Androidエンジニアとして10個以上のサービスリリース を経験してきました。継続的なサービスの成長に携わりたいと思い、2021年8月 にGO株式会社に入社しました。 タクシーアプリ『GO』のAndroidアプリ開発を担当。最近車を買いました。 @farundorl @gyamoto
  2. © GO Inc. 8 SMS認証に潜むリスク • 悪意のあるAPIリクエスト ◦ 過剰なAPIリクエストによるサーバの過負荷 •

    サーバ環境やSMS送信APIなどリソースの悪用 ◦ 多額のサービス利用料が発生
  3. © GO Inc. 9 SMS認証に潜むリスクの対応 • 既存のリスク対応策 ◦ 認証コードの送信回数を制限する ◦

    有効期限の短くする ◦ 認証回数を上限を設定する • 既存の問題点 ◦ アカウントを大量作成されると、SMS送信APIのリソースが悪用 されてしまう
  4. © GO Inc. 10 SMS認証に潜むリスクの対応 • 既存のリスク対応策 ◦ 認証コードの送信回数を制限する ◦

    有効期限の短くする ◦ 認証回数を上限を設定する • 既存の問題点 ◦ アカウントを大量作成されると、SMS送信APIのリソースが悪用 されてしまう これを防ぐために reCAPTCHA Enterprise を導入する (以降はreCAPTCHAと略記)
  5. © GO Inc. 12 reCAPTCHA について • Googleの提供する不正行為を検出する仕組み ◦ ユーザ操作を評価して不正行為を判定する

    ▪ 不正行為の例 • AUTOMATION // 自動化されたエージェントとインタラクションが一致 • UNEXPECTED_ENVIRONMENT // イベントの発生元が不正な環境 • TOO_MUCH_TRAFFIC // イベントのトラフィック量が通常よりも多い ◦ 導入環境に合わせて学習して検出精度が向上する • 2つの検出方式が提供されている ◦ チェックボックス ◦ スコアベース(『GO』のAndroid, iOSに導入)
  6. © GO Inc. • ユーザ操作を必要とするチェックボックス チャレンジを使用して、 ロボットではないことを判定 ◦ 「私はロボットではありません」 ◦

    「〜の画像をすべて選択してください」 • ユーザ操作を妨げてしまう 13 reCAPTCHA のチェックボックス方式
  7. © GO Inc. • ユーザ操作を妨げない ◦ チェックボックスに比べるとユーザの負担が低い ◦ アクセシビリティやコンバージョン率を保つことができる •

    機能はチェックボックスと同等 ◦ Androidの場合、以下の観点でユーザ操作を評価 ▪ アプリ情報(パッケージ名、操作数) ▪ 端末情報(IPアドレス、デバイスID、インストール済みアプリ、   GooglePlay開発者サービスが持つデバイス情報) 14 reCAPTCHA のスコアベース方式
  8. © GO Inc. 17 reCAPTCHA 導入前のシーケンス図 UserApp GO API User

    電話番号入力と SMS送信のアプリ操作 SMS認証APIの呼び出し SMSで認証コードを送信 認証コードの入力
  9. © GO Inc. 18 reCAPTCHA 導入後のシーケンス図 reCAPTCHA UserApp GO API

    SMS認証導線のユーザ操作を集計・評価 評価結果の取得に必要な評価トークンを返す SMS認証APIの呼び出し 評価結果のスコアと理由コードを返す 評価トークンから評価結果を取得 (リスクが低い場合) SMSで認証コードを送信 NEW!! 電話番号入力と SMS送信のアプリ操作 認証コードの入力 User
  10. © GO Inc. 19 reCAPTCHA 実装 • ライブラリの導入とクライアントの初期化 // project

    build.gradle dependencies { implementation 'com.google.android.recaptcha:recaptcha:18.5.1' private lateinit var recaptchaTasksClient: RecaptchaTasksClient /** reCAPTCHAクライアントを生成する。アプリの生存期間中に1回だけおこなう */ private fun initClient() { Recaptcha.getTasksClient(context, RECAPTCHA_KEY_ID) .addOnSuccessListener { recaptchaTasksClient = it } .addOnFailureListener { /* エラーとリトライ表示 */ } }
  11. © GO Inc. 20 reCAPTCHA 実装 • SMS認証APIのリクエスト直前に評価を作成 • 発行された評価用トークンをSMS認証APIで送信し、バックエンド側

    で評価結果を利用する // requestSignUp(phoneNumber) signUpWithRecaptcha(phoneNumber) private fun signUpWithRecaptcha(phoneNumber: String) { recaptchaTasksClient.executeTask(RecaptchaAction.SIGNUP) .addOnSuccessListener { token -> // 評価用トークン `token: String` をSMS認証用APIでバックエンドに送る requestSignUp(phoneNumber, token) } .addOnFailureListener { /* 通信エラー表示 */ } }
  12. © GO Inc. 23 学習期間を設けるべき • reCAPTCHAは学習により精度が上がるため、本番運用をはじめる前 に学習期間を設けるべき • 『GO』では

    7日間の学習期間を設けた。ユーザ操作の評価スコアを 利用せず、学習のみをおこなった ◦ 7日間は高リスク判定の閾値を緩め、全てSMS認証に進める ◦ 8日以降は閾値を更新
  13. © GO Inc. • 人為的な高リスクの再現が難しく、本番同等の テストはできないものと割り切る • 以下のテスト方針とした ◦ reCAPTCHA

    のスコア妥当性は確認しない ◦ SMS認証のエラー時の動作確認のために、 高リスク判定とする閾値を一時的に厳しく ◦ reCAPTCHA の動作確認は別途スコア詳細 を確認する画面を用意した 24 reCAPTCHAのテストはできないものと思え
  14. © GO Inc. • 発生した問題 ◦ サービス運用中に reCAPTCHA Android SDK

    を最新化すると、 スコアのアルゴリズムが更新され、高リスク判定ユーザが増加 ◦ ユーザの問い合わせも増加 • 対応 ◦ ビジネス担当者と相談し、低リスク判定ユーザの数が変わらない 範囲で閾値を調整した 25 定期的に高リスク判定の閾値を見直すべき
  15. © GO Inc. 27 まとめ • 背景 ◦ インバウンド需要 ◦

    タクシーアプリの海外旅行客の増加対応 • 課題と対応 ◦ SMS認証のリスクを抑えるために、不正行為を検出する reCAPTCHA Enterprise を Android/iOS に導入 • 導入結果と運用 ◦ 悪意のあるユーザか不明だが、高リスク判定した場合にSMS送信を停止 ◦ 定期的に高リスク判定の閾値を見直すべき