MB와 MiB는 다릅니다! 파일 크기 단위의 함정
「파일 크기의 상한은 10MB입니다」라는 사양서를 보았을 때, 어떻게 해석하시겠습니까? 사실 「MB」와 「MiB」는 명확히 다른 단위이며, 이러한 혼동이 경계값 테스트 실패와 본 운영 장애의 원인이 될 수 있습니다. 이 기사에서는 파일 크기 단위의 정확한 정의와 개발 현장에서 자주 발생하는 함정을 설명합니다.
MB와 MiB의 정의
파일 크기를 나타내는 단위에는 SI 단위계(10진수 기반)와 IEC 단위계(2진수 기반) 2가지가 있습니다.
| 단위 | 읽는 방법 | 바이트 수 | 표준 |
|---|---|---|---|
| KB | 킬로바이트 | 1,000 B | SI(10진수) |
| KiB | 기비바이트 | 1,024 B | IEC (2진법) |
| MB | 메가바이트 | 1,000,000 B | SI(10진수) |
| MiB | 메비바이트 | 1,048,576 B | IEC (2진법) |
| GB | 기가바이트 | 1,000,000,000 B | SI(10진수) |
| GiB | 기비바이트 | 1,073,741,824 B | IEC (2진법) |
1MB와 1MiB의 차이는 <strong>48,576바이트(약 4.86%)</strong>입니다. 10MB와 10MiB의 경우 차이가 약 485KB에 달합니다. 이러한 차이가 누적되면 경계값 테스트에서 「10MB 이하여야 하는 파일이 거부된다」는 상황이 발생합니다.
개발 도구·OS·클라우드에서의 취급 차이
문제를 복잡하게 하는 것은 각 도구와 OS가 이 단위를 독립적으로 해석하여 사용한다는 점입니다.
| 도구 / 환경 | 「10MB」의 해석 | 실제 바이트 수 |
|---|---|---|
| PHP(php.ini) | 10MiB | 10,485,760 B |
| Nginx(client_max_body_size) | 10MiB | 10,485,760 B |
| Windows 탐색기 | MiB 표기법 ("MB"로 표기) | 1,048,576 B / MB |
| macOS Finder | MB (10진법) | 1,000,000 B / MB |
| AWS S3 관리 콘솔 | MiB 표시 | 1,048,576 B / MB |
| Gmail (첨부 상한선) | MB (10진법) | 25,000,000 B |
특히 주의해야 할 점은 Windows가 "MB"로 표시하지만 실제로는 "MiB"로 계산한다는 것입니다. Windows에서 "9.9 MB"로 표시된 파일은 실제로는 <code>9.9 × 1,048,576 = 10,381,301 바이트</code>일 수 있습니다. 이는 10MB(10,000,000바이트)보다 크며 Gmail(25MB 제한)에서는 문제가 되지 않지만, PHP의 <code>upload_max_filesize = 10M</code>(<code>=10MiB = 10,485,760바이트</code>)에서는 통과하지 못합니다.
PHP에서의 실제 예제
PHP 설정 파일에서 단위는 다음과 같이 해석됩니다.
; php.ini の設定
upload_max_filesize = 10M ; 10 MiB = 10,485,760 バイト
post_max_size = 12M ; 12 MiB = 12,582,912 バイト
업로드된 파일의 크기를 검증할 때는 바이트 단위로 비교하는 것이 가장 확실합니다.
// バイト単位で比較(安全)
$maxBytes = 10 * 1024 * 1024; // 10 MiB = 10,485,760 バイト
if ($_FILES['file']['size'] > $maxBytes) {
throw new \RuntimeException('ファイルサイズが上限を超えています');
}
// NG: 文字列の "10MB" を解析する場合は単位の解釈に注意
JavaScript의 실제 예
// File API では size プロパティがバイト数を返す
const file = event.target.files[0];
const MAX_SIZE_MIB = 10 * 1024 * 1024; // 10 MiB
const MAX_SIZE_MB = 10 * 1000 * 1000; // 10 MB
// サーバー側に合わせて単位を統一する
if (file.size > MAX_SIZE_MIB) {
alert(`ファイルサイズ上限は 10 MiB (${MAX_SIZE_MIB.toLocaleString()} バイト) です`);
}
경계값 테스트에 미치는 영향
「10MB 제한」을 테스트할 때는 서버의 실제 제한값을 파악한 후 적절한 테스트 파일을 선택하는 것이 중요합니다.
- PHP <code>upload_max_filesize = 10M</code> → 상한은 <strong>10,485,760 바이트 (10 MiB)</strong>
- Gmail 첨부 상한선 → 상한선은 <strong>25,000,000 바이트 (25 MB)</strong>입니다.
- Discord의 무료 플랜 → 상한은 <strong>25,000,000 바이트(25 MB)</strong>
DevLab의 <a href="/ja/files/threshold/">임계값 테스트 파일</a>은 바이트 단위로 정확한 크기의 파일을 제공합니다. 테스트 전에 서버 설정을 확인하고 해당하는 임계값 파일을 선택하세요.
요약
- <strong>MB = 1,000,000바이트</strong>(SI 단위), <strong>MiB = 1,048,576바이트</strong>(IEC 단위)
- PHP와 Nginx는 "M"을 <strong>MiB</strong>로 해석합니다.
- Windows는 「MB」로 표시하면서 <strong>MiB</strong>로 계산합니다
- macOS는 <strong>MB</strong>(10진수)로 표시합니다
- 테스트용 파일은 바이트 단위로 정확한 것을 사용하고, 서버 설정의 해석에 맞게 선택합니다
→ <a href="/ja/reference/file-size-units/">파일 크기 단위 변환표는 여기</a>
이 기사에서 사용할 수 있는 테스트 파일
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">임계값 테스트 파일 목록 (9.9MB / 10MB / 10.1MB)</a>
관련 기사
- → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">파일 업로드 제한을 올바르게 테스트하는 방법</a>
- → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">multipart/form-data의 오버헤드를 정확하게 계산하기</a>