今さら聞けない「カード情報の非保持化」

## はじめに
こんにちは。ココネのサーバーエンジニアのジョンです。
まだまだココネでの経歴は浅いので、前職のEC業界での経験、その中でも決済周りの処理についてお話をしてみたいと思います。
決済代行サービスとの連携の経験がない、初心者向け内容になっております。

ネットでお買い物をする際、昔からメジャーな決済手段として広く使われているクレジットカード、皆さんは使われていますか？
私は持っているクレジットカードが30枚程あって、キャッシュレスが大好きで、よくネットでお買い物をします。
クレジットカードになれてない人や不安をもっている人もきっと多くいらっしゃってるかと思います。
オフラインですと、カード番号などを人に見せないようにするなど、使い方に気をつければ不正利用防止ができそうですが、オンラインだと自分が利用したことがあるサイトから情報漏洩があったり、クレジットカードが不正利用されたりなど、やっぱり不安が残るかと思います。
そう思われる方もいるかと思いますが、実は昨今のオンライン決済業界では、そもそもカード情報の非保持化がスタンダードになっています。

## カード情報非保持化とは
「自社で保有する機器・ネットワークにおいてカード情報を保存、処理、通過しないこと」を言います。
ここで言う「自社」というのは一般的なECサイトだと思ってもらえれば、差し支えございません。
つまり、クレジットカードの情報が一切残らない形なので、管理者もお客様のカード情報を見ることができないし、もし情報漏洩されたとしても、そこにはクレジットカードの情報はありません。

## カード情報が通過しないのに、決済ができるの？
しかしながら、カード情報が通過しないのに、どうやって決済しているの？と疑問に思うかもしれません。

オンライン決済では、決済代行どいうサービスを利用するのが一般的で、決済周りの処理はこの決済代行さんとやり取りをすることになりますが、細かいことは決済代行さんがやってくれます。例えば、クレジットカードでもブランドはVISA、MasterCard等、複数あり、本来ならばこれらのブランド毎に対応が必要ですが、決済代行サービスを使えばこういうのは意識しなくて済みます。

カード情報非保持化は決済代行さんが提供しているAPIなどを使えば実現できるようになっています。

## 具体的にどうやってるの？
簡単な図で表すと以下のような仕組みになっています。

![スクリーンショット 2023-12-06 14.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621379/f60c8adb-b0ab-309e-24fa-6d5cc2310db8.png)


決済情報入力画面が表示されると、ユーザーは画面にカード番号、有効期限、セキュリティコードなどのカード情報を入力すると思います。
その後フォーム転送になるボタンを押下したタイミングか、非同期等でjsを使ってブラウザと決済代行システムと通信が走り(①)、この時にカード情報が送信され、レスポンスとしてtokenがもらえます。
そして、商品が特定できる番号、購入数量、使用クーポン(あれば)など、購入時に必要な情報を自社システムに送信しますが、このタイミングに決済代行さんからもらっていたtoken情報も一緒に送信します。
APIサーバーでは購入に関わる更新処理と決済処理が行われますが、この時にAPIサーバーはtokenを利用して決済代行さんと通信(②)し、決済処理をします。
つまり、カード情報は自社ネットワークを通過しなかったし、通過したのはtoken情報だけになります。
また、このtokenは使い捨てなので、2回、3回使うことはできません。（DBに保存しても意味がありません）

## でも、毎回カード情報入力はしてないよ？
初回の決済時はカード情報を入力しますが、2回目以降は毎回カード情報を入力するのではなく、過去のカード情報で決済ができるのが一般的かと思います。
ということはやはりカード情報を保持しているのでは？と思われるかもしれません。
しかし、画面に表示されている過去のカード情報をよく見ると、下4桁とカードのブランドのみ表示されたりなどで完全な形での表示はされていないと思います。
これは、セキュリティのために表示のみそうしているのではなく、そもそも自社システムはその情報しか持ってないと考えた方が妥当かと思います。もしくは決済代行さんが提供しているAPIを使って不完全な形で決済履歴を参照しているかもしれません。
先ほど、自社ネットワークにはtokenのみが通過すると言いましたが、細かいことを言うと、過去履歴表示のためにカード番号の下4桁などは通過＆保存することはあります。この情報だけでは決済ができないし、決済代行さんのライブラリから勝手にアプリケーションログにはかれる程度の内容ですので、問題ないかと思います。

## 2回目以降の決済はどうやって？
そして、完全なカード情報がない、ユーザーからも入力してもらえないのに、どうやって決済ができるかというと、
2回目以降はtokenではなく、過去の決済IDで決済ができるからです。
自社システムと決済代行では決済IDという情報で決済情報の紐付きができています。
ユーザーから過去の決済情報(カード情報)を選択してもらえるUIになっているので、そこから過去の決済IDを特定、決済時にこの決済IDを送信すれば、決済ができます。
一般的には、この決済IDには有効期限というのがありますので、無期限ではなく、過去半年、数ヶ月など決済代行サービスにより決まっていたり、違いはあります。
なので、久しぶりに利用するECサイトだと過去に利用経験があるのにもかかわらず、もう一度カード情報の入力が求められたりもします。

## おまけ
私は過去2回クレジットカードの不正利用をされたことがあります。
1回目は、朝いきなりカード会社から「5分前に⚪︎⚪︎の決済がありましたが、ご本人の利用でしょうか？」と確認の電話があり、「違います」と答えたら、そのお電話でカード再発行の手続きまですることになりました。いきなりだったので、どこからの利用だったのかなど詳細を聞くことはできませんでしたが、不正利用検知システムがよく働いているなと感心しました。正直、最初は詐欺の電話か？と疑うほど急でしたが、電話で個人情報を求められたりはしていませんでした。
2回目は、よくわからない与信の通知があったので、お問い合わせをしてみると、私と同じようなことが複数検知されていて、不正利用(同じ決済元から短時間で複数のカードから集中的に決済)なので取り消しますとの回答をもらいました。与信情報に書いてあるショップ名？で検索してみると、とあるECサイトでしたが、情報漏洩されて一時封鎖しますというお知らせのみがありました。
なるほど！ここはカード情報保持していてここから私のカード情報が漏洩されてしまったのか？！と思いましたが、私には身に覚えがないサイトでしたので、いまだにどこから漏れてしまったか謎の状態です。（カードは再発行してもらいました）

## おわりに
私が経験したことがある決済代行サービスを基準でお話ししましたので、他の代行サービスによっては少し仕組みが違ってたりすることはあると思います。
オンライン決済は「100%安全」というわけではありませんが、このような仕組みになっていたり、ここでは言及しませんでしたが、３Dセキュアという２段認証のシステムもすでに導入されていたり、これからも多くのシステムで導入されと思いますので、さらに安全になることは間違いないでしょう。
ちなみに、３Dセキュアの場合でも今回お話しした基本的な仕組みに変わりはありません。

今年のクリスマス、年末年始でも、ネットでお買い物することはたくさんあるかと思いますが、この記事を読んでいただいて、お気持ち的に少しでも安心感が得られたらと思います。
メリー・クリスマス！