파일 업로드 파이프라인: tmp → 검증/전처리 → 공개 디렉토리
업로드 직후 바로 공개하지 않고, 임시 디렉토리에서 검증/리사이즈 후 최종 위치로 이동하는 운영 패턴
업로드 파일은 “받는 순간”부터 공격 표면이 됩니다.
- 확장자 위장
- 이미지/파일 포맷 파서 취약점
- 경로 조작(path traversal)
- 악성 스크립트 업로드
그래서 운영에서는 보통 아래 파이프라인을 씁니다.
uploads/tmp에 저장- 검증/전처리(리사이즈, 포맷 변환, 메타 추출, 스캔)
- “검증이 끝난 파일만”
uploads/public/...같은 최종 위치로 이동 - 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 발급 + 메타 검증만 담당
이 패턴으로 앱 서버의 디스크/트래픽 부담을 크게 줄일 수 있습니다.
같이 보면 좋은 문서: