파일 업로드 파이프라인: tmp → 검증/전처리 → 공개 디렉토리

업로드 직후 바로 공개하지 않고, 임시 디렉토리에서 검증/리사이즈 후 최종 위치로 이동하는 운영 패턴

분야: 백엔드/API uploadssecuritynodejsmultersharp

업로드 파일은 “받는 순간”부터 공격 표면이 됩니다.

  • 확장자 위장
  • 이미지/파일 포맷 파서 취약점
  • 경로 조작(path traversal)
  • 악성 스크립트 업로드

그래서 운영에서는 보통 아래 파이프라인을 씁니다.

  1. uploads/tmp에 저장
  2. 검증/전처리(리사이즈, 포맷 변환, 메타 추출, 스캔)
  3. “검증이 끝난 파일만” uploads/public/... 같은 최종 위치로 이동
  4. nginx는 최종 위치만 서빙

1) 디렉토리 예시

/srv/myapp/uploads/
  tmp/
  public/
    avatars/
    attachments/

2) 업로드 처리 체크리스트

  • 파일 크기 제한(서버 + nginx)
  • 허용 MIME/확장자 allowlist
  • 파일명은 랜덤(UUID 등)으로 재발급(원본명은 메타로 저장)
  • 이미지면 sharp 같은 라이브러리로 디코딩/재인코딩(위장 포맷 방지에 도움)
  • 업로드 완료 후 권한/소유자 설정

3) nginx 서빙은 “public만”

tmp가 외부에 노출되면 검증 전에 다운로드될 수 있습니다.

관련 레시피: nginx: 민감 파일(.env/.git/백업) 차단

4) S3 presigned로 확장(선택)

트래픽이 커지면:

  • 파일은 S3(또는 호환 스토리지)에 저장
  • 서버는 presigned URL 발급 + 메타 검증만 담당

이 패턴으로 앱 서버의 디스크/트래픽 부담을 크게 줄일 수 있습니다.

같이 보면 좋은 문서:

관련 가이드