以前、PCIDSSに規格を取得するプロジェクトに参画したことがあり、
その中での教訓として、
「カード情報(PAN)は“そもそもサーバに送らない”のが一番安全」
という、基本だけど本質的な考え方です。
この記事では、決済に関連することとしてそのことをまとめます。
「カード非保持化」の重要性
PCIDSS では、カード情報(PAN/有効期限/セキュリティコード)を取り扱う場合、非常に厳しい要件が求められます。
- サーバに保存してはいけない
- ログにも絶対残してはいけない
- 通信するなら暗号化必須
- 保持するならネットワークや運用も含めて範囲が広大になる
つまり普通のWebアプリが気軽に扱ってよい情報ではありません。
調査を進める中で特に印象に残ったのは、
「カード番号を扱わない設計=PCIDSS対応が圧倒的に楽になる」
という点です。
実際、最近の決済サービスはすべて「カード番号は決済事業者へ直接送らせる」方式にシフトしています。
PAY.JP の“カード情報をサーバに送らせない仕組み”
PAY.JP の仕組みは非常にシンプルで強力です。
1. カード情報はフロント(JS)から直接 PAY.JP へ送る
ブラウザ
↓(カード番号など)
PAY.JP
このとき 自分のサーバは一切介さない 設計になっています。
2. PAY.JP がトークンを発行する
例:tok_xxxxxxxx
これは「カード番号の代わりに使える一時的なキー」です。
3. サーバに送るのはトークンだけ
ブラウザ
↓(トークン)
自分のサーバ
そしてサーバ側では、このトークンを使って
create_chargecreate_paymentcreate_subscription
などを実行します。
サーバには PAN / 有効期限 / セキュリティコード は一切届かない。
これが PCIDSS でいう「カード非保持化」です。
導入が簡単なのも納得だなと感じました。
現代的な決済はすべて「非保持化」を軸に設計されており、PCIDSSを調べるほど理にかなっていると感じました。