파일 업로드 제한을 올바르게 테스트하는 방법
웹 애플리케이션의 파일 업로드 기능을 개발할 때 「상한을 10MB로 설정했으니 괜찮겠지」라고 안심하고 있지는 않습니까? 사실 업로드 상한 테스트에는 많은 함정이 있으며, 올바르게 검증하지 않으면 본 환경에서 예기치 않은 오류가 발생합니다. 본 글에서는 경계값 테스트의 개념을 사용하여 업로드 상한을 정확하게 테스트하는 방법을 설명합니다.
경계값 테스트란
<strong>경계값 테스트(Boundary Value Testing)</strong>는 소프트웨어 테스트의 기본 기법 중 하나입니다. 입력값의 경계 부근, 즉 "정확히 상한""상한의 1바이트 앞""상한의 1바이트 초과"와 같은 지점에서 버그가 발생하기 쉽다는 경험칙에 기반하고 있습니다.
파일 업로드 상한 테스트에서는 최소한 다음 3가지 테스트 케이스를 준비해야 합니다.
- <strong>제한 크기와 정확히 같은</strong> 파일 — 업로드가 성공하는지 확인
- <strong>제한보다 1바이트 작은</strong> 파일 — 확실히 성공하는지 확인
- <strong>제한보다 1바이트 큰</strong> 파일 — 올바르게 거부되는지 확인
MB와 MiB를 혼동하지 않도록 주의
업로드 제한 테스트에서 가장 흔한 실수는 MB(메가바이트)와 MiB(메비바이트)를 혼동하는 것입니다.
- <strong>1 MB</strong> = 1,000,000 바이트(10진 기반, SI 단위)
- <strong>1 MiB</strong> = 1,048,576 바이트(2진 기반, IEC 단위)
이 차이는 약 4.86%이며, 10MB와 10MiB 사이에는 48,576바이트의 차이가 있습니다. 서버 쪽 프레임워크나 클라우드 서비스가 어느 단위를 사용하는지 정확히 파악하는 것이 중요합니다. 예를 들어, PHP의 <code>upload_max_filesize</code>에서 「10M」으로 지정하면 이는 10MiB(10,485,760바이트)로 해석됩니다. 한편, 일부 CDN이나 API 게이트웨이에서는 10MB(10,000,000바이트)로 처리하는 경우도 있습니다.
multipart/form-data의 오버헤드
파일 업로드에 사용되는 <code>multipart/form-data</code> 형식에는 파일 본체 외에도 boundary 문자열, Content-Disposition 헤더, 줄바꿈 코드 등의 오버헤드가 포함됩니다.
서버 측의 상한 체크가 리퀘스트 바디 전체에 대해 행해지는 경우, 파일 본체가 상한 이하여도 오버헤드를 포함하면 초과해 버릴 수 있습니다. Nginx의 <code>client_max_body_size</code>는 리퀘스트 바디 전체의 크기를 제한하므로, 이 점에 주의가 필요합니다.
# Nginx の設定例
client_max_body_size 10m; # リクエストボディ全体の上限(MiB単位)
프론트엔드와 백엔드의 이중 확인
테스트 시에는 프론트엔드(JavaScript)와 백엔드(서버) 모두에서 크기 확인이 수행되는지 확인하세요. 프론트엔드에서만 확인하는 경우, 개발자 도구나 curl 명령으로 쉽게 우회할 수 있습니다.
// フロントエンドでのサイズチェック例
const MAX_SIZE = 10 * 1024 * 1024; // 10 MiB
fileInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file.size > MAX_SIZE) {
alert('ファイルサイズが上限を超えています');
e.target.value = '';
}
});
에러 메시지 및 UX 확인
경계값 테스트에서는 요청이 성공/실패하는지만이 아니라 다음 사항도 확인하세요.
- 한계 초과 시 명확한 오류 메시지가 표시되는가
- HTTP 상태 코드가 적절한가 (예: 413 Payload Too Large)
- 대용량 파일 업로드 중에 진행률 표시줄이 올바르게 작동하는가?
- 타임아웃 처리가 올바르게 수행되는지 여부
테스트용 파일 입수 방법
정확한 경계값 테스트에는 바이트 단위로 정확한 크기의 테스트 파일이 필요합니다. DevLab은 주요 업로드 제한에 맞는 경계값 테스트 파일을 제공합니다.
- <a href="/ja/files/threshold/">경계값 테스트 파일 목록</a> — Gmail(25MB), Discord(25MB), WordPress(10MB) 등 주요 서비스 상한에 맞춘 파일
- <a href="/ja/files/threshold/10mb/">10MB 경계값 테스트 세트</a> — 정확히・직전・직후의 3개 파일 세트
- <a href="/ja/files/threshold/25mb/">25MB 경계값 테스트 세트</a> — 이메일 첨부 및 채팅 도구용
모든 파일에는 MD5, SHA-1, SHA-256 해시 값이 기재되어 있으므로 다운로드 후 무결성 확인에 활용하세요.
요약
파일 업로드 제한 테스트는 단순히 「큰 파일을 보내본다」는 것만으로는 부족합니다. MB와 MiB의 차이를 이해하고, multipart 오버헤드를 고려하며, 바이트 단위의 정확한 테스트 파일로 경계값을 검증해야 합니다. DevLab의 경계값 테스트용 파일을 활용하면 이러한 테스트를 효율적으로 실시할 수 있습니다.
이 기사에서 사용할 수 있는 테스트 파일
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">임계값 테스트 파일 목록 (9.9MB / 10MB / 10.1MB)</a>
- → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG 이미지 테스트 파일 목록</a>
관련 기사
- → <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">MB와 MiB는 다르다! 파일 크기 단위의 함정</a>
- → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">multipart/form-data의 오버헤드를 정확하게 계산하기</a>
- → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">웹 폼 파일 검증 구현 체크리스트</a>