MIME タイプ
ファイルやデータの種類を識別するための標準的な分類方式。type/subtype の形式で表現される。
MIME タイプ (Multipurpose Internet Mail Extensions) は、インターネット上でファイルやデータの種類を識別するための標準的な分類方式です。text/html、application/json、image/png のように type/subtype の形式で表現されます。もともとは電子メールで非テキストデータを送信するために策定された規格ですが、現在では HTTP 通信をはじめとするインターネットプロトコル全般で使用されています。なお IANA の登録簿や RFC では「メディアタイプ」と呼ばれ、HTML 仕様や Web 開発の現場では「MIME タイプ」と呼ばれます。指しているものは同じで、資料を横断して調べるときはどちらの語でも当たっておくと取りこぼしが減ります。
HTTP 通信では Content-Type ヘッダーに MIME タイプを指定することで、ブラウザやクライアントがデータの処理方法を判断します。たとえば Content-Type: text/html; charset=utf-8 と指定すれば、ブラウザはレスポンスを UTF-8 エンコーディングの HTML として解釈します。誤った MIME タイプを指定すると、CSS が適用されない (text/css の代わりに text/plain を返す)、JavaScript が実行されないなどの問題が発生します。
主要な MIME タイプのカテゴリには、テキスト系 (text/plain、text/html、text/css)、アプリケーション系 (application/json、application/pdf、application/xml)、画像系 (image/png、image/jpeg、image/webp)、音声系 (audio/mpeg)、動画系 (video/mp4) があります。テキスト系の MIME タイプでは charset パラメータで文字エンコーディングを指定でき、text/html; charset=utf-8 のように記述します。
ただし charset はどの MIME タイプにも付けられる汎用パラメータではありません。application/json の登録では任意パラメータが「n/a」とされており charset パラメータそのものが定義されていないため (RFC 8259)、application/json; charset=utf-8 と書いても仕様に従う受信側の挙動は変わりません。JSON は UTF-8 で送ることが前提になっているためです。JavaScript のメディアタイプも整理が進み、RFC 9239 (2022 年) で text/javascript が唯一の推奨とされ、application/javascript や text/ecmascript などは廃止扱い (OBSOLETE) になりました。どちらを返しても現行ブラウザはスクリプトを実行しますが、新規に設定を書くなら text/javascript を選ぶのが素直です。
Web 開発の実務では、MIME タイプの設定ミスがセキュリティ上の問題を引き起こすことがあります。ブラウザの MIME スニッフィング (Content-Type を無視してデータの中身から型を推測する挙動) を悪用した攻撃を防ぐため、X-Content-Type-Options: nosniff ヘッダーの設定が推奨されています。また、ファイルアップロード機能では、クライアントが送信する MIME タイプを信頼せず、サーバー側でファイルの実際の内容を検証することが重要です。
よくある誤解として、ファイルの拡張子と MIME タイプを同一視するケースがあります。拡張子はファイルシステム上の慣習にすぎず、HTTP のやり取りにそのまま乗るわけではありません。受け取り側が判断材料にするのは、サーバーが Content-Type ヘッダーで宣言した MIME タイプです。ただし多くの Web サーバーは拡張子と MIME タイプの対応表を内部に持っているため、拡張子を変えれば宣言される MIME タイプも連動して変わります。たとえば app.js を app.txt にリネームすると、中身は JavaScript のままでも text/plain として配信され、X-Content-Type-Options: nosniff が有効な環境では script 要素からの読み込みがブロックされます。整理すると、拡張子・サーバーの宣言・ファイルの実際の中身は互いに独立して食い違い得る 3 つの情報です。原因の切り分けでは、まずブラウザの開発者ツールで実際に返っている Content-Type を確認し、そこからサーバーの対応表を追うのが確実です。
文字数カウントの観点では、MIME タイプは API 設計やデータ交換において、テキストデータの文字エンコーディングを決定する重要な役割を果たします。charset=utf-8 と charset=shift_jis では同じ日本語テキストでもバイト数が異なるため、Content-Length ヘッダーの値に影響します。API レスポンスの文字数を正確に把握するには、MIME タイプで指定されたエンコーディングを考慮する必要があります。