핵심 요약
파일 업로드는 multipart/form-data로 오며, 큰 파일을 버퍼로 통째 받으면 메모리가 터진다. 스트림으로 받아 디스크나 오브젝트 스토리지로 흘리고, 서버에서 크기 한도·확장자·실제 MIME을 반드시 검증한다(클라이언트 검증은 우회 가능).
1. 핵심 원칙
- 스트리밍 파서(multer/busboy)로 메모리 점유 최소화
- 최대 크기 제한을 서버에서 강제
- 저장 파일명은 랜덤 생성 — 사용자 입력 파일명 그대로 쓰지 말 것
2. 검증 포인트
| 검증 | 이유 |
|---|---|
| 크기 한도 | DoS·디스크 폭주 방지 |
| 확장자 화이트리스트 | 실행 파일 업로드 차단 |
| 매직 넘버(실제 타입) | 확장자 위조 방지 |
3. 함정
- 웹 루트(public)에 실행 가능한 파일을 그대로 저장하면 원격 실행 위험 — 정적 서빙 경로/권한 분리
- Content-Type 헤더는 위조 가능 — 파일 시그니처로 실제 타입 확인
- 경로 조합 시
../차단(path traversal)
자주 묻는 질문
클라이언트에서 확장자 검사했는데 서버도 해야 하나요?
반드시요. 클라이언트 검증은 우회됩니다. 서버에서 크기·확장자·실제 MIME를 다시 검증하지 않으면 악성 파일이 올라옵니다.
파일명을 그대로 저장하면 안 되나요?
덮어쓰기·경로 탈출·실행 위험이 있습니다. 서버에서 랜덤 이름을 부여하고 원본명은 메타데이터로만 보관하세요.

댓글 0