バンドルカードの SRE をしている summerwind です。最近は A Philosophy of Software Design を読んでいます。
タイトルの通り、2022年6月21日からバンドルカードと Pool のカードが 3D セキュアに対応しました。バンドルカードではアプリですぐに発行可能なバーチャルカードを含む全てのカードで対応しているので、気軽により多くの加盟店での決済にご利用いただけるようになりました。
いつもはバンドルカードのインフラやセキュリティといった領域を担当しているのですが、3D セキュアの対応では久しぶりにバックエンドエンジニアとして自分もプロダクト開発に関わったので、今回は 3D セキュアの仕組みとその開発に関する話を簡単に紹介したいと思います。
3D セキュアとは
3D セキュアは、オンラインなど非対面でクレジットカードを使用して決済をする際に、カードの所有者であることを事前に認証する仕組みです。3D セキュアを使用することで、カード情報の盗用によるオンライン上での不正利用を防止できます。ショッピングサイトなどでカード決済をする際に突然パスワードの入力を求められた、といった経験がある方も多いかもしれません。あれが 3D セキュアによる認証です。
3D というのは三次元のことではなく3つのドメイン (Domain) すなわち、加盟店/アクワイアラ、決済ネットワーク、イシュアの3つの立場を指しており、以下の図のようにそれぞれの立場にあるシステムが連携して本人認証をする仕組みになっています。カンムのようにカード発行をするイシュアの立場では Access Control Server (ACS) と呼ばれるシステムを用意することで 3D セキュアによる認証に対応できます。
3D セキュアの最新の仕様は「EMV 3-D Secure」と呼ばれており、EMVCo の公式サイトで参照できるので、興味がある方はぜひ参照してみてください。
3D セキュアの認証フロー
EMV 3-D Secure の仕様では「Frictionless Flow」と「Challenge Flow」の2つの認証フローが定義されています。それぞれの認証フローについて簡単に説明します。
Frictionless Flow
従来の 3D セキュアの仕組みでは、本人認証時のパスワードの手間が大きく認証時に決済を諦めてしまう人が多いという課題がありました。この問題を軽減するため、EMV 3-D Secure では決済時の情報に基づくリスクベースの判断をして、パスワード入力などの認証ステップなしに認証を完了させるフローに対応しています。これが Frictionless Flow です。
カンムのようなイシュアの立場では、ACS で加盟店/アクワイアラから送られてきた決済の情報などを元にリスクを分析し、追加の認証は不要と判断した場合は認証を完了させる動きをとることになります。
Challenge Flow
Frictionless Flow を実行した結果、ACS が追加の認証が必要と判断した場合は Challenge Flow に移行します。
Challenge Flow では決済をしようとしているユーザーが本人であるかを確認する認証フローを実行します。認証フローではまずイシュアが持つカードの発行情報に基づいて、カードの所有者にワンタイムパスワードを送信します。次にカードの所有者はイシュアから送信されてきたワンタイムパスワードを決済画面に入力します。ワンタイムパスワードの一致が確認できたら認証は成功です。
バンドルカードでは Challenge Flow の場合に次のような認証画面を表示しています。
バンドルカードと Pool における ACS
バンドルカードと Pool で 3D セキュアに対応するには、イシュアの立場として ACS を実装して用意する必要があります。しかし ACS をフルスクラッチで実装するには多くの時間とコストがかかるため、今回の対応では Visa 様が提供する Visa Consumer Authentication Service (VCAS) を ACS として導入しています。
VCAS では ACS としての機能が一通り提供されており、3D セキュアの認証フローの各種処理に必要となる情報を専用の API を介してイシュアから VCAS に提供することで、ACS を実装せずとも 3D セキュアに対応できる仕組みになっています。
VCAS の導入とその開発
VCAS の導入にあたっては、バンドルカードと Pool のそれぞれで VCAS と接続するための仕組みを開発する必要がありました。ここからは開発の流れなどを簡単にふりかえって気をつけた点などを紹介してみたいと思います。
前提の確認と方針決め
まず、今回の VCAS の導入では次のような前提や制約がありました。
- Visa 様との共同プロジェクトによる開発
- ローンチまでのスケジュールが比較的がっちりと決まっている
- バンドルカードと Pool で同時に VCAS に対応する必要がある
- 可能な限り早くユーザーが 3D セキュアを利用できるようにしたい
これらの前提と制約を受け入れつつスムーズに開発を進めるために、ある程度細かい部分までの仕様は先に決めて関係者の間で合意をとりつつ、実装はバンドルカードと Pool で順番に細かく進め、得られた知見をそれぞれのプロダクトの実装に相互にフィードバックしながら品質を高めていく方針としました。
設計と社内レビュー
制約と方針に基づいて、まずは設計を固めることとしましたが、この段階では「バンドルカードと Pool で同時に VCAS に対応する」という制約が最初の課題になりました。これは単純に Pool が新しいプロダクトであり、今まで2つのプロダクトで同時に同じ対応をする、という動きがこれまでの社内では無かったためです。そこでまずはバンドルカードを社内のリファレンス実装として先に実装することに決め、そこで得られた知見をもとに Pool での実装を進めることにしました。
次に「VCAS とは何か」「その対応のための要件と制約は何か」「そして2つのプロダクトで同時に対応するにはどういった構成パターンが考えられるか」「バンドルカードではどういった改修が必要か」といった情報を整理してドキュメントにまとめ、社内で「ぶつかり」と呼ばれているレビュー会を開催して設計を確定させることにしました。
事前にいくつかの構成案の良し悪しや、個人的に迷っているポイントなどをドキュメントにまとめておいたおかげで、「ぶつかり」では各構成案に対する意見がスムーズに集約できました。また既存のシステムの設計思想の共有や今回の開発においてはその思想がどう適用しうるかといった議論もでき、純粋によい学びの時間になったなと感じています。
役割の分担
「ぶつかり」により設計がうまく確定できたので次のステップである実装に入っていくわけですが、開発規模がそこそこ大きくなってきたのでここでエンジニア間の役割分担をすることにしました。
3D セキュアに対応するには VCAS 向けの開発とは別に Processor と呼ばれるカード決済を処理するシステムも改修をして、Visa 様による事前の仕様確認テストをパスする必要がありました。Processor についてもバンドルカードと Pool のそれぞれで改修が必要だったため、社内の Processor の匠である hiroakis にその対応をお願いしました。
また、リファレンス実装として最初に実装をするバンドルカードの内部はいくつかのコンポーネントに分かれており、コンポーネントごとに改修が必要だったため、直近でゴリゴリにバンドルカードの改善を進めてくれている Shiba にも実装の手伝いをお願いして、最終的にバックエンドエンジニアは3人体制での開発となりました。
実装とフィードバックの反映
役割分担ができたので、それぞれの担当領域で実装を進めていきます。自分は 3D セキュアによる認証時に VCAS と連携する API をまずバンドルカード向けに実装しました。
設計と「ぶつかり」によりコードレビュー時に必要となる土台の知識は共有できていると感じていたので、ここからは比較的見やすい単位でコードレビューを進めていけるような流れを作ることにしました。具体的には次のような単位で順番に Pull Request を作成して実装とコードレビューを進めていきました。
- ただ起動するだけの API サーバーの実装
- VCAS と連携に必要な API エンドポイントを API サーバーに追加 (各エンドポイント単位で数回繰り返し)
- バグ対応やリファクタリングのための修正など
バンドルカードの実装がある程度の形になって VCAS と接続しての結合テストが可能な状態になった後は、並行して Pool 用 API の実装も同様の流れで進めました。
何かを新しく実装する時は何回か実装を繰り返すとより良いコードが見えてくる...といったことがよくあるかと思いますが、今回は幸いにも同じような API を2回実装する機会ができたので、Pool 用の API の実装時にはバンドルカード用の実装の課題をうまく改善する試みができました。また Pool 用の実装でうまくいった点は逆にバンドルカード用の実装にフィードバックする、といったことができたのもよかったなと感じています。
テストの実施
バンドルカードと Pool のそれぞれの実装が形になったあとは Visa 様の管理するシステムと接続しての結合テストを実施します。結合テストは以下の2つを観点でそれぞれ独立して実施されました。
- VCAS とバンドルカードおよび Pool の API が連携して 3D セキュアの認証が正しく動作するか
- 決済ネットワークである VisaNet とバンドルカードおよび Pool の Processor が 3D セキュア認証後のオーソリを正しく処理できるか
それぞれの結合テストではレスポンスにおける誤った値の指定や処理漏れなどの不具合が見つかりましたが、幸いにも軽微な修正で対応が可能なもので比較的スムーズにテストを終えることができました。
結合テストが完了すると、その後は本番環境の構築とリリース前の最終的なテストを経て、無事に機能リリースとなりました。
おわりに
今回は 3D セキュアの仕組みとその対応にあたっての開発の流れなどを簡単に紹介してみました。個人的には 3D セキュア対応により多くのユーザーの決済機会を増やすことができたのを嬉しいと思うと同時に、久々のプロダクト開発も楽しめてとてもよい経験になりました。
バンドルカードでは 3D セキュアへの対応をはじめとして、今後も自分の持っている価値をどこでも自由に交換出来るようにする「価値交換」、自分の持つ価値をより良く制御できるようサポートする「価値制御」、自分が持っている価値を未来まで拡張する「未来価値」の3つの領域にフォーカスしてプロダクトの改善を進めていく予定です。これらの3つの領域の詳細については、ぜひ COO である achiku が書いた以下のブログ記事もあわせて参照してみてください。また、先日新たに提供を開始した Pool でも資産形成を軸に様々な価値を提供していきます。
カンムではこれらのプロダクトの改善に加わってくれるメンバーを募集中です。ブログ記事の内容を深掘りするだけのカジュアル面談も大歓迎ですので、ぜひお声がけください。