설계 정본(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 변경). |
초기 버전 확정을 위해 추가·강화한 항목입니다. 서버·앱(회원/매장)·관리자·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 카탈로그 참고.