Тема
tokenization-service
Хранилище карточных данных. Принимает карту, кладёт её в зашифрованном виде и возвращает токен — случайный идентификатор, по которому дальше и живёт вся система. Он же отдаёт данные обратно, когда карту нужно передать в банк. Благодаря этому сервису номер карты видят только он сам и PCI-шлюз, а остальные сервисы работают с токенами.
Токен обратим: детокенизация — не аварийная возможность, а штатная часть платёжного флоу. «Токенизация» здесь означает, что данные вынесены в одно защищённое место, а не что их нельзя восстановить.
Стек: Node.js, TypeScript, NestJS.
Чего не делает
Не разговаривает с мерчантом: наружу сервис не смотрит, все запросы приходят от наших сервисов. Не решает, кому можно отдавать карту: проверяется только подпись запроса, а не то, зачем спрашивают. Не знает ничего о транзакциях, статусах и банках — он оперирует картой, а не платежом. Не хранит CVV постоянно: код проверки живёт только внутри временной сессии и исчезает вместе с ней.
Входы
- Токенизация от PCI-шлюза: одна карта, список карт пакетом или карта вместе с сессией. На одну и ту же карту сервис всегда возвращает один и тот же токен — он ищет уже существующую запись по хэшу, прежде чем заводить новую.
- Создание временной сессии: строка с полными данными карты, которую нужно подержать ограниченное время. Срок жизни задаёт вызывающий, но сверху он ограничен настройкой сервиса.
- Детокенизация от ядра и драйверов: вернуть карту по токену, вернуть содержимое сессии или отдать безопасно замаскированный номер, когда нужен только вид карты, а не сама карта.
- Поиск токена по номеру карты — без создания нового: так проверяют, знакома ли нам эта карта.
Каждый запрос подписывается ключом KMS, а в теле обязателен штамп времени: если он расходится с текущим больше чем на несколько секунд, запрос отклоняется. Это защищает от повторной отправки перехваченного запроса.
Выходы
Наружу сервис не ходит: он отвечает вызывающему и обращается только к AWS KMS — за шифрованием, расшифровкой, вычислением хэша карты и проверкой подписи входящего запроса.
Хранилища
PostgreSQL хранит постоянные токены. В записи лежат сам токен, зашифрованные данные карты и хэш, по которому находится дубликат; ключ шифрования — в KMS, в базе его нет, поэтому одной только копии базы для восстановления карт мало.
Redis хранит временные сессии: значение точно так же зашифровано, а срок жизни ограничен — в платёжном флоу это около часа. Именно поэтому сессия годится для CVV, а постоянный токен — нет.
Участвует во флоу
- Платёж картой server-to-server — шаг с обменом карты на токены и последующая детокенизация перед походом в банк.
- Платёж через нашу форму, выплаты и рекуррентные платежи — везде, где карта либо вводится, либо достаётся обратно по сохранённому токену.
Где искать
- Репозиторий: smartcore-pci-software/tokenization-service — сервис в PCI-контуре, поэтому в отдельной организации GitHub.
- Инфраструктура, база и ключи: карточка сервиса в описании прод-контура.
- Публичная документация: своих ручек наружу сервис не имеет, мерчант видит его работу только как форму токенизации для выплат.
- Механика токенов целиком, включая то, кто и зачем детокенизирует, — в Карточные данные и токены.