MIME タイプ
ファイルやデータの種類を識別するための標準的な分類方式。type/subtype の形式で表現される。
MIME タイプ (Multipurpose Internet Mail Extensions) は、インターネット上でファイルやデータの種類を識別するための標準的な分類方式です。text/html、application/json、image/png のように type/subtype の形式で表現されます。もともとは電子メールで非テキストデータを送信するために策定された規格ですが、現在では HTTP 通信をはじめとするインターネットプロトコル全般で使用されています。
HTTP 通信では Content-Type ヘッダーに MIME タイプを指定することで、ブラウザやクライアントがデータの処理方法を判断します。たとえば Content-Type: text/html; charset=utf-8 と指定すれば、ブラウザはレスポンスを UTF-8 エンコーディングの HTML として解釈します。誤った MIME タイプを指定すると、CSS が適用されない (text/css の代わりに text/plain を返す)、JavaScript が実行されないなどの問題が発生します。HTTP プロトコル解説の書籍で詳しく学べます。
主要な 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 のように記述します。
Web 開発の実務では、MIME タイプの設定ミスがセキュリティ上の問題を引き起こすことがあります。ブラウザの MIME スニッフィング (Content-Type を無視してデータの中身から型を推測する挙動) を悪用した攻撃を防ぐため、X-Content-Type-Options: nosniff ヘッダーの設定が推奨されています。また、ファイルアップロード機能では、クライアントが送信する MIME タイプを信頼せず、サーバー側でファイルの実際の内容を検証することが重要です。
よくある誤解として、ファイルの拡張子と MIME タイプを同一視するケースがあります。拡張子はファイルシステム上の慣習にすぎず、MIME タイプはプロトコルレベルでデータの種類を宣言するものです。.json ファイルの MIME タイプは application/json ですが、拡張子を変更しても MIME タイプは変わりません。Web サーバーの設定で拡張子と MIME タイプのマッピングを正しく行う必要があります。
文字数カウントの観点では、MIME タイプは API 設計やデータ交換において、テキストデータの文字エンコーディングを決定する重要な役割を果たします。charset=utf-8 と charset=shift_jis では同じ日本語テキストでもバイト数が異なるため、Content-Length ヘッダーの値に影響します。API レスポンスの文字数を正確に把握するには、MIME タイプで指定されたエンコーディングを考慮する必要があります。Web 技術基礎の書籍も参考になります。