← 문서 포털
Implementation Status

NestPay 구현 현황

설계 정본(queries.sql 1~18장)의 각 기능이 실제 서버(API)·관리자 콘솔·회원앱·매장앱·DB에 어디까지 구현되었는지 정리한 표입니다. 모든 원장 기입은 복식 분개(ΣDR=ΣCR) 규약으로 검증되었으며, 외부 연동(본인인증·펌뱅킹·PG·FCM)은 계약 확정 전까지 교체형 스텁으로 동작합니다.

● 구현 완료 ● 스텁/연동 대기 ● 예정

회원 (가입 · 지갑 · 거래)

회원은 관리자 승인 없이 3요건(본인인증 → 계좌 실명조회 → 1원인증)만 충족하면 즉시 사용합니다.

기능 (정본 장)서버회원앱관리자비고
가입 3요건 1.2~1.4 · POST /app/auth/*, /app/users, /app/me/bank-accounts/* 완료완료완료 본인인증·계좌 실명조회·1원인증은 교체형 스텁. 1인 1활성계정·재가입 대기 검증 포함.
간편 PIN 1.7 · POST /app/me/pin, /app/me/pin/verify 완료완료완료 Argon2id 해시, 5회 30분 잠금, 성공 시 3분 거래 인증 표(결제·출금·선물 선행 조건).
기기 바인딩 · PIN 간편 로그인 1.6 · POST /app/auth/pin-login 완료완료완료 가입·로그인 시 동시 1기기 등록(기존 해지), 등록 기기+PIN 6자리로 무세션 로그인. 관리자 기기 조회.
패스키(공개키) 로그인 1.11 · /app/me/passkeys/*, /app/auth/passkey/login/* 완료완료완료 챌린지-응답 서명 로그인. 서버 이중 검증(Ed25519 소프트인증기 / P-256 플랫폼패스키). 등록·목록·삭제, 관리자 패스키 관리. 생체 패스키는 운영 도메인 연결 후.
본인정보 · 내 카드 · 연결계좌 /app/me/profile, /me/cards(reveal·primary), /me/bank-accounts 완료완료 마이페이지: 본인정보(실명·생년월일·성별·전화), 내 카드(번호·CVC 열람·대표 지정), 인증 연결계좌(마스킹).
비밀번호 변경 1.10 · POST /app/me/password 완료완료 현재 비밀번호 확인 후 교체(PBKDF2-SHA256). 마이페이지에서 실행.
카드번호·CVC 열람 2.4b · POST /app/me/cards/{id}/reveal 완료완료 자물쇠 탭 → PIN 인증 표(pinPass) 확인 후 전체 카드번호·CVC 복호화 노출. 본인 카드만.
프로필 사진(아바타) V13 · POST/GET/DELETE /app/me/avatar 완료완료 이미지 5MB 이하, 중앙 파일 대장 참조. 마이페이지에서 올리기·기본 복원.
카드 발급·관리 2.1~2.4 · GET/POST /app/me/cards 완료완료완료 수량 정책, 유상/무상 포인트 구분. 카드번호는 내부 가상(BIN 계약 시 교체).
충전(무통장) 4.1~4.4 · /webhooks/bank/deposit-notice, /app/me/deposit-identifier 완료완료완료 입금자 코드 매칭 워커(자동 적립/미매칭). 가상계좌는 펌뱅킹 계약 후 추가.
QR 결제 5.1~5.2 · POST /app/me/payments 완료완료완료 무상 포인트 우선 소진, 수수료·부가세 스냅샷, 실카메라 스캔.
결제 취소 6.1~6.2 · POST /app/me/payments/{id}/cancel 완료완료완료 전체 취소, 로트 속성 승계 복원, 매장 잔액 부족 시 거절.
선물(번호·카드번호·QR·링크) 7.1~7.6 · /app/me/gifts, /gifts/recipient/by-card, /gifts/link 완료완료완료 대상 지정 = 휴대폰 · 카드번호 · QR 스캔 · 링크. 유상 포인트만, 링크 24h 미수령 자동 반환·회수. 내 받기 QR 표시.
출금 8.1~8.5 · GET/POST /app/me/withdrawals 완료완료완료 선차감 HOLD, 정책 예정 시각, 실행 워커. 은행 이체는 스텁.
이용내역 17.x · GET /app/me/transactions 완료완료완료 유형 필터·무한 스크롤. 홈 최근 거래 실데이터.

매장 (온보딩 · 결제 수취 · 정산)

매장은 관리자 승인이 필수이며, 필요 서류 제출·보완 왕복 후 PG 연동을 신청합니다.

기능서버매장앱관리자비고
입점 신청·심사 POST /store/apply, /store/documents, /store/resubmit 완료완료완료 보완 요청 왕복, 서류 파일 첨부, 중앙 files 참조.
PG 연동·화이트IP POST /store/pg/apply, /store/pg/ips 완료완료완료 매장코드·비밀키 1회 발급, 승인된 IP만 open API 허용.
QR 발급 GET/POST /store/qrs 완료완료 고정 QR·금액 지정 1회용 QR(암호문). 매장앱 실렌더링.
매출 요약·거래 GET /store/summary, /store/transactions 완료완료완료 오늘·이번 달 실시간 집계, 정산 예정 잔액.
정산 출금 8.1(매장판) · GET/POST /store/settlements 완료완료완료 매장 지갑 무로트 선차감, 기본 즉시 정산(정책 delay 0).

관리자 콘솔 · 운영

기능상태비고
인증·권한완료2단계 로그인(비밀번호+OTP), 관리자별 허용 IP, root 전용 기능.
회원·매장·카드 관리완료검색·페이징·상세(거래·로그인 수단), 정지·해제. 회원 목록/상세에 이름·휴대폰·인증계좌 마스킹 표시(가운데 가림), 생년월일·성별·인증은행 노출.
거래·미매칭·선물·정산 조회완료미매칭 수동 매칭/반환, 월 정산 마감(멱등).
FDS(이상거래)완료룰 8종·경보 큐·수동 탐지(사후). 인라인 차단은 거래 API 연동 시점.
이용제한(Rate limit)완료동작별 호출빈도 제한(무차별 차단, V14). login·signup·비번변경·출금·문의·1원코드·결제·관리자TOTP 8종 집행(초과 429), 관리자 조정. NestPay 실동작만.
약관·개인정보처리방침 관리완료버전 등록·시행(activate)→앱(회원·매장) 노출. 콘텐츠·고객지원 그룹.
카드 관리(번호·CVC 열람)완료실제 카드번호·CVC(복호화)·유효기간(MM/YY, 월말) 표시. 마스킹 정책은 회원 목록에 적용.
콘텐츠·1:1 문의완료공지·배너·FAQ, 문의 답변 시 앱 알림(outbox).
푸시 발송·설정완료회원 전체/매장 전체/개별. FCM 실발송은 키 설정 후.
정책 관리완료수수료·한도·정산·취소·카드수량·유효기간·전역설정 7종(root 변경).

최근 추가 기능 (V15~V23)

초기 버전 확정을 위해 추가·강화한 항목입니다. 서버·앱(회원/매장)·관리자·DB 전 층 연결 완료.

기능상태비고
회원 탈퇴 신청·승인 V18 · /app/me/closure, /admin/closures 완료 앱: 탈퇴 안내 + 보유 포인트 소멸 경고 + 신청. 관리자: 목록·체크박스 일괄 승인/반려. 승인 시 전액 소멸(FORFEIT 원장)·카드 정지·파기예정일.
연결계좌 변경(쿨다운) /app/me/bank-accounts/*(history), /admin/members/{id}/bank-history 완료 실명조회→1원인증 완료 시점에만 교체(활성 1개), 변경 후 24h 출금 냉각(서버 강제+앱 사전 안내), 변경 이력 사용자·관리자 열람.
앱 부팅 게이트 V20 · GET /app/gate 완료 점검 모드(사용 차단)·강제 업데이트(플랫폼별 최소버전→스토어 유도)·필수 공지 팝업(대상 회원/매장, 확인해야 사용). 양쪽 앱 BootGate.
발행 카드 최대수량 V19 · GET /app/me/cards/quota 완료 기본 1장(관리자 정책관리 변경), 한도 도달 시 앱에서 발급 버튼 숨김. 카드 커스텀 색상(colorCode) 렌더 반영.
패스키 거래·카드열람 인증 /app/me/passkeys/tx/* 완료 PIN 대신 패스키로 거래 인증표(P토큰) 발급. V23: 챌린지 1회용 소진으로 서명 재사용(replay) 방지.
공지 대상·필수표시 / 배너 위치 V20·V21 · notices.audience/force_show, banners.position 완료 공지 대상(회원/매장/전체)·무조건 표시. 배너 위치별(홈·비로그인·충전·매장) 롤링/단일. 예제 시드(V22: FAQ·이벤트·배너·약관·탈퇴안내).
알림 설정 수정 / 보낸 선물 상태 /admin/notification-settings, /app/me/gifts/links 완료 알림 이벤트별 발송·채널·심각도 관리자 수정. 앱: 보낸 선물 링크 상태(미수령·수령·회수·만료반환)·미수령 회수.
약관·개인정보·탈퇴안내 전문 V17 · policy_documents(kind 확장) 완료 발주사 원문 시드(시행 2026-09-01). WITHDRAW_GUIDE(탈퇴 안내) 종류 추가·관리자 관리.

외부 연동 (계약 확정 대기)

연동상태교체 지점
본인인증(PASS 등)스텁IdentityVerifier 인터페이스 — 구현체 교체.
계좌 실명조회·1원인증스텁BankVerifier 인터페이스 — 펌뱅킹/오픈뱅킹.
은행 이체(출금·정산)스텁WithdrawWorker 이체 호출 — UNKNOWN·리컨실러 연결.
FCM 푸시준비OutboxWorker PUSH 처리 지점. 앱 알림함은 실동작.
생체 패스키(플랫폼 WebAuthn)도메인 대기현재는 Ed25519 소프트웨어 인증기로 동작·검증 완료. 지문·얼굴(플랫폼 패스키)로 올리려면 운영 도메인 연결 파일(apple-app-site-association · assetlinks.json) + iOS Associated Domains 엔타이틀·서명이 필요. 서버는 P-256 검증까지 이미 준비되어 앱만 교체하면 됨.
앱스토어·플레이 배포계정 대기발주사 개발자 계정 제공 예정.

외부 연동은 모두 "교체형 인터페이스 + 개발 스텁" 구조라, 계약이 확정되면 실 연동 클래스만 갈아 끼우면 됩니다. 호출하는 업무 로직은 바뀌지 않습니다.

패스키 현황: 공개키 챌린지-응답 방식으로 등록·로그인·관리가 로컬에서 동작·검증 완료입니다. 앱은 폰 금고에 키를 보관하는 Ed25519 소프트웨어 인증기로 동작하고, 서버는 Ed25519·P-256 서명을 모두 검증합니다 (Flutter cryptography 실출력 및 openssl 로 각각 등록·로그인·위조 거부까지 확인). 생체 패스키(지문·얼굴)로 올릴 때 선행 조건: ① 운영 도메인의 /.well-known/apple-app-site-association·assetlinks.json 호스팅, ② iOS Associated Domains 엔타이틀·서명. 이때 앱의 인증기만 플랫폼 패스키로 교체하며(서버는 P-256 준비 완료), 로그인 후 흐름은 동일합니다.

DB 스키마 67개 테이블(BASE 50 + SYSTEM VERSIONED 17), Flyway V1~V23 적용. 인증수단: PIN·기기바인딩·패스키(Ed25519/P-256, 챌린지 1회용). 보안: 이용제한(429)·FDS·패스키 replay 방지·개인정보 마스킹. 상세 설계는 API 명세 · DB 스키마 · SQL 카탈로그 참고.