콘텐츠로 건너뛰기

MIME 타입 목록

파일 종류를 나타내는 MIME 타입(미디어 타입) 일람표입니다. 웹 서버 설정, Content-Type 헤더 지정, 파일 업로드 검증 등의 개발 작업에 활용하세요.

MIME 타입이란

MIME(Multipurpose Internet Mail Extensions) 타입은 파일의 형식과 성질을 식별하기 위한 표준 방식입니다. 타입/서브타입 형식으로 표기되며, 웹 브라우저와 서버가 파일 처리 방법을 판단하는 데 사용됩니다. HTTP 응답의 Content-Type 헤더나 HTML의 <input type="file" accept="..."> 속성 등에서 지정합니다.

type/subtype text/* image/* audio/* video/* application/* text/plain text/html text/css text/csv image/jpeg image/png image/webp image/svg+xml audio/mpeg audio/wav audio/ogg video/mp4 video/webm video/quicktime application/pdf application/json application/zip application/octet-stream
그림: MIME 타입 계층 구조 (top-level type → subtype)

이미지(image)

확장자 MIME 타입 설명
.jpg / .jpegimage/jpegJPEG 이미지. 사진에 최적인 손실 압축 형식
.pngimage/pngPNG 이미지. 투명도를 지원하는 무손실 압축 형식
.gifimage/gifGIF 이미지. 애니메이션 지원, 256색까지
.webpimage/webpWebP 이미지. Google이 개발한 고압축 형식
.avifimage/avifAVIF 이미지. AV1 기반의 차세대 형식
.svgimage/svg+xmlSVG 벡터 이미지. XML 기반
.icoimage/x-icon아이콘 파일. favicon 등에 사용
.bmpimage/bmp비트맵 이미지. 무압축
.tiff / .tifimage/tiffTIFF 이미지. 인쇄·DTP에서 사용

문서(application)

확장자 MIME 타입 설명
.pdfapplication/pdfPDF 문서
.docapplication/mswordMicrosoft Word(구형식)
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentMicrosoft Word(OOXML 형식)
.xlsapplication/vnd.ms-excelMicrosoft Excel(구형식)
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetMicrosoft Excel(OOXML 형식)
.pptapplication/vnd.ms-powerpointMicrosoft PowerPoint(구형식)
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentationMicrosoft PowerPoint(OOXML 형식)

텍스트(text)

확장자 MIME 타입 설명
.txttext/plain일반 텍스트
.html / .htmtext/htmlHTML 문서
.csstext/cssCSS 스타일시트
.csvtext/csv쉼표로 구분된 텍스트
.xmltext/xmlXML 문서
.jstext/javascriptJavaScript(application/javascript도 유효)
.jsonapplication/jsonJSON 데이터
.mdtext/markdownMarkdown 텍스트

음성(audio)

확장자 MIME 타입 설명
.mp3audio/mpegMP3 음성. 가장 널리 쓰이는 오디오 형식
.wavaudio/wavWAV 음성. 무압축 PCM
.oggaudio/oggOgg Vorbis 음성
.flacaudio/flacFLAC 음성. 무손실 압축
.aacaudio/aacAAC 음성. MP3의 후속
.webmaudio/webmWebM 음성
.m4aaudio/mp4MPEG-4 음성

동영상(video)

확장자 MIME 타입 설명
.mp4video/mp4MP4 동영상. 가장 널리 쓰이는 동영상 형식
.webmvideo/webmWebM 동영상. 웹을 위한 오픈 형식
.avivideo/x-msvideoAVI 동영상
.movvideo/quicktimeQuickTime 동영상
.mkvvideo/x-matroskaMatroska 동영상 컨테이너
.mpegvideo/mpegMPEG 동영상

아카이브·압축(application)

확장자 MIME 타입 설명
.zipapplication/zipZIP 압축 아카이브
.gz / .gzipapplication/gzipGzip 압축 파일
.tarapplication/x-tartar 아카이브
.tar.gzapplication/gziptar+gzip 압축 아카이브
.rarapplication/vnd.rarRAR 압축 아카이브
.7zapplication/x-7z-compressed7-Zip 압축 아카이브
.bz2application/x-bzip2Bzip2 압축 파일

폰트(font)

확장자 MIME 타입 설명
.wofffont/woffWeb Open Font Format
.woff2font/woff2WOFF2. 압축률 향상
.ttffont/ttfTrueType 폰트
.otffont/otfOpenType 폰트

기타

확장자 MIME 타입 설명
(불명)application/octet-stream바이너리 데이터(범용). 알 수 없는 형식의 기본값
.wasmapplication/wasmWebAssembly 바이너리

개발에서의 MIME 타입 사용법

서버 측 설정

웹 서버(Apache / Nginx)에서는 파일 확장자와 MIME 타입의 대응을 설정합니다. 올바르게 설정하지 않으면 브라우저가 파일을 제대로 처리하지 못할 수 있습니다. 예를 들어 .webp 파일에 올바른 MIME 타입이 설정되어 있지 않으면 이미지로 표시되지 않고 다운로드되어 버립니다.

파일 업로드 검증

파일 업로드 기능을 구현할 때는 확장자뿐 아니라 MIME 타입도 검증하는 것이 중요합니다. 다만 MIME 타입은 클라이언트 측에서 위장할 수 있으므로, 보안상 파일 앞부분의 매직 바이트 검증도 함께 사용할 것을 권장합니다.

Content-Type 헤더

API 응답이나 파일 다운로드 시에는 적절한 Content-Type 헤더를 설정하세요. JSON 데이터에는 application/json, CSV 파일에는 text/csv를 지정합니다. 문자 인코딩 지정이 필요한 경우에는 text/html; charset=utf-8처럼 charset 파라미터를 붙입니다.

서버 설정에서의 MIME 타입 지정

WebP / AVIF / WASM / 폰트 등 서버의 기본 매핑에 포함되지 않은 경우가 많은 현대적 포맷을 배포할 때 자주 쓰는 스니펫을 아래에 정리했습니다.

Apache .htaccess

# 최신 이미지 포맷
AddType image/webp .webp
AddType image/avif .avif
AddType image/svg+xml .svg .svgz

# 폰트(적극적으로 캐시)
AddType font/woff  .woff
AddType font/woff2 .woff2

# WebAssembly 와 최신 JSON 변형
AddType application/wasm        .wasm
AddType application/manifest+json .webmanifest
AddType application/ld+json     .jsonld

# 텍스트 계열을 UTF-8 로 제공
AddCharset utf-8 .html .css .js .json .xml

Nginx (mime.types 덮어쓰기)

types {
    image/webp                webp;
    image/avif                avif;
    application/wasm          wasm;
    application/manifest+json webmanifest;
}

# text/* 와 application/json 에 문자 코드 강제
charset utf-8;
charset_types text/css text/plain text/xml application/javascript application/json application/xml;

PHP — Content-Type 전송

// 파일명을 붙여 PDF 를 다운로드시킨다
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="invoice.pdf"');
readfile($path);

// JSON API 응답 (charset 은 항상 명시)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);

Node.js / Express

// Express 는 res.type() 이나 확장자로 Content-Type 을 추측한다
app.get('/data.json', (req, res) => {
    res.type('application/json').send({ ok: true });
});

// 명시적인 MIME 지정으로 파일 스트리밍
app.get('/report.csv', (req, res) => {
    res.set('Content-Type', 'text/csv; charset=utf-8');
    fs.createReadStream('report.csv').pipe(res);
});

Python — Flask / FastAPI

# Flask
from flask import Response
return Response(csv_text, mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename="data.csv"'})

# FastAPI
from fastapi.responses import Response
return Response(content=json_str, media_type='application/json')

Go — net/http

w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff")  // 보안: 아래 참조
json.NewEncoder(w).Encode(data)

보안: X-Content-Type-Options: nosniff가 필요한 이유

브라우저는 역사적으로 Content-Type 헤더가 누락되거나 잘못 지정되었을 때 파일 내용을 '스니핑'하여 종류를 추측해 왔습니다. 이는 알려진 공격 벡터로, image/jpeg로 업로드된 파일의 내용이 실제로는 <script>를 포함한 HTML이라면 브라우저가 HTML로 스니핑하여 XSS가 발생할 수 있습니다.

모든 응답에 X-Content-Type-Options: nosniff를 반드시 전송하세요. '서버가 지정한 Content-Type을 믿고 추측하지 말라'고 브라우저에 알리는 헤더입니다. 사용자 업로드 파일이나 JSON API에서는 특히 필수입니다(악의적인 요청으로 JSON을 HTML이나 JS로 해석시키려는 공격이 있습니다).

업로드 검증 — 3계층 규칙

  1. 확장자 검사 — 빠르지만 파일 이름만 바꾸면 뚫립니다. UX 힌트 정도로만 사용하세요.
  2. 클라이언트가 보내는 MIME 타입(multipart 경계 내의 Content-Type) — 마찬가지로 위장이 쉽습니다. 브라우저는 파일 확장자로부터 결정할 뿐입니다.
  3. 매직 바이트(파일 서명) 검출 — 실제 파일 선두 바이트를 읽어 알려진 시그니처(JPEG는 FF D8 FF, PNG는 89 50 4E 47)와 대조합니다. 신뢰할 수 있는 계층은 이것뿐입니다. 자세한 내용은 매직 바이트 레퍼런스를 참고하세요.

실무 철칙: 세 가지를 모두 실시한다. 앞의 두 가지는 명백한 쓰레기를 걸러내는 빠른 필터로, 세 번째를 권위 있는 최종 검사로 취급하세요.

자주 묻는 질문

application/jsontext/json의 차이는?

application/jsonRFC 8259에 정의된 IANA 등록 정식 MIME 타입입니다. text/json은 초기에 일부 서버에서 쓰이던 비공식 표기로, 등록되지 않았으므로 사용을 피해야 합니다. JSON은 사양상 UTF-8로 인코딩되므로 charset 파라미터는 기술적으로는 불필요하지만 명시해도 무해합니다.

.webp.avif가 브라우저에 표시되지 않고 다운로드되어 버립니다

서버에 해당 확장자의 매핑이 없어 application/octet-stream으로 폴백하는 것이 원인입니다. 브라우저는 '알 수 없는 바이너리이므로 다운로드한다'고 판단합니다. image/webp / image/avif 매핑을 Apache / Nginx 설정에 추가하세요(위 스니펫 참조).

브라우저가 보내는 MIME 타입을 업로드 검증에서 신뢰할 수 있나요?

아니요. 브라우저는 선택 시점의 파일 확장자로부터 MIME을 결정할 뿐이므로, malware.execute-cat.jpg로 이름만 바꾸면 브라우저는 순순히 image/jpeg라고 표시합니다. 확장자 + 클라이언트 MIME + 매직 바이트 검출의 3계층을 반드시 조합하세요.

서버가 인식하지 못하는 파일에는 어떤 MIME을 쓰면 되나요?

application/octet-stream입니다. '임의의 바이너리 데이터'로 명시적으로 정의되어 있는 안전한 기본값입니다. 브라우저는 렌더링을 시도하지 않고 다운로드를 제시하므로 오실행을 막을 수 있습니다.

application/x-www-form-urlencodedx- 접두사는 무엇인가요?

역사적으로 x-는 '실험적 / 비표준'을 나타내는 관례였습니다. RFC 6648(2012)에서 폐지되었지만, application/x-www-form-urlencoded / image/x-icon / application/x-tar 등 널리 보급된 타입은 하위 호환을 위해 접두사가 남아 있습니다.

이미지나 PDF 같은 바이너리 계열에도 charset을 붙여야 하나요?

필요 없습니다. charset은 텍스트 계열(text/*, application/json, application/xml)에만 의미가 있습니다. image/jpegapplication/pdf에 붙여도 무의미하며, 일부 중계(CDN, 프록시)에서 제거되는 경우도 있습니다.