Skip to content

Latest commit

 

History

History
74 lines (61 loc) · 3.68 KB

File metadata and controls

74 lines (61 loc) · 3.68 KB

보안 체크리스트

인증과 세션

  • 비밀번호 원문을 저장하지 않고 Django 인증 기능 사용
  • 비밀번호 길이·유사도·흔한 비밀번호 검사
  • 로그인 연속 실패 제한
  • 운영 로그인 실패 횟수를 Redis 공유 캐시에 저장하도록 설정
  • 로그아웃을 POST 요청으로 처리
  • 세션 쿠키 HttpOnly, SameSite=Lax
  • 운영 환경에서 세션·CSRF 쿠키 Secure

접근 권한

  • 상품 등록·수정·삭제에 로그인 요구
  • 상품 수정·삭제 시 판매자 소유권 재검사
  • 구매 요청 처리는 상품 판매자만 가능
  • 결제는 승인된 구매 요청의 구매자만 가능
  • 구매 확정·환불은 해당 구매자만 가능
  • 비공개 대화와 결제 영수증은 당사자만 열람
  • 관리자 페이지는 staff 권한 요구
  • 관리자 교차 모델 액션은 실제 변경 대상 모델 권한을 별도로 요구

결제와 계좌

  • 계좌번호 전체 값은 저장하지 않고 끝 4자리와 임의 연결 토큰만 저장
  • 계좌 연결·변경과 결제 전에 현재 비밀번호 재확인
  • 결제 금액을 클라이언트 입력이 아닌 상품 가격으로 결정
  • 판매자는 검증된 정산 계좌가 있어야 구매 요청 승인 가능
  • 일회성 주문 UUID와 구매 요청별 결제 유일 제약으로 이중 결제 방지
  • 결제·구매·상품 상태를 하나의 트랜잭션에서 변경
  • 결제 완료 후 구매 확정 전에는 연결 계좌 해제 차단
  • 결제 원장은 관리자도 임의 추가·삭제할 수 없도록 제한
  • 결제·정산·환불 시각과 상태 보존
  • 실제 은행 API의 서명 검증·웹훅 재전송·멱등 키 검증
  • 실제 결제대행사 토큰과 계좌 실명확인 연동

입력과 출력

  • Django Form으로 길이·형식·범위 검사
  • ORM을 사용해 SQL Injection 방어
  • 템플릿 자동 이스케이프로 XSS 방어
  • CSP·클릭재킹·MIME 스니핑 방지 헤더
  • 정렬 조건 허용 목록 적용
  • 이미지 입력 크기·픽셀 수·실제 형식·예상 디코딩 메모리·변환 결과 크기 검사
  • 이미지 재인코딩과 무작위 파일명

상태 변경과 동시성

  • 상태 변경 요청에 POST 사용
  • CSRF 미들웨어와 토큰 사용
  • 구매 승인·결제·구매 확정·환불에 트랜잭션과 행 잠금 사용
  • 상품 수정에 행 잠금 사용, 상품별 승인·완료 거래 1개 DB 제약
  • 예약 또는 판매 완료된 상품 수정 차단
  • 승인·결제·정산 직전에 상품·계정·차단 상태 재검사
  • 구매 확정 전 취소 시 결제 환불과 상품 판매 상태 복구

운영

  • 운영용 설정 파일 분리
  • 운영 비밀키 환경변수 사용
  • 운영 WSGI/ASGI 기본 설정을 fail-closed로 구성
  • HTTPS 리다이렉트·HSTS 설정
  • 알 수 없는 주소의 기술적 URL 목록 노출 방지
  • .env, DB, 업로드 파일, 가상환경 Git 제외
  • GitHub Actions 자동 테스트와 외부 액션 전체 커밋 SHA 고정
  • 관리자 신고·상품 차단 처리자 로그
  • 실제 배포 시 PostgreSQL로 변경
  • 실제 Redis 서비스의 인증·네트워크 제한·고가용성·복구 통합 테스트
  • 업로드 악성코드 검사와 별도 미디어 도메인 적용
  • 정기 백업 및 복구 테스트
  • 결제 웹훅·관리자 조작·환불 감사 로그의 중앙 수집과 경보 연동

체크되지 않은 항목은 실제 금융 API와 운영 인프라를 연결할 때 반드시 추가로 구현하고 검증해야 한다.