MIME / Content-Type
MIME (Multipurpose Internet Mail Extensions) — стандарт кодирования типа и содержимого файлов. Изначально для email (RFC 2045-2049, 1996), потом внедрили в HTTP как заголовок Content-Type. Именно MIME говорит браузеру: «этот массив байтов — картинка JPEG», «это HTML», «это JSON».
Формат MIME-типа
type/subtype; parameter1=value1; parameter2=value2
text/html; charset=utf-8
image/png
application/json
multipart/form-data; boundary=------abc123
Основные типы (5 top-level + composite)
| Тип | Что | Примеры |
|---|---|---|
| text | Читаемый текст | text/html, text/plain, text/css, text/csv, text/javascript |
| image | Изображения | image/jpeg, image/png, image/gif, image/webp, image/avif, image/svg+xml |
| audio | Аудио | audio/mpeg, audio/ogg, audio/wav, audio/webm, audio/flac |
| video | Видео | video/mp4, video/webm, video/quicktime, video/x-matroska |
| application | Всё остальное — двоичка, форматы приложений | application/json, application/pdf, application/octet-stream |
| font | Шрифты (RFC 8081) | font/woff, font/woff2, font/ttf, font/otf |
| model | 3D-модели | model/gltf+json, model/obj |
| multipart | Composite: несколько частей | multipart/form-data, multipart/mixed, multipart/alternative |
| message | Composite: обёртка сообщения | message/rfc822, message/http |
application/* — важные
| Тип | Что |
|---|---|
| application/json | JSON |
| application/xml | XML |
| application/pdf | |
| application/zip | ZIP-архив |
| application/gzip | gzip |
| application/x-tar | tar |
| application/octet-stream | «Просто байты», универсальный fallback |
| application/x-www-form-urlencoded | Форма (key=value&key2=value2) |
| application/wasm | WebAssembly |
| application/manifest+json | PWA manifest |
| application/ld+json | JSON-LD (Linked Data) |
| application/vnd.ms-excel | xls |
| application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | xlsx (длиннющий) |
Параметры
- charset — кодировка текста.
text/html; charset=utf-8. - boundary — разделитель частей в multipart.
- q — quality factor в Accept:
Accept: text/html;q=0.9, application/json;q=0.1. - profile — подтип у некоторых форматов.
multipart/form-data
Формат отправки HTML-формы с файлами:
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----abc123
------abc123
Content-Disposition: form-data; name="username"
alice
------abc123
Content-Disposition: form-data; name="avatar"; filename="pic.png"
Content-Type: image/png
<binary data>
------abc123--
Определение MIME
- По расширению файла (обычно на сервере). База:
/etc/mime.types,/usr/share/mime/. - Magic-bytes (по содержимому). Утилиты
file,libmagic. PNG начинается с89 50 4E 47, JPEG сFF D8 FF. - Guess из имени (Python
mimetypes.guess_type, Nodemime).
MIME sniffing
Браузер иногда не доверяет заголовку Content-Type и пытается определить тип сам. Причина: раньше серверы отправляли всё как text/plain, а браузер должен был показать HTML/картинку.
Проблема: если сервер отдаёт user-generated контент как text/plain, но там внутри HTML со скриптом — MIME sniffing может превратить это в text/html и выполнить скрипт. XSS.
Защита: заголовок X-Content-Type-Options: nosniff — «не гадай, доверяй только моему Content-Type».
Vendor-специфичные (vnd)
Префикс vnd. — vendor-specific. Заявленный в IANA тип для конкретного продукта:
application/vnd.google-apps.documentapplication/vnd.apple.pkpass(Apple Wallet)application/vnd.microsoft.icon(.ico)
Experimental (x-)
Префикс x- — исторически «неофициальный». Deprecated по RFC 6648, но всё ещё встречается:
application/x-www-form-urlencoded— прижилось так, не переименовалиtext/x-markdown— до IANA-регистрацииtext/markdown
Content-Disposition
Отдельный заголовок — говорит браузеру: «показать» или «скачать»:
Content-Disposition: inline # показать в браузере
Content-Disposition: attachment # скачать
Content-Disposition: attachment; filename="doc.pdf" # с именем файла