Slide 1

Slide 1 text

タクシーアプリ『GO』の reCAPTCHA Enterprise 導入 2024.06.18 YAMAMOTO Kohei GO株式会社

Slide 2

Slide 2 text

© GO Inc. 2 自己紹介 プロフィール写真 正方形にトリミングした写 真を「図形に合わせてトリ ミング」で円形にすると真 円になる GO株式会社 ユーザーシステム開発部 / YAMAMOTO Kohei 新卒でIT企業に入社後、Androidエンジニアとして10個以上のサービスリリース を経験してきました。継続的なサービスの成長に携わりたいと思い、2021年8月 にGO株式会社に入社しました。 タクシーアプリ『GO』のAndroidアプリ開発を担当。最近車を買いました。 @farundorl @gyamoto

Slide 3

Slide 3 text

© GO Inc. 3 01|背景 02|reCAPTCHA について 04 | 導入結果 03|SMS認証に reCAPTCHA 導入

Slide 4

Slide 4 text

© GO Inc. 4 01 背景

Slide 5

Slide 5 text

© GO Inc. ● 日本を訪れる海外旅行客の増加 ○ 移動手段の需要も増加 5 インバウンド需要 https://www.nikkei.com/article/DGXZQOUA170F20X10C24A1000000/ https://www3.nhk.or.jp/news/html/20240105/k10014309421000.html

Slide 6

Slide 6 text

© GO Inc. 6 タクシーアプリの海外旅行客の増加対応 ● アプリを日本語以外に英語にも対応 ● 日本以外の国でもアプリを配信 ● 海外発行のクレジットカード登録に対応 ● 海外発行の電話番号でのSMS認証に対応

Slide 7

Slide 7 text

© GO Inc. 7 タクシーアプリの海外旅行客の増加対応 ● アプリを日本語以外に英語にも対応 ● 日本以外の国でもアプリを配信 ● 海外発行のクレジットカード登録に対応 ● 海外発行の電話番号でのSMS認証に対応

Slide 8

Slide 8 text

© GO Inc. 8 SMS認証に潜むリスク ● 悪意のあるAPIリクエスト ○ 過剰なAPIリクエストによるサーバの過負荷 ● サーバ環境やSMS送信APIなどリソースの悪用 ○ 多額のサービス利用料が発生

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

© GO Inc. 10 SMS認証に潜むリスクの対応 ● 既存のリスク対応策 ○ 認証コードの送信回数を制限する ○ 有効期限の短くする ○ 認証回数を上限を設定する ● 既存の問題点 ○ アカウントを大量作成されると、SMS送信APIのリソースが悪用 されてしまう これを防ぐために reCAPTCHA Enterprise を導入する (以降はreCAPTCHAと略記)

Slide 11

Slide 11 text

© GO Inc. 11 02 reCAPTCHA について

Slide 12

Slide 12 text

© GO Inc. 12 reCAPTCHA について ● Googleの提供する不正行為を検出する仕組み ○ ユーザ操作を評価して不正行為を判定する ■ 不正行為の例 ● AUTOMATION // 自動化されたエージェントとインタラクションが一致 ● UNEXPECTED_ENVIRONMENT // イベントの発生元が不正な環境 ● TOO_MUCH_TRAFFIC // イベントのトラフィック量が通常よりも多い ○ 導入環境に合わせて学習して検出精度が向上する ● 2つの検出方式が提供されている ○ チェックボックス ○ スコアベース(『GO』のAndroid, iOSに導入)

Slide 13

Slide 13 text

© GO Inc. ● ユーザ操作を必要とするチェックボックス チャレンジを使用して、 ロボットではないことを判定 ○ 「私はロボットではありません」 ○ 「〜の画像をすべて選択してください」 ● ユーザ操作を妨げてしまう 13 reCAPTCHA のチェックボックス方式

Slide 14

Slide 14 text

© GO Inc. ● ユーザ操作を妨げない ○ チェックボックスに比べるとユーザの負担が低い ○ アクセシビリティやコンバージョン率を保つことができる ● 機能はチェックボックスと同等 ○ Androidの場合、以下の観点でユーザ操作を評価 ■ アプリ情報(パッケージ名、操作数) ■ 端末情報(IPアドレス、デバイスID、インストール済みアプリ、   GooglePlay開発者サービスが持つデバイス情報) 14 reCAPTCHA のスコアベース方式

Slide 15

Slide 15 text

© GO Inc. 15 03 SMS認証に reCAPTCHA 導入

Slide 16

Slide 16 text

© GO Inc. 16 『GO』のSMS認証について 電話番号入力 SMS送信 認証コード入力

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

© GO Inc. 18 reCAPTCHA 導入後のシーケンス図 reCAPTCHA UserApp GO API SMS認証導線のユーザ操作を集計・評価 評価結果の取得に必要な評価トークンを返す SMS認証APIの呼び出し 評価結果のスコアと理由コードを返す 評価トークンから評価結果を取得 (リスクが低い場合) SMSで認証コードを送信 NEW!! 電話番号入力と SMS送信のアプリ操作 認証コードの入力 User

Slide 19

Slide 19 text

© 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 { /* エラーとリトライ表示 */ } }

Slide 20

Slide 20 text

© 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 { /* 通信エラー表示 */ } }

Slide 21

Slide 21 text

© GO Inc. 21 04 導入結果と知見

Slide 22

Slide 22 text

© GO Inc. ● 悪意のあるユーザか不明だが、上図の赤線の数だけSMS送信を停止した ○ 特定の日に高リスクの検出が顕著にみられたが、大量に作成された アカウントによるAPIアクセスではなかった ■ 調査すると、特定の端末からのリクエストが増えていた模様 ○ ちなみに、Android の方が iOS よりも高リスク検出が多かった 22 導入後の結果

Slide 23

Slide 23 text

© GO Inc. 23 学習期間を設けるべき ● reCAPTCHAは学習により精度が上がるため、本番運用をはじめる前 に学習期間を設けるべき ● 『GO』では 7日間の学習期間を設けた。ユーザ操作の評価スコアを 利用せず、学習のみをおこなった ○ 7日間は高リスク判定の閾値を緩め、全てSMS認証に進める ○ 8日以降は閾値を更新

Slide 24

Slide 24 text

© GO Inc. ● 人為的な高リスクの再現が難しく、本番同等の テストはできないものと割り切る ● 以下のテスト方針とした ○ reCAPTCHA のスコア妥当性は確認しない ○ SMS認証のエラー時の動作確認のために、 高リスク判定とする閾値を一時的に厳しく ○ reCAPTCHA の動作確認は別途スコア詳細 を確認する画面を用意した 24 reCAPTCHAのテストはできないものと思え

Slide 25

Slide 25 text

© GO Inc. ● 発生した問題 ○ サービス運用中に reCAPTCHA Android SDK を最新化すると、 スコアのアルゴリズムが更新され、高リスク判定ユーザが増加 ○ ユーザの問い合わせも増加 ● 対応 ○ ビジネス担当者と相談し、低リスク判定ユーザの数が変わらない 範囲で閾値を調整した 25 定期的に高リスク判定の閾値を見直すべき

Slide 26

Slide 26 text

© GO Inc. 26 まとめ

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

© GO Inc. 文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください