- 환경 설정 및 실행 방법
- 기술 스택
- 구현 기능
- 요구사항 반영 결과
- 데이터베이스 구조
- 보안 조치
배포 URL: https://usedhub.onrender.com
| 항목 |
값 |
| 아이디 |
admin |
| 비밀번호 |
admin1234 |
DB와 이미지 스토리지가 Supabase 외부 서비스에 의존하므로, 별도 설정 없이는 로컬 실행이 불가합니다.
로컬에서 실행하려면 프로젝트 루트에 .env 파일을 생성하고 아래 항목을 설정한 뒤 실행합니다.
DATABASE_URL=postgresql://...
SESSION_SECRET=임의의_긴_문자열
SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_SERVICE_KEY=...
| 구분 |
내용 |
| Backend |
Node.js, Express |
| Database |
PostgreSQL (Supabase) |
| 실시간 통신 |
Socket.IO |
| 인증 |
express-session, bcryptjs |
| 파일 업로드 |
Multer + Supabase Storage |
| 배포 |
Render |
- 회원가입 / 로그인 / 로그아웃
- 아이디·닉네임 중복 방지, 비밀번호 형식 검증
- 마이페이지 (닉네임·소개글·비밀번호 수정)
- 가입 시 기본 잔액 100,000원 자동 지급
- 상품 등록 (이미지 업로드 포함)
- 상품 목록 / 상세 조회
- 상품 수정 (이름·설명·가격·카테고리·지역·판매상태)
- 내 상품 관리 (수정·삭제)
- 키워드 검색 (상품명·설명)
- 카테고리 / 지역 / 판매상태 필터
- 가격 범위 필터 (최소~최대)
- 정렬 (최신순·가격낮은순·가격높은순·이름순)
- 전체 채팅 (실시간, Socket.IO)
- 1:1 DM 채팅 (실시간, Socket.IO)
- 읽음 처리 — 상대방이 메시지를 수신할 때 실시간 갱신
- DM 목록 안읽은 메시지 수 뱃지 (카카오톡 스타일)
- 알림 시스템 — 실시간 토스트(우상단) + 알림 페이지
- 현재 채팅방의 알림은 토스트 미표시
- 유저 프로필에서 차단 / 차단 해제
- 차단 상태에서 DM 시작 불가 (양방향)
- 차단 목록 페이지 (
/my-blocks)
- 상품·유저 신고 (사유 입력 필수, 중복 신고 방지)
- 신고 누적 시 자동 경고 부여 + 알림 발송
- 관리자 수동 기간 정지 (1일·3일·7일·30일·1년)
- 영구정지 / 정지 해제
- 정지·영구정지 계정 로그인 차단 (남은 기간 안내)
- 마이페이지에 경고 횟수·정지 상태 표시
- 잔액 조회 및 송금 내역
- 6자리 PIN 인증 후 송금 처리 (DB 트랜잭션)
- 잔액 부족·자기 자신 송금 차단
- 송금 완료 시 DM방에 거래 카드 자동 표시
- 거래 후기 — 송금한 거래에 한해 👍/👎 + 텍스트 작성 가능
- 후기는 거래 카드의 "후기 남기기" 버튼으로 이어짐
- 유저 프로필에 받은 후기 요약 (👍 n개 / 👎 n개) 표시
- 후기 목록 최신순 20개
- 송금 거래 1건당 1개의 후기만 작성 가능
/admin — 통계 요약 + 최근 항목 미리보기
/admin/users — 유저 검색·필터(전체/영구정지/경고/정지중)·페이지네이션·정지 적용
/admin/products — 상품 검색·차단/해제/삭제·페이지네이션
/admin/reports — 신고 내역 (유저/상품 필터)·페이지네이션
/admin/transfers — 송금 로그, 이름 검색·날짜 필터·페이지네이션
/admin/messages — 채팅 로그, 내용·발신자 검색·날짜 필터·DM/전체채팅 탭·페이지네이션
| 요구사항 |
구현 여부 |
주요 경로 |
| 플랫폼 가입 |
✅ |
/register, /login |
| 상품 등록 및 조회 |
✅ |
/product/new, /products, /products/:id |
| 사용자 간 소통 |
✅ |
/chat, /chat/direct/:roomId |
| 악성 유저·상품 차단 |
✅ |
신고→경고→정지, 관리자 제재, 사용자 차단 |
| 유저 간 송금 |
✅ |
/wallet, PIN 인증, DB 트랜잭션 |
| 상품 검색 |
✅ |
/products?q=... + 다중 필터 |
| 관리자 전체 관리 |
✅ |
/admin/* 대시보드 및 상세 페이지 |
| 테이블 |
설명 |
users |
회원 정보, 잔액, 경고 횟수, 정지 일시, PIN 해시 |
products |
상품 정보, 판매상태, 차단 여부 |
direct_rooms |
1:1 채팅방, 읽음 시각 |
messages |
채팅 메시지 (전체·DM), 거래 카드 타입 포함 |
transfers |
송금 내역 |
notifications |
알림 목록 |
reports |
신고 내역 (중복 신고 방지 UNIQUE 제약) |
user_blocks |
사용자 차단 관계 |
reviews |
거래 후기 (송금 1건당 1개 UNIQUE 제약) |
- 비밀번호 bcrypt 해시 저장
- 세션 쿠키
httpOnly, sameSite=lax
- 로그인 필요 경로 미들웨어 분리 (
requireAuth)
- 관리자 전용 경로 미들웨어 분리 (
requireAdmin)
- 서버 측 HTML 이스케이프로 XSS 방지 (
h() 함수)
- 파일 업로드 MIME 타입 검사 (
image/*만 허용)
- 송금 PIN 6자리 bcrypt 해시 저장 및 검증
- 차단·정지 계정 접근 차단 (로그인·DM·채팅 전송)
- 1:1 채팅방 접근 권한 검증 (방 참여자만 입장)
- 중복 신고 방지 (DB UNIQUE 제약)
- 송금 서버 측 잔액 검증 (클라이언트 우회 불가)