
脆弱性から無敵へ:Siftでビジネスを守れ!
-
2023年10月10日
みなさん、こんにちは!
オンラインビジネスを運営する上でセキュリティは不可欠な要素です。
クレジットカード情報の盗難、ユーザーデータの漏洩、不正アクセスなど、脅威は日々進化しています。
そんな中、我々の強力な味方となるセキュリティソリューション、Siftについてご紹介いたします。
この記事では、Siftの導入により特に不正決済のリスクを最小限に抑える方法に焦点を当てて詳しく解説していきます。
3DS 2.0(3Dセキュア2.0)の導入と不正決済への対処
オンラインショッピングにおけるクレジットカードの不正利用は増加傾向にあり、2022年度には前年比で3割増加し、過去最大約436億円の被害額が発生しました(以下、グラフ参照)。
この問題に対処するために多くの企業が「3DS 2.0」を導入しています。
3DS 2.0は、二段階認証など高度なセキュリティ手段を提供し、お客様の安全な取引を守ります。
不正アクティビティも日々進化しているため、3DS 2.0だけでは完全な防御は期待できません。万全な防御策ではないため、他のセキュリティ対策も併用することが推奨されます。
※出典:一般社団法人日本クレジット協会
不正決済におけるチャージバックの課題とは?
オンラインビジネスが成長する中で、不正決済は深刻な課題となっています。
不正アクティビティによって引き起こされるチャージバックは、ビジネスにとって大きなリスクと負担をもたらします。
不正アクティビティとは、盗まれたクレジットカード情報を用いた取引や、本人認証を欺いて行われる取引などの行為のことを指します。
こうした不正アクティビティによるチャージバックの影響は大きく、以下のような課題が生じます。
1.収益の損失
不正な取引によって商品やサービスが提供されたにも関わらず、後にチャージバックが発生するとビジネスは売上や収益を失うことになります。
これによって、予算や計画が狂い、経済的な打撃を受ける可能性があります。
2.信頼の低下
不正決済が頻発する場合、お客様はビジネスに対する信頼を失う恐れがあります。不正取引が頻繁に行われる環境では、お客様は自身のデータや資金の安全性に疑念を抱く可能性が高くなります。
3.追加の処理手数料
チャージバックが発生すると、クレジットカード会社から追加の処理手数料が課せられることがあります。これによって、不正アクティビティによる損失だけでなく、追加のコストが発生することになります。
4.業務の混乱
チャージバックに対処するためには、手続きや文書作業が必要です。これによって、業務が混乱し、時間と労力が無駄に消費される可能性があります。また、不正アクティビティの追跡や対処に時間を費やすことで、本来の業務への影響もあります。
Siftとは?
Siftはオンラインビジネスを脅威から守るための先進的なソリューションです。
クレジットカード詐欺、不正アクセス、ユーザーデータの漏洩など、オンライン環境に潜む危険からビジネスを防御します。
その秘密は、高度なデータ分析と人工知能技術を駆使して異常な挙動やパターンを検出し、即座に対処することにあります。
SiftのPayment Protectionソリューション
Siftはビジネスにとって重要な一環である決済プロセスを保護するために、Payment Protectionソリューションを提供しています。
このソリューションは、チャージバックによる収益減やビジネスへの悪影響を防ぐために設計されています。
https://sift.com/products/payment-protection
Payment Protectionの仕組み
SiftのPayment Protectionは、高度な機械学習アルゴリズムを使用して、不正な取引や不審なアクティビティを検出します。
お客様の購買履歴や挙動パターンを分析し、異常なトランザクションを自動的に特定します。
これにより、不正利用に起因するチャージバックを未然に防ぎ、ビジネスの収益と信頼を守ります。
Siftの導入手順
前置きが長くなりましたが、早速導入手順を見ていきましょう!
JavaScript
不正決済の行動分析をより効果的なものにするために、各ページにJavaScriptを埋め込みます。
以下を参考にしてください。
https://sift.com/developers/docs/java/javascript-api/overview
クライアントライブラリの取得
Sift はPython、Ruby、PHP、Java のクライアントライブラリを提供しています。
以下の公式ドキュメントを参考に、インストールを行ってください。
公式ドキュメント
https://sift.com/resources/plugins/client-libraries
※公式ドキュメントの内容が古い可能性があるため、最新の情報はGitHubを参考にすることをお勧めします。
GitHub
https://github.com/SiftScience
なお、今回はJava版を抜粋します。
Mavenを使用している場合
<dependency>
<groupId>com.siftscience</groupId>
<artifactId>sift-java</artifactId>
<version>3.11.0</version>
</dependency>
Gradleを使用している場合
dependencies {
compile 'com.siftscience:sift-java:3.11.0'
}
APIキーの取得
Siftを使用するためには、APIキーが必要です。
Sift ConsoleにログインしてAPIキーを入手しましょう。
このAPIキーはアプリケーションがSiftと通信する際に使用します。
以下はSift Consoleのサンプル画面で、オレンジの箇所がAPIキーです。
初期化と設定
取得したAPIキーを使用して、Siftのクライアントライブラリを初期化します。
アプリケーションの適切な場所に、以下の初期化コードを追加してください。
// SiftClientを初期化
SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID");
しかし、公式ドキュメントやGitHubのまま上記のように実装をすると、
リードタイムアウトやコネクションタイムアウト等が適切に設定されません。
そのため、SiftClientのコンストラクタに事前にタイムアウト値を設定したOkHttpClientを渡すことで、問題を解決できます。
もしタイムアウト値を設定せずに進めるとリソース不足が起こり、最悪の場合、アプリケーションが正常に実行されない可能性も考えられます。
こうした問題を回避するため、以下のようにタイムアウト値を設定したOkHttpClientを使ってSiftClientを初期化することをお勧めします。
ここは公式ドキュメント等で記載が欲しいところでしたね。
サンプルコード
private static final int READ_TIMEOUT_MS = 3000;
private static final int CONNECT_TIMEOUT_MS = 3000;
private static final int WRITE_TIMEOUT_MS = 3000;
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(READ_TIMEOUT_MS, TimeUnit.MILLISECONDS)
.connectTimeout(CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
.writeTimeout(WRITE_TIMEOUT_MS, TimeUnit.MILLISECONDS)
.build();
SiftClient client = new SiftClient("YOUR_API_KEY", "YOUR_ACCOUNT_ID", okHttpClient);
Events API
Events APIは不正決済を検出し防ぐための強力なツールの一つです。
特に、$create_order, $update_status, $transactionといったイベントは、不正決済を効果的に対処する鍵となります。このセクションではクレジットカード決済を例にしてどのように導入して設定するのか、ステップバイステップで説明します。
$create_order
データの送信
Siftに送信するデータには、ユーザーID、金額、通貨コードなど、様々なフィールドがあります。これらは不正アクティビティを特定しやすくするために非常に重要です。
レスポンスを評価する必要があるため、必ず同期処理にて行ってください。
また、決済代行業者や決済会社の各種APIコール前に実装し、事前に不正検知をすることが必要です。
サンプルコード
※amountはマイクロ単位で指定する必要があります
※1円 = 1000000マイクロ
// Build the request object.
EventRequest createOrderRequest = client.buildRequest(new CreateOrderFieldSet()
.setUserId("bill_jones")
.setOrderId("ORDER-28168441")
.setUserEmail("bjones@altavista.com")
.setCurrencyCode("USD")
.setAmount(10000000000L) //¥10,000
.setBillingAddress(new Address()
.setName("Bill Jones")
.setPhone("1-415-555-6041")
.setAddress1("2100 Main Street")
.setAddress2("Apt 3B")
.setCity("New London")
.setRegion("New Hampshire")
.setCountry("US")
.setZipCode("03257"))
.setExpeditedShipping(true)
.setCustomField("digital_wallet", "apple_pay")
.setCustomField("coupon_code", "dollarMadness")
.setCustomField("shipping_choice", "FedEx Ground Courier")
.setCustomField("is_first_time_buyer", false)
).withWorkflowStatus();
// Send the request.
EventResponse response;
try {
response = createOrderRequest.send();
} catch (SiftException e) {
SiftResponse errorResponse = e.getSiftResponse();
}
// Inspect the response.
response.isOk(); // true
response.getApiErrorMessage(); // "OK"
response.getApiStatus(); // 0
response.getHttpStatusCode(); // 200
EventResponseBody body = response.getBody();
レスポンスの判定
$create_orderは高リスクの取引を判定することが可能です。
上記サンプルコードでは、取引判定をするためにclient.buildRequestの最後でwithWorkflowStatus()を設定しています。
この設定をすることで、不正な取引やリスクのあるアクティビティを自動的に検出し、決済フローに進む前にブロックすることが可能です。
これにより、不正決済の影響を最小限に抑えることができます。
不正決済と判断された取引は、Sift Console上でAuto Block Orderとして表示されるため、運営の方にも視覚的に分かりやすい情報で確認することが可能です。
サンプルコード
レスポンス情報の判定はSift Consoleの設定内容によって異なるため、適宜設定内容に従って不正決済の判断をしてみてください。
ユーザの評価値であるscore_responseオブジェクトのscoreの値を使って判断するのも良いかもしれません。
※0.1〜1.0の間で返却
※値が大きいほどリスクがあります
{
"score_response": {
"status": 0,
"error_message": "OK",
"user_id": "billy_jones_301",
"scores": {
"payment_abuse": {
"score": 0.898391231245,
"reasons": [
{
"name": "UsersPerDevice",
"value": 4,
"details": {
"users": ["a", "b", "c", "d"]
}
}
]
},
"promotion_abuse": {
"score": 0.472838192111,
"reasons": []
}
}
}
}
$update_status
オーソリの結果に基づいて、$update_statusを実行します。
正常・不正に応じて以下の値を設定してください。
※非同期処理が可能
正常
- $order_status:$approvedを設定
- $reason:設定値無し
不正
- $order_status:$canceledを設定
- $reason:$payment_riskを設定
サンプルコード
EventRequest request = client.buildRequest(new OrderStatusFieldSet()
// Required Fields
.setUserId("billy_jones_301")
.setOrderId("ORDER-28168441")
.setOrderStatus("$canceled")
// Supported Fields
.setReason("$payment_risk")
.setSource("$automated")
.setDescription("Canceling because multiple fraudulent users on device"));
$transaction
オーソリの結果に基づいて、$update_status同様に$transactionを実行します。
正常決済または不正決済に応じて適切な値を設定してください。
※非同期処理が可能
設定項目の補足
- $transaction_status
3DS 2.0の結果に基づいて$success(デフォルト値)、$failure、$pendingを設定します。決済ゲートウェイに拒否された場合、値を$failureに設定します。 - $status_3ds
3DS 2.0の結果に基づいて$successful、$attempted、$failed、$unavailable、$rejectedを設定します。 - $decline_category
決済代行業者を使っている場合は、下記を参照。
https://sift.com/resources/guides/decline-category-guide - $payment_method#$verification_status
決済方法が検証されたことを示すことができます。
値は$success、$failure、$pendingです。
たとえば、決済代行会社等に決済方法の検証を依頼し、認証に失敗した場合は値を$failureに設定します。 - $payment_method#$decline_reason_code
決済が拒否された場合、決済代行会社等から受信した拒否の理由を示す応答コード。
サンプルコード
EventRequest request = client.buildRequest(new OrderStatusFieldSet()
// Required Fields
.setUserId("billy_jones_301")
.setOrderId("ORDER-28168441")
.setOrderStatus("$canceled")
// Supported Fields
.setReason("$payment_risk")
.setSource("$automated")
.setDescription("Canceling because multiple fraudulent users on device"));
リリース前の準備
それぞれの決済手段にEvents APIを組み込んだら、いよいよリリースに向けて準備を進めていきます。
Sandbox環境での本番データの検証
Siftの導入においては、機械学習アルゴリズムを駆使したデータ分析が不可欠です。
これにより、異常な挙動やパターンを検出し、不正なアクティビティを適切に判別します。しかし、本番環境でのデータ分析は慎重に行う必要があります。
そのため、Sandbox環境を活用して本番データの検証期間を設けることを強くお勧めします。
数週間にわたり、Sandbox環境でのデータ分析によって得られる結果を詳しく検証しましょう。
Sandbox環境では、実際の本番環境のデータを使用しながらも、シミュレーションされた状況下でテストを行うことができます。
この期間を通じて、アルゴリズムの適切な調整やカスタマイズが行えるかどうかを確認し、最適な結果を得るための準備を進めてください。
おわりに
脆弱性から無敵へ、その一歩を踏み出しましょう
今回の記事で「脆弱性から無敵へ:Siftでビジネスを守れ!」というタイトルが示すように、SiftのEvents APIを利用することで、ビジネスを不正から守り、事業を次のレベルに引き上げる方法を探求しました。
具体的な実装方法から理論的背景まで、幅広くご紹介してきた内容は、あなたのビジネスが脆弱性から無敵の状態に進化するための重要な一歩です。
もしまだ行動に移していないなら、今がその時です!
最後までお読みいただき、ありがとうございます。
脆弱なビジネスを無敵のものに変える旅は、ここからが本番です。
さあ、無敵のビジネスを目指しませんか?