Skip to content

Repository files navigation

Best Broker

Python과 Django로 만든 중고거래 플랫폼 프로토타입이다. 회원가입, 상품 등록·검색, 구매자와 판매자의 1:1 문의, 차단·신고, 구매 요청, 연결 계좌 결제, 구매 확정과 판매자 정산, 관리자 기능을 제공한다.

구현 기능

요구사항 구현 내용
플랫폼 가입 Django 인증 기반 회원가입·로그인·로그아웃
상품 등록과 조회 상품 등록·목록·상세·수정·소프트 삭제·이미지 업로드
사용자 간 소통 상품별 구매자-판매자 비공개 1:1 문의
악성 사용자·상품 차단 사용자 개인 차단, 신고 접수, 관리자 계정 비활성화·상품 차단
결제와 정산 계좌 연결, 상품 가격 결제, 구매 확정 대기, 판매자 정산, 결제 취소 환불
상품 검색 제목·설명·지역 검색, 카테고리·거래 상태 필터, 가격 정렬
관리자 관리 Django Admin에서 사용자·상품·신고·거래·결제 원장 관리

결제 프로토타입 범위

사용자 화면과 데이터 흐름은 일반 결제 서비스처럼 동작한다.

구매 요청 -> 판매자 승인 -> 구매자 결제 -> 구매 확정 대기
         -> 구매자 구매 확정 -> 판매자 정산 완료
         -> 결제 취소       -> 환불 완료

은행 계좌 연결 부분은 외부 은행 API를 대신하는 프로토타입 어댑터이다. 입력한 계좌번호 전체 값은 저장하지 않고 끝 4자리와 임의 연결 토큰만 저장한다. Payment 원장에는 주문 번호, 상품 가격, 구매자·판매자, 결제·정산·환불 상태가 기록된다. 실제 은행망 연결 시에는 계좌 연결과 출금·환불·정산 호출 부분을 정식 금융 API로 교체해야 한다.

빠른 실행 방법

1. 프로젝트 폴더로 이동

cd [해당 프로젝트 폴더]

2. 가상환경 생성

Windows PowerShell:

py -m venv .venv
.\.venv\Scripts\Activate.ps1

macOS 또는 Linux:

python3 -m venv .venv
source .venv/bin/activate

--> Visual Studio Code 등으로 사용 시 프로젝트 폴더를 VSC로 열면 됨

3. 라이브러리 설치

python -m pip install -r requirements.txt

4. 데이터베이스 준비

python manage.py migrate

기존 데이터베이스에는 0002_replace_wallet_with_payments 마이그레이션이 적용되면서 계좌 연결과 결제 원장 구조가 생성된다.

5. 데모 데이터 생성(선택)

python manage.py seed_demo --confirm-local-demo

이 명령은 화면 확인용 판매자·구매자, 마스킹된 연결 계좌와 상품을 만든다. --> 이 데모 데이터를 생성하기 위해선 DEBUG 모드가 True여야 한다. 하지만 이로 인해 잘못된 주소를 접속할 때 사전에 마련된 URL이 아닌 다른 URL들이 보이는 오류 페이지가 뜨게 되는데 실제 배포 시에는 DEBUG 모드를 False로 해서 실행하면 URL 정보가 나오지 않고 따로 마련된 404.html이 실행되는 것을 확인할 수 있다.

6. 개발 서버 실행

python manage.py runserver

CF) DEBUG를 False로 바꾸고 실행하고 싶은 경우

$env:DJANGO_DEBUG = "false"
python manage.py runserver --insecure

브라우저에서 http://127.0.0.1:8000/으로 접속한다. runserver 대신 실제 배포에서는 운영용 WSGI/ASGI 서버를 사용해야 한다.

결제 흐름 확인

  1. 판매자와 구매자가 각각 계좌 관리에서 계좌를 연결한다.
  2. 구매자가 상품 상세 화면에서 구매 요청을 보낸다.
  3. 판매자가 거래 화면에서 요청을 승인한다.
  4. 구매자가 결제하기를 눌러 상품 금액과 연결 계좌를 확인하고 결제한다.
  5. 결제 상태가 결제 완료 - 구매 확정 대기로 표시된다.
  6. 구매자가 상품 수령 후 구매 확정을 누르면 정산 완료로 바뀐다.
  7. 구매 확정 전 취소하면 결제 원장은 환불 완료로 바뀌고 상품은 다시 판매 중이 된다.

관리자 페이지

python manage.py createsuperuser

관리자 계정으로 /admin/에 접속하면 사용자, 상품, 구매 요청, 신고, 대화, 연결 계좌 상태와 결제 원장을 조회할 수 있다. 결제 원장은 분쟁 확인을 위해 관리자도 새로 만들거나 삭제할 수 없고 주요 필드가 읽기 전용이다.

자동 테스트

python manage.py test
python manage.py makemigrations --check --dry-run

운영 환경 보안 설정도 검사할 수 있다.

$env:DJANGO_SETTINGS_MODULE="config.settings_production"
$env:DJANGO_SECRET_KEY="충분히-길고-무작위인-운영용-비밀키"
$env:DJANGO_ALLOWED_HOSTS="example.com"
$env:DJANGO_REDIS_URL="redis://127.0.0.1:6379/1"
python manage.py check --deploy

주요 보안 설계

  • 비밀번호는 Django의 비밀번호 해시로 저장하고 로그인 연속 실패를 제한합니다. 운영에서는 Redis로 여러 웹 프로세스가 같은 실패 횟수를 공유한다.
  • 상품 수정, 구매 승인, 결제, 대화 조회마다 서버에서 현재 사용자의 객체 권한을 검사한다.
  • 상태 변경은 POST와 CSRF 토큰을 사용한다.
  • 검색은 Django ORM, 출력은 템플릿 이스케이프와 CSP를 적용한다.
  • 업로드 이미지는 파일 크기, 실제 형식, 픽셀 수, 예상 디코딩 메모리와 재인코딩 결과 크기를 검사한다.
  • 판매자는 정산 계좌가 있어야 구매 요청을 승인할 수 있다.
  • 결제 금액은 브라우저 입력을 믿지 않고 서버의 상품 가격에서 결정한다.
  • 계좌번호 전체 값은 저장하지 않고 끝 4자리와 연결 토큰만 저장한다.
  • 결제 전 현재 비밀번호를 다시 확인하고 일회성 주문 UUID로 이중 결제를 막는다.
  • 구매 확정과 환불은 트랜잭션과 행 잠금으로 결제·구매·상품 상태를 함께 변경한다.
  • 상품 수정도 행 잠금으로 현재 상태를 다시 확인하고, DB는 상품별 승인·완료 거래를 하나만 허용한다.
  • 결제·정산·환불 직전에 상품 차단, 계정 활성, 사용자 차단 관계를 다시 확인한다.
  • 존재하지 않는 주소는 내부 URL 목록을 노출하지 않는 일반 404로 응답하며, 관리자 상품 차단은 상품 변경 권한과 처리자 로그를 요구한다.

상세 설계와 검증 결과는 개발 보고서보안 체크리스트에 기록했다.

기술 구성

  • Python 3.12
  • Django 5.2 LTS
  • SQLite(로컬 개발), PostgreSQL 전환 가능
  • Django Template, HTML, CSS
  • Pillow 이미지 검증·재인코딩

About

시큐어 코딩 과제_중고거래 사이트 구현

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages