콘텐츠로 건너뛰기

MB와 MiB는 다릅니다! 파일 크기 단위의 함정

카테고리: 기초 지식
이 기사는 현재 일본어로만 제공됩니다. 번역본은 순차적으로 공개될 예정입니다.

「파일 크기의 상한은 10MB입니다」라는 사양서를 보았을 때, 어떻게 해석하시겠습니까? 사실 「MB」와 「MiB」는 명확히 다른 단위이며, 이러한 혼동이 경계값 테스트 실패와 본 운영 장애의 원인이 될 수 있습니다. 이 기사에서는 파일 크기 단위의 정확한 정의와 개발 현장에서 자주 발생하는 함정을 설명합니다.

MB와 MiB의 정의

파일 크기를 나타내는 단위에는 SI 단위계(10진수 기반)와 IEC 단위계(2진수 기반) 2가지가 있습니다.

단위읽는 방법바이트 수표준
KB킬로바이트1,000 BSI(10진수)
KiB기비바이트1,024 BIEC (2진법)
MB메가바이트1,000,000 BSI(10진수)
MiB메비바이트1,048,576 BIEC (2진법)
GB기가바이트1,000,000,000 BSI(10진수)
GiB기비바이트1,073,741,824 BIEC (2진법)

1MB와 1MiB의 차이는 <strong>48,576바이트(약 4.86%)</strong>입니다. 10MB와 10MiB의 경우 차이가 약 485KB에 달합니다. 이러한 차이가 누적되면 경계값 테스트에서 「10MB 이하여야 하는 파일이 거부된다」는 상황이 발생합니다.

개발 도구·OS·클라우드에서의 취급 차이

문제를 복잡하게 하는 것은 각 도구와 OS가 이 단위를 독립적으로 해석하여 사용한다는 점입니다.

도구 / 환경「10MB」의 해석실제 바이트 수
PHP(php.ini)10MiB10,485,760 B
Nginx(client_max_body_size)10MiB10,485,760 B
Windows 탐색기MiB 표기법 ("MB"로 표기)1,048,576 B / MB
macOS FinderMB (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>