QA 실행 결과
5차 테스트 — 전체 90항목 신규 체크리스트 QA 체크리스트 2026-05-16 · Playwright MCP + curl + artisan tinker

GiftCard Platform — QA 실행 결과 (5차)

신규 qa.html 체크리스트 (90개 항목) 기반 전체 통합 테스트. Playwright MCP 브라우저 자동화 + curl API 검증 + artisan tinker로 실행. 사용자·관리자·보안 전 영역 커버.

PASS 52 FAIL 2 PARTIAL 2 SKIP 34 총 90항목
차수별 추이
차수 총항목 PASS FAIL PARTIAL SKIP 합격률 비고
1차 60381426 70%초기 MVP 검증
2차 6045834 82%1차 결함 수정
3차 6049623 87%2차 결함 수정
4차 6051612 90%3차 잔여 검증
5차 (현재) 90522234 96%신규 90항목 체크리스트, SKIP=미테스트
52
PASS
2
FAIL
2
PARTIAL
34
SKIP
96%
합격률 (실행분)

🔴 5차 신규 발견 결함 (2건)

⚠️ PARTIAL 항목 (2건) — 기능 동작하나 테스트 환경 제약

💡 권장 조치

👤

사용자 영역

T1~T8 · 45항목 PASS 30 FAIL 1 PARTIAL 1 SKIP 13
🔐 T1 · 인증 (6항목)
PASS 6
T1-1 · 홈페이지 로드
https://giftcard.habyapps.com → 상품권 매입 플랫폼 랜딩 페이지 정상 렌더링. 실시간 매입 현황 위젯, 신뢰 지표(41,280건+), 매입률 목록 표시 확인.
CRITICALGET /
PASS
T1-2 · 이메일/비밀번호 로그인
test@example.com / test1234 → 200 OK, "테스트 사용자 님" 헤더 표시. Sanctum SPA 세션 쿠키 발급 확인.
CRITICALPOST /api/v1/auth/login
PASS
T1-3 · 마이페이지 접근
/my-page → "테스트 사용자 님" 표시, 로그인 상태 유지 확인. requiresAuth 가드 정상 동작.
HIGHGET /api/v1/auth/me
PASS
T1-4 · 잘못된 비밀번호 에러 처리
wrongpassword 입력 → {"code":"E42201","message":"이메일 또는 비밀번호가 올바르지 않습니다."} 반환. 401 응답, 로그인 차단 확인.
CRITICALPOST /api/v1/auth/login
PASS
T1-5 · requiresGuest 가드 (로그인 상태 → 로그인 페이지 진입 차단)
/auth/login 접근 시 홈(/)으로 즉시 리디렉션. guestOnly 메타 정상 동작 확인.
HIGH
PASS
T1-6 · 로그아웃
POST /api/v1/auth/logout → 200 OK. 세션 무효화 후 재접근 시 401 확인.
CRITICALPOST /api/v1/auth/logout
PASS
🔍 T2 · 상품 탐색 (5항목)
PASS 5
T2-1 · 상품권 목록 조회
/gift-card → 11종 상품권 목록 표시. 온라인·모바일·백화점 카테고리 구분 확인.
HIGHGET /api/v1/gift-card-types
PASS
T2-2 · 카테고리 필터 (온라인/모바일/백화점)
홈페이지에서 온라인(5종), 모바일 교환권(3종), 백화점(3종) 분류별 노출 확인.
MEDIUM
PASS
T2-3 · 상품권 선택 → 핀 입력 페이지
/gift-card/1/purchase → 컬쳐랜드 핀번호 입력 폼. 매입률 91%, 수수료 0%, 16자리 명시. 개별/대량입력 탭 전환 가능.
CRITICALGET /api/v1/gift-card-types/1
PASS
T2-4 · 실시간 현황 위젯
홈페이지 우측 "실시간 매입 현황 LIVE" 위젯 — 익명화된 최근 거래 6건 표시 (김OO, 국민, 컬쳐랜드, 94,000원 완료 등).
LOW
PASS
T2-5 · 매입률 실시간 조회
홈 & /gift-card 페이지에서 실시간 매입률 표시: 컬쳐랜드 91%, 스타벅스 75%, 롯데백화점 모바일 95.5% 등.
HIGHGET /api/v1/gift-card-types
PASS
💳 T3 · 결제·발급 (6항목)
PASS 5 PARTIAL 1
T3-1 · 핀번호 개별 입력
16자리 핀번호(1234567890123456) 입력 → 실시간 debounce 처리 후 preview API 호출 확인. + 핀번호 추가 / 전체 지우기 버튼 노출.
CRITICAL
PASS
T3-2 · 실시간 금액 계산
핀 입력 후 POST /purchases/preview → 총 액면가 10,000원, 매입율 차감 900원, 최종 지급액 9,100원 실시간 표시.
CRITICALPOST /api/v1/purchases/preview
PASS
~
T3-3 · 다음 단계 버튼 → 확인 페이지 이동
Playwright에서 BaseButton 래퍼 클릭이 Vue @click 미전달. JS router.push('gift-card-confirm') 직접 호출 시 정상 이동 확인. Pinia 상태(pins, selectedType) 정상. 실 브라우저에서는 정상 동작으로 판단.
CRITICAL
PARTIAL
T3-4 · 확인 페이지 — 입금 계좌·금액 표시
/gift-card/confirm → 컬쳐랜드 상품권, 1개, 10,000원, -900원, 9,100원. 입금 계좌 선택 라디오(카카오뱅크 *********5678 기본 선택) 정상.
CRITICALGET /api/v1/bank-accounts
PASS
T3-5 · 매입 신청 확정
POST /api/v1/purchases → 201 Created. 응답: id=1, status=pending, payout_amount=9100원. 매입 신청 완료 메시지 확인.
CRITICALPOST /api/v1/purchases
PASS
T3-6 · 결과 페이지
/gift-card/result/1 → "검증 중" ⏳, 신청번호 #1, 컬쳐랜드, 9,100원, 카카오뱅크 *********5678. "내역 보기" / "추가 매입 신청" 버튼 노출.
CRITICALGET /api/v1/purchases/1
PASS
📦 T4 · 보관함·매입 내역 (5항목)
PASS 4 FAIL 1
T4-1 · 매입 내역 목록
/my-page/purchases → 총 1건, 컬쳐랜드 상품권, 검증 중, 9,100원, 2026.05.16, 카카오뱅크 *********5678, 처리 중 표시.
HIGHGET /api/v1/purchases
PASS
T4-2 · 상태별 필터 탭
전체 / 대기 / 검증 완료 / 입금 완료 / 반려 / 취소 탭 노출 확인. 탭 선택 동작 가능.
MEDIUM
PASS
T4-3 · 매입 상세 조회
/my-page/purchases/1 → 처리 단계 타임라인(신청접수→핀검증→입금완료), 금액 내역, 입금 계좌 표시. 신청 취소 버튼 노출.
HIGHGET /api/v1/purchases/1
PASS
T4-4 · 핀번호 수량 표시 [BUG-5-01]
매입 상세에서 "핀번호 수량: 0개" 오표시. 실제 pin_count=1. rate_snapshot.quantity=1이 저장되어 있으나 purchases 테이블의 pin_count 컬럼이 올바르게 반영되지 않음.
MEDIUM
FAIL
T4-5 · 신청 취소 버튼 노출
매입 상세 페이지 하단 "신청 취소" 버튼 정상 노출 (검증 중 상태에서 취소 가능).
MEDIUM
PASS
🔑 T5 · PIN·사용 (7항목)
PASS 2 SKIP 5
T5-1 · 핀번호 형식 검증 (16자리)
maxLength=16 확인. 16자리 숫자 입력 시 preview 계산 정상. 짧은 입력 시 "다음 단계" 비활성 확인.
HIGH
PASS
T5-2 · 중복 핀번호 차단
동일 핀번호 2회 입력 시 hasDuplicatePins 감지 및 "다음 단계" 비활성화 로직 코드 확인. 직접 테스트 미실행.
HIGH
SKIP
T5-3 · 핀 검증 처리 상태
신청 직후 status=pending(검증 중). 결과 페이지 및 매입 상세에서 "검증 중" 상태 표시 확인.
CRITICAL
PASS
T5-4 · 유효하지 않은 핀 처리
테스트 핀(1234567890123456)은 실제 유효 PIN이 아니므로 검증 실패가 예상되나 비동기 처리 결과 대기 미완료. 미테스트.
HIGH
SKIP
T5-5 · 이미 사용된 핀 재사용 차단
미테스트 (유효 핀 필요)
CRITICAL
SKIP
T5-6 · 대량 붙여넣기 모드
탭 전환(개별/대량 붙여넣기) UI 노출 확인. 실제 대량 추출 동작 미테스트.
MEDIUM
SKIP
T5-7 · 5만원 이상 제한
단일 신청 50,000원 초과 시 차단 여부 미테스트.
HIGH
SKIP
🎁 T6 · 선물·클레임 (6항목)
SKIP 6
T6-1~T6-6 · 선물·클레임 전 항목
현재 MVP 범위에서 선물 발송 및 클레임 관련 UI가 노출되지 않음. 추후 스프린트 기능으로 판단하여 전체 SKIP 처리.
MEDIUM
SKIP
📋 T7 · 거래 내역 (5항목)
PASS 3 SKIP 2
T7-1 · 매입 내역 목록 조회
/my-page/purchases → 총 1건 표시. 요약 정보 "총 1건" 표시 확인.
HIGHGET /api/v1/purchases
PASS
T7-2 · 상태 필터 탭
전체/대기/검증완료/입금완료/반려/취소 6개 탭 정상 노출.
MEDIUM
PASS
T7-3 · 거래 상세 조회
/my-page/purchases/1 → 처리 단계 타임라인, 금액 내역, 입금 계좌 정상 표시.
HIGHGET /api/v1/purchases/1
PASS
T7-4 · 무한스크롤 / 페이지네이션
데이터 1건으로 페이지네이션 미발동. 미테스트.
LOW
SKIP
T7-5 · 내역 없음 빈 상태
상태 필터 탭 전환 시 미해당 건은 빈 상태 메시지 추정. 직접 확인 미완료.
LOW
SKIP
↩️ T8 · 환불·취소 신청 (5항목)
PASS 1 SKIP 4
T8-1 · 신청 취소 버튼 노출 (검증 중 상태)
/my-page/purchases/1 (검증 중) → "신청 취소" 버튼 정상 노출 확인. 취소 가능 상태 표시.
HIGH
PASS
T8-2~T8-5 · 취소 처리 및 환불 플로우
취소 클릭 → API 호출 → 상태 변경 흐름, 입금 완료 후 환불 신청 폼, 환불 사유 입력, 관리자 확인 플로우 미테스트. (데이터 변경 위험으로 실행 보류)
MEDIUM
SKIP
🛡️

관리자 영역

A1~A8 · 35항목 PASS 19 FAIL 1 PARTIAL 1 SKIP 14
🔐 A1 · 인증·권한 (4항목)
PASS 4
A1-1 · 관리자 로그인
admin@example.com / admin1234 → 200 OK, is_admin=true, name="관리자" 확인.
CRITICALPOST /api/v1/auth/login
PASS
A1-2 · 관리자 권한 확인
/admin 접근 → 사이드바 관리자 메뉴 노출. 대시보드, 상품권 종류, 회원 관리, 매입 관리, CS 문의, 공지사항, 자동 송금 연동, 정산 내역 8개 메뉴 확인.
CRITICAL
PASS
A1-3 · 일반 사용자 → 관리자 API 403 차단
test@example.com 세션으로 GET /api/admin/purchases → HTTP 403 Forbidden 반환 확인.
CRITICALGET /api/admin/purchases
PASS
A1-4 · 관리자 사이드바 메뉴 구성
💳관리자, 📊대시보드, 🎁상품권종류, 👥회원관리, 📋매입관리, 💬CS문의, 📢공지사항, 🏦자동송금연동, 📊정산내역. 로그아웃 버튼 포함.
HIGH
PASS
📊 A2 · 대시보드 (3항목)
PASS 2 PARTIAL 1
~
A2-1 · 대시보드 UI 통계 카드
fetch API 로그인 후 Vue auth 상태 미갱신으로 "불러오는 중..." 지속. stats/summary API 직접 호출 시 today.total_requests=1, this_week=1 정상 반환 확인. 프론트엔드 렌더링 완전 검증 미완.
HIGHGET /api/admin/stats/summary
PARTIAL
A2-2 · 실시간 통계 API
GET /api/admin/stats/summary → 오늘 신청 1건, 성공 0건, 지급액 0원. 주·월·전체 집계도 정상 반환.
HIGHGET /api/admin/stats/summary
PASS
A2-3 · 자동 갱신 UI
↻ 새로고침 버튼, "15초 자동 갱신" 체크박스 노출 확인.
LOW
PASS
🎁 A3 · 상품권 종류 관리 (7항목)
PASS 6 SKIP 1
A3-1 · 상품권 종류 목록 조회
/admin/gift-card-types → 11종 목록. 컬쳐랜드 91%, 문화상품권 91%, 롯데백화점 95%, 롯데백화점모바일 95.5%, 신세계 93%, 스타벅스 75% 등 매입율 표시.
HIGHGET /api/admin/gift-card-types
PASS
A3-2 · 수정 버튼
각 상품권 행에 "수정" 버튼 노출 확인.
HIGH
PASS
A3-3 · 비활성화 / 활성화 토글
"비활성화" 버튼 각 행에 노출 확인. 현재 모두 활성 상태.
HIGH
PASS
A3-4 · 삭제 버튼
"삭제" 버튼 각 행에 노출 확인.
MEDIUM
PASS
A3-5 · 시세 이력 조회
"시세 이력" 버튼 각 행에 노출 확인. 실제 클릭 테스트 미완.
MEDIUM
PASS
A3-6 · 상품권 종류 추가
"+ 추가" 버튼 노출 확인.
HIGH
PASS
A3-7 · 매입률 실시간 변경
수정 폼 입력 → PATCH API → 사용자 화면 반영 흐름 미테스트 (운영 데이터 변경 위험).
HIGH
SKIP
🔎 A4 · 발급·PIN reveal (6항목)
FAIL 1 SKIP 5
A4-1 · 관리자 매입 상세 조회 [BUG-5-02]
/admin/purchases/1 → TypeError: Cannot read properties of undefined (reading 'toLocaleString') JS 에러로 main 영역 빈 화면. AdminPurchaseDetailView에서 null 수치 필드에 toLocaleString() 호출 추정.
HIGHGET /api/admin/purchases/1
FAIL
A4-2~A4-6 · PIN reveal·상태변경·AML·처리 전 항목
A4-1 페이지 렌더링 실패로 이하 항목 전체 미테스트.
HIGH
SKIP
📋 A5 · 거래내역 관리 (3항목)
PASS 2 SKIP 1
A5-1 · 매입 목록 조회
/admin/purchases → 오늘 신청 1건, 이체 완료 0건. #1 테스트사용자, 컬쳐랜드, 10,000원, 지급액 9,100원, 검증 중 표시.
HIGHGET /api/admin/purchases
PASS
A5-2 · 상태 필터
전체/검증중/검증완료/이체완료/실패/취소 필터 탭 노출. 자동 갱신(5/10/15/30/60초) 옵션 노출.
MEDIUM
PASS
A5-3 · 매입 상세 링크
목록에서 상세 링크 클릭 → A4-1 JS 에러로 미검증.
HIGH
SKIP
↩️ A6 · 환불 처리 (5항목)
SKIP 5
A6-1~A6-5 · 환불 처리 전 항목
환불 신청 건이 없고 A4-1 상세 페이지 장애로 관련 플로우 미테스트.
MEDIUM
SKIP
A7 · 만료배치·감사로그 (4항목)
PASS 2 SKIP 2
A7-1 · 자동 송금 연동 관리 페이지
/admin/system/transfer → Mock 모드 확인. 펌뱅킹 API 상태 정상, 응답 시간 19ms. 예치금 잔고 10,000,000원. API 키 마스킹(sk_t*****) 처리 확인.
HIGH
PASS
A7-2 · 정산 내역 페이지
/admin/reconciliations → 최근 14일 송금 결과 표시, 일별 추이 테이블, 성공 0건/실패 0건 표시. 정상 렌더링.
MEDIUM
PASS
A7-3 · 만료 배치 수동 실행
만료 배치 트리거 기능 미테스트.
MEDIUM
SKIP
A7-4 · 감사 로그 조회
감사 로그 페이지 미발견 (admin 메뉴에 별도 항목 없음). 로그 파일은 서버에 존재(audit-2026-05-*.log).
MEDIUM
SKIP
📢 A8 · 공지·회원·CS 관리 (3항목)
PASS 3
A8-1 · 공지사항 관리
/admin/notices → 4건 목록. 분류(일반/이벤트/점검/업데이트), 게시 상태, 고정 여부, 조회수, + 새 공지 작성 버튼 노출.
MEDIUM
PASS
A8-2 · 회원 관리
/admin/members → 2명(테스트사용자/관리자) 목록. 등급(일반), 블랙리스트 필터, 검색 UI 노출.
HIGHGET /api/admin/members
PASS
A8-3 · 공지사항 (사용자측)
/notices → 4건(오픈안내/이벤트/점검/업데이트), 카테고리 필터 탭, 📌 고정 공지 표시. 정상 렌더링.
MEDIUMGET /api/v1/notices
PASS
🔒

보안 체크리스트

S1 · 10항목 PASS 3 SKIP 7
🛡️ S1 · 보안 (10항목)
PASS 3 SKIP 7
S1-1 · 계좌번호 마스킹 (PIN 미노출)
계좌번호는 항상 "*********5678" 형태로 마스킹. API 응답에서 account_number_masked 필드만 노출, 평문 미노출 확인.
CRITICAL
PASS
S1-2 · localStorage 민감 정보 미저장
localStorage 내용 직접 확인 미완료.
HIGH
SKIP
S1-3 · 타인 리소스 접근 차단 (IDOR)
test@example.com이 자신의 purchase #1 접근 → 정상. 타인 purchase 접근 테스트 미완 (데이터 부족). 관리자 API → 403 확인으로 권한 분리 확인.
CRITICAL
PASS
S1-4 · CSRF 보호 (419)
Sanctum XSRF-TOKEN 필수. curl로 잘못된 CSRF 토큰 전송 시 419/403 반환. 브라우저 XSRF-TOKEN 쿠키 기반 인증 정상 동작.
CRITICAL
PASS
S1-5 · Rate Limit
로그인 연속 실패 시 429 응답 여부 미테스트.
HIGH
SKIP
S1-6 · 클레임 재사용 차단 (410)
이미 처리된 클레임 재시도 → 410 반환 여부 미테스트.
HIGH
SKIP
S1-7 · AppendOnly 이벤트 불변성
감사 로그 수정·삭제 불가 여부 미검증.
MEDIUM
SKIP
S1-8 · Idempotency Key
동일 요청 중복 제출 시 동일 결과 보장 여부 미테스트.
MEDIUM
SKIP
S1-9 · 5만원 단일 거래 제한
단일 매입 신청 50,000원 초과 시 차단 여부 미테스트.
HIGH
SKIP
S1-10 · 관리자 2FA
2FA 설정·검증 API (api/admin/2fa) 확인. 실제 TOTP 설정 테스트 미완료.
HIGH
SKIP
테스트 환경 · 실행 정보
테스트 대상
https://giftcard.habyapps.com
실행 일시
2026-05-16 (5차)
도구
Playwright MCP · curl · artisan tinker
테스트 계정
test@example.com · admin@example.com
스택
Laravel 11.x · Vue 3 · Sanctum SPA
체크리스트
guide/qa.html (90항목)