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의 차이는 48,576바이트(약 4.86%)입니다. 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"로 표시된 파일은 실제로는 9.9 × 1,048,576 = 10,381,301 바이트일 수 있습니다. 이는 10MB(10,000,000바이트)보다 크며 Gmail(25MB 제한)에서는 문제가 되지 않지만, PHP의 upload_max_filesize = 10M(=10MiB = 10,485,760바이트)에서는 통과하지 못합니다.
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
upload_max_filesize = 10M→ 상한은 10,485,760 바이트 (10 MiB) - Gmail 첨부 상한선 → 상한선은 25,000,000 바이트 (25 MB)입니다.
- Discord의 무료 플랜 → 상한은 25,000,000 바이트(25 MB)
DevLab의 임계값 테스트 파일은 바이트 단위로 정확한 크기의 파일을 제공합니다. 테스트 전에 서버 설정을 확인하고 해당하는 임계값 파일을 선택하세요.
요약
- MB = 1,000,000바이트(SI 단위), MiB = 1,048,576바이트(IEC 단위)
- PHP와 Nginx는 "M"을 MiB로 해석합니다.
- Windows는 「MB」로 표시하면서 MiB로 계산합니다
- macOS는 MB(10진수)로 표시합니다
- 테스트용 파일은 바이트 단위로 정확한 것을 사용하고, 서버 설정의 해석에 맞게 선택합니다