MIME 타입이란 무엇인가
MIME 타입은 미디어 타입이라고도 불리며, 파일이나 메시지 본문이 어떤 종류의 데이터를 담고 있는지 소프트웨어에 알려주는 짧은 레이블입니다. 이메일에서 탄생했으며(이름은 Multipurpose Internet Mail Extensions의 약자) 오늘날에는 웹 전반에서 사용됩니다. 형식은 항상 타입/서브타입입니다. 큰 범주, 슬래시, 그리고 특정 포맷 순서입니다. 따라서 text/html은 "텍스트, HTML 형식", image/png는 "이미지, PNG 형식", application/json은 "애플리케이션 데이터, JSON 인코딩"을 의미합니다.
최상위 타입은 IANA 공식 레지스트리가 관리하는 고정 집합에서 가져옵니다. text, image, audio, video, application, font, model, multipart, 그리고 haptics 같은 신규 타입이 있습니다. 서브타입은 구체적인 포맷입니다. 벤더는 vnd. 접두사로 자체 타입을 추가할 수 있으며(예: application/vnd.ms-excel), 실험적 타입은 역사적으로 x- 접두사를 사용했으나 이 관례는 이제 권장되지 않습니다.

MIME 타입이 중요한 곳
MIME 타입이 등장하는 가장 중요한 곳은 HTTP Content-Type 응답 헤더입니다. 서버가 페이지, 이미지 또는 API 페이로드를 전송할 때 이 헤더가 브라우저에게 바이트를 어떻게 해석해야 하는지 알려줍니다. 헤더에 text/html이 있으면 브라우저가 마크업을 렌더링하고, application/json이면 fetch() 호출로 파싱할 수 있으며, application/pdf이면 내장 뷰어가 열립니다. 요청 측에서도 동일한 헤더가 사용됩니다. 폼이나 API 본문을 POST할 때 Content-Type이 서버에게 전송된 내용을 읽는 방법을 알려줍니다.
HTTP 이외에도 MIME 타입은 여러 시스템을 구동합니다. 이메일 클라이언트는 첨부 파일이 미리 볼 이미지인지 저장할 바이너리인지 판단하는 데 사용합니다. 파일 업로드 핸들러는 선언된 타입을 검사해 파일을 수락하거나 거부합니다. 운영 체제나 브라우저는 파일 확장자가 아닌 타입을 사용해 기본 애플리케이션을 선택합니다. 서버가 HTTP 상태 코드와 함께 결과와 오류를 보고하는 방식도 같은 개념입니다. 타입이 잘못된 200 응답은 404만큼이나 문제가 될 수 있습니다.
매일 사용하게 될 타입
실제 트래픽의 대부분을 차지하는 몇 가지 타입이 있습니다.
text/html— 웹 페이지(확장자.html)text/css— 스타일시트(.css)text/javascript— JavaScript의 공식 권장 타입(.js,.mjs)application/json— RFC 8259에서 정의한 유일한 공식 JSON 타입(.json)image/png,image/jpeg,image/webp,image/svg+xml— 일반적인 이미지 포맷application/pdf— PDF 문서(.pdf)application/octet-stream— 알 수 없거나 임의의 바이너리 데이터에 대한 범용 타입text/plain— 더 구체적인 타입이 없는 일반 텍스트의 기본값
JSON은 자주 혼동을 일으키므로 별도로 설명할 필요가 있습니다. 올바른 타입은 오직 application/json입니다. 오래된 코드에서는 text/json, text/plain, application/x-javascript를 사용하기도 했지만 이는 구식이며 일부 클라이언트는 이를 파싱하지 않습니다. JSON에는 charset 파라미터도 필요 없습니다. 스펙이 UTF-8을 강제하므로 application/json; charset=utf-8이라고 써도 해가 없지만 불필요합니다. 포맷과 확장자의 더 자세한 표는 참조 표를 확인하세요.

잘못된 Content-Type이 문제를 일으키는 이유
브라우저와 클라이언트는 선언된 타입을 신뢰하므로 잘못 설정하면 실질적인 결과가 발생합니다. JSON API 응답을 text/html로 제공하면 브라우저가 렌더링하려 하거나, 엄격한 클라이언트가 코드가 실행되기 전에 파싱 오류를 던질 수 있습니다. CSS나 JavaScript 파일을 잘못된 타입으로 제공하면 X-Content-Type-Options: nosniff라는 보안 기능이 브라우저로 하여금 적용을 거부하게 만들어, 페이지 스타일이나 스크립트가 조용히 작동을 멈춥니다.
다운로드도 또 다른 전형적인 실패 사례입니다. 파일을 표시하는 대신 다운로드하도록 하려면 Content-Disposition 헤더와 함께 타입도 중요합니다. PDF를 application/octet-stream으로 전송하면 뷰어에서 열리는 대신 일반 파일로 다운로드되고, 이미지를 text/plain으로 전송하면 깨진 문자들로 표시됩니다. 업로드 측에서는 잘못 레이블된 파일이 단순한 확장자 검사를 통과할 수 있으므로, 견고한 유효성 검사기는 클라이언트가 제공한 타입을 신뢰하지 않고 실제 바이트("매직 넘버")를 검사합니다.
역사적으로 브라우저는 헤더가 잘못 보일 때 실제 타입을 추측하거나 "스니핑"하려 했습니다. 이 동작이 보안 취약점을 야기했으므로, 현대적 모범 사례는 항상 정확한 Content-Type을 전송하고 nosniff로 스니핑을 비활성화하는 것입니다. 요약하면, 모든 응답에 타입을 의도적으로 설정하면 렌더링, 다운로드, 파싱 관련 버그 대부분이 사라집니다.
자주 묻는 질문
MIME 타입과 미디어 타입의 차이는 무엇인가요?
같은 것입니다. "MIME 타입"은 이메일에서 유래한 오래된 이름이고, "미디어 타입"은 IANA와 현대 HTTP 명세가 선호하는 용어입니다. 둘 다 타입/서브타입 레이블을 가리킵니다.
JSON의 올바른 MIME 타입은 무엇인가요?
RFC 8259에서 정의한 application/json입니다. text/json이나 application/x-javascript 같은 구식 대안은 일부 클라이언트에서 거부될 수 있습니다.
application/octet-stream은 무슨 의미인가요?
더 구체적인 레이블이 없는 임의 바이너리 데이터에 대한 범용 타입입니다. 서버는 알 수 없는 파일 타입의 대체값으로 사용하며, 이는 보통 브라우저 내 표시 대신 다운로드를 유발합니다.
CSS나 JavaScript 파일이 로드되지 않는 이유는 무엇인가요?
서버가 잘못된 Content-Type으로 전송하는 경우가 많습니다. X-Content-Type-Options가 nosniff로 설정된 경우 브라우저는 text/css가 아닌 CSS나 JavaScript 타입이 아닌 스크립트를 적용하지 않습니다. 올바른 타입이 전송되도록 서버 설정을 수정하세요.
MIME 타입에 charset을 추가할 수 있나요?
네, text/html; charset=utf-8처럼 텍스트 포맷에는 파라미터를 추가할 수 있습니다. JSON은 스펙상 항상 UTF-8이므로 불필요하지만 추가해도 해가 없습니다.
파일 확장자가 MIME 타입을 결정하나요?
HTTP에서는 그렇지 않습니다. 서버가 전송할 Content-Type을 결정하고 브라우저는 그 헤더를 신뢰합니다. 확장자는 명시적 타입이 없을 때 도구와 운영 체제에 대한 힌트 역할만 합니다.
