「セキュリティ」と「パフォーマンス」のトレードオフをどう解消したか?
スマートバンクでは、これら多岐にわたる技術を適材適所でシステムに組み込むことで、定量的かつ定性的な効果を引き出している。最も顕著な効果は、複雑に絡み合う外部連携システムにおける運用保守コストの劇的な削減と、データ不整合による手動修正オペレーションの排除だ。
具体的な課題解決のプロセスとして、コンビニエンスストアやPay-easyを利用した入金機能での事例が語られた。ユーザーが外部の決済機関で支払いを行うと、スマートバンクのシステムに対してWebhook経由で入金完了の通知が送られてくる。
しかし、ネットワークの遅延やサーバーの高負荷により内部処理に時間がかかると、外部システム側は「通信タイムアウト」と判定し、エラーとみなして同じWebhookを何度もリトライ送信してくる事象が発生した。
この時、データベースに単純なユニーク制約しか設けていないと、2回目以降のリクエストはシステム内部で重複エラーとなり、外部システムに対してエラーレスポンスを返し続けてしまう。結果として外部システムは永遠にリトライを繰り返し、システム全体のリソースを圧迫するという困難に直面した。
この課題に対し、同社は前述のAPIキャッシュの手法を適用して解決を図った。Webhookには決済IDという一意の識別子が含まれているため、すでに処理が完了している決済IDについては、内部的なエラーとして弾くのではなく、「キャッシュされた成功レスポンス」を外部システムに意図的に返却するようプロセスを改善した。これにより、外部システムは処理が正常に受け付けられたと認識してリトライを停止し、システム間の不整合という厄介な問題が見事に解消されたのである。
また、API通信における「Idempotency-Keyヘッダ」の導入は、トランザクション管理の難易度を大幅に下げる効果をもたらした。外部システムを呼び出す際、アプリケーション内の状態更新と外部APIの呼び出しを一つのトランザクションで安全に括ることは技術的に困難を伴う。そのため、処理の途中で障害が発生した場合、社内データと外部サービスの状態にズレが生じ、エンジニアが膨大なログを追って手作業でデータを修正するという運用負荷がかかっていた。Idempotency-Keyを導入することで、処理の前段で確実に2重リクエストを検知・遮断できるようになり、後段の外部サービス連携で不整合が発生する確率が極小化された。
一方で、セキュリティとパフォーマンスのトレードオフという新たな課題にも直面した。 排他制御のための悲観的ロックや、リプレイ攻撃(通信データを傍受して不正に再送するサイバー攻撃)を防ぐための「One-Time Token(使い捨てトークン)」の生成処理は、システムに高い負荷をかける。これらの強固な防御策をすべてのAPIに適用すると、アプリ全体のレスポンスが悪化し、ユーザー体験を損ねてしまう。
ワンタイムトークンのフローを図解
そこで同社は、トークンによる防御をパスコードの登録やクレジットカード番号の表示、銀行口座からの引き落としといった、最高レベルの機密性と確実性が求められる重要機能にのみ限定して適用するというアプローチをとった。さらに、バーチャルカードの過剰な再発行といった異常な操作に対しては、ロック機構を作り込むのではなく、単純に指定回数でエラーを返す「Rate Limit」を採用することで、実装コストを抑えつつ安全性を担保している。こうした技術の取捨選択こそが、安定稼働を支える鍵となっている。
