Content-Type dalam pengembangan web: apa itu, tipe MIME dan cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-03-10 Waktu membaca: 9 mnt

Content-Type — adalah header HTTP yang menunjukkan dalam format apa data dikirim antara klien dan server. Tanpa tipe MIME yang benar, browser tidak dapat memproses respons dengan benar: file teks ditampilkan sebagai kode mentah, dan gambar tidak terbuka. Menurut MDN Web Docs, 2025, Content-Type wajib untuk pengiriman data jenis apa pun yang benar dalam protokol HTTP dan menentukan bagaimana penerima menginterpretasikan body pesan.

Penting

  • Content-Type — header HTTP yang menentukan tipe MIME data yang dikirim dalam body permintaan atau respons.
  • Tipe MIME terdiri dari kategori utama dan subtipe, dipisahkan oleh garis miring — misalnya, text/html atau application/json.
  • Parameter charset menunjukkan pengkodean untuk tipe MIME teks, standar untuk web adalah UTF-8.
  • Tanpa Content-Type browser mengaktifkan MIME sniffing, yang menyebabkan kesalahan tampilan dan kerentanan keamanan.
  • Header X-Content-Type-Options: nosniff menonaktifkan penebakan tipe dan meningkatkan keamanan aplikasi web.

Apa itu Content-Type?

Content-Type — adalah header HTTP dari grup representation headers yang memberi tahu penerima tentang format data dalam body pesan. Ini wajib untuk permintaan dan respons HTTP yang berisi body, dan tanpanya klien tidak dapat menafsirkan byte yang diterima dengan benar. Browser atau aplikasi seluler memilih parser berdasarkan Content-Type: untuk text/html menjalankan mesin HTML, untuk image/png — decoder PNG, untuk application/json — parser JSON.

Nilai Content-Type adalah tipe MIME — pengidentifikasi format data yang terstandarisasi. Singkatan MIME adalah kepanjangan dari Multipurpose Internet Mail Extensions, karena standar ini awalnya dibuat untuk lampiran email. Namun standar ini menjadi dasar HTTP dan saat ini digunakan di mana-mana — dari pengiriman halaman web hingga pertukaran data di REST API. Setiap tipe MIME terdiri dari dua bagian: kategori utama dan subtipe yang lebih spesifik, dipisahkan oleh garis miring.

Parameter charset melengkapi Content-Type untuk format teks. Misalnya, Content-Type: text/html; charset=utf-8 berarti dokumen HTML dalam pengkodean UTF-8 sedang dikirim. Menurut IETF RFC 7231, bagian 3.1.1.5, header Content-Type wajib untuk pesan HTTP yang berisi body, dan ketiadaannya ditafsirkan sebagai application/octet-stream atau menyebabkan MIME sniffing.

Sejarah kemunculan tipe MIME di HTTP

Protokol HTTP/0.9, yang dirilis pada tahun 1991, hanya mengirimkan halaman HTML, sehingga tipe data ditentukan secara default. Dengan munculnya HTTP/1.0 dalam spesifikasi RFC 1945, pengembang menyadari perlunya mengirimkan gambar, stylesheet, dan skrip. Mereka mengadaptasi standar MIME dari protokol email, dan Content-Type menjadi bagian tak terpisahkan dari HTTP. Sejak saat itu, registri IANA telah berkembang hingga ratusan nilai — dari text/html yang familiar hingga image/avif modern dan application/manifest+json.

Peran Content-Type dalam keamanan

Content-Type memainkan peran penting dalam perlindungan terhadap serangan. Jika server mengirim file HTML dengan tipe MIME text/plain, browser tidak akan mengeksekusi JavaScript dan membangun DOM — ini mencegah serangan XSS. Header X-Content-Type-Options: nosniff, yang direkomendasikan oleh OWASP, sepenuhnya melarang browser menebak tipe MIME berdasarkan konten. Menurut PortSwigger Research, serangan menggunakan MIME sniffing sangat umum di Internet Explorer 6-9, di mana browser mengabaikan Content-Type dan menentukan tipe berdasarkan byte pertama file.

Struktur tipe MIME

Tipe MIME ditentukan dalam format type/subtype, di mana type adalah kategori umum data, dan subtype adalah format spesifik di dalamnya. Misalnya, dalam nilai image/png, kategori image menunjukkan gambar, dan subtipe png — format Portable Network Graphics. Hanya ada beberapa kategori: text, image, audio, video, application, multipart dan message. Keragaman lainnya disediakan oleh subtipe, yang jumlahnya ratusan.

Parameter tambahan dikirim melalui titik koma setelah subtipe. Parameter yang paling umum adalah charset untuk menunjukkan pengkodean. Content-Type: application/json; charset=utf-8 memberi tahu bahwa dokumen JSON dalam pengkodean UTF-8 sedang dikirim. Secara formal, charset untuk application/json berlebihan, karena JSON selalu dalam UTF-8 menurut spesifikasi RFC 8259, tetapi penentuan secara eksplisit meningkatkan kompatibilitas dengan klien HTTP lama.

KategoriContoh subtipeDeskripsi
texthtml, plain, css, javascript, csvFormat teks yang dapat dibaca manusia
imagejpeg, png, gif, webp, svg+xml, avifGambar raster dan vektor
audiompeg, ogg, wav, mp4, webmFormat audio untuk pemutaran streaming
videomp4, webm, ogg, x-msvideo, 3gppFormat video dan wadah multimedia
applicationjson, xml, pdf, zip, octet-stream, protobufData biner dan terstruktur
multipartform-data, mixed, alternative, byterangesDokumen gabungan dari beberapa bagian

Tipe MIME standar dan non-standar

Tipe MIME standar didaftarkan di registri IANA dan memiliki prefiks kategori utama. Tipe non-standar (vendor-specific) menggunakan prefiks x- atau format vnd.company.type — misalnya, application/vnd.google-earth.kml+xml untuk format KML dari Google. Browser mungkin tidak mengenali tipe non-standar, oleh karena itu untuk lampiran yang tidak dikenal digunakan application/octet-stream — aliran biner universal yang tidak coba ditampilkan oleh browser tetapi menawarkan unduhan sebagai file.

Parameter charset dalam praktik

Parameter charset sangat penting untuk tampilan teks yang benar. Tanpanya, browser dapat menafsirkan karakter secara salah, yang menyebabkan mojibake (karakter rusak). Standar untuk web adalah UTF-8, tetapi ISO-8859-1 (Latin-1) untuk bahasa Eropa Barat dan windows-1251 untuk aksara Sirilik di situs lama juga ditemukan. Rekomendasi W3C — selalu tentukan charset=utf-8 untuk text/html dan text/plain, dan untuk application/json charset tidak diperlukan.

Tipe utama Content-Type

Dalam praktiknya, pengembang web dan pengembang seluler bekerja dengan seperangkat tipe MIME yang terbatas. Pengetahuan tentang tipe-tipe ini diperlukan untuk konfigurasi server yang benar, penulisan klien HTTP, dan pemrosesan file statis. text/html — tipe utama untuk halaman web, yang secara default dikembalikan oleh server Apache dan Nginx untuk file HTML. application/xhtml+xml lebih jarang digunakan dan hanya untuk dokumen XHTML.

application/json telah menjadi standar untuk REST API. Server mengembalikan data JSON dengan tipe MIME ini, dan klien mengirimkannya dalam permintaan POST dan PUT. text/javascript (usang) dan application/javascript digunakan untuk file JavaScript. Menurut W3Techs Survey, 2025, JSON adalah format data dengan pertumbuhan tercepat di web, melampaui XML pada tahun 2018. Untuk layanan SOAP masih digunakan text/xml atau application/soap+xml.

Untuk gambar, tipe MIME ditentukan oleh format file: image/jpeg untuk JPEG, image/png untuk PNG, image/gif untuk GIF, image/webp untuk format modern WebP. image/svg+xml digunakan untuk grafik vektor dan mendukung gaya dan skrip yang disematkan. video/mp4, audio/mpeg dan application/pdf — tipe lain yang sering ditemui. Untuk font web digunakan font/woff2, font/woff dan font/ttf.

Content-Type saat mengunggah file

Saat mengirim file melalui formulir HTML, digunakan multipart/form-data — tipe MIME gabungan yang membagi permintaan menjadi beberapa bagian. Setiap bagian memiliki header Content-Type dan Content-Disposition sendiri, yang menunjukkan nama bidang dan nama asli file. Server menerima file dengan tipe MIME sebenarnya, yang ditentukan oleh browser, dan dapat memeriksanya di sisi backend. application/octet-stream diterapkan untuk file dengan tipe tidak dikenal — browser tidak mencoba menampilkan konten tetapi menawarkan untuk menyimpannya ke disk.

Pengaruh Content-Type pada caching

Tipe MIME mempengaruhi kebijakan caching CDN dan browser. Gambar dengan URL stabil biasanya di-cache untuk waktu yang lama (satu tahun atau lebih), sementara halaman HTML — untuk menit atau detik. Server CDN Cloudflare dan Akamai menggunakan Content-Type untuk memilih algoritma kompresi: text/* dikompresi dengan gzip atau brotli, image/* — tidak, karena gambar sudah dikompresi. Konfigurasi Content-Type yang benar di server secara langsung mempengaruhi kinerja pemuatan halaman dan aplikasi seluler.

Bagaimana server dan klien menggunakan Content-Type

Server mengatur header Content-Type dalam respons HTTP berdasarkan jenis file yang diminta atau konten yang dihasilkan secara dinamis. Server web populer Nginx dan Apache memiliki tabel tipe MIME bawaan yang menghubungkan ekstensi file dengan Content-Type yang sesuai. Misalnya, file index.html mendapat text/html, dan style.css — text/css. Untuk respons dinamis, pengembang mengatur Content-Type dalam kode aplikasi di PHP, Python, Java atau Kotlin.

Klien menggunakan Content-Type untuk memilih penangan. Jika server mengembalikan text/html, browser menjalankan parser HTML dan membangun pohon DOM. Jika image/png — menjalankan decoder PNG. Jika Content-Type tidak ada atau salah, klien menerapkan MIME sniffing — mencoba menebak tipe berdasarkan tanda tangan (magic bytes) di awal file. JPEG dimulai dengan byte FF D8 FF, PNG — dengan 89 50 4E 47, dan PDF — dengan 25 50 44 46. Proses ini berpotensi berbahaya dan dinonaktifkan oleh header X-Content-Type-Options: nosniff.

Dalam aplikasi seluler, Content-Type diproses oleh klien HTTP. OkHttp di Android secara otomatis mem-parsing header Content-Type dari respons dan menyediakannya melalui metode Response.header("Content-Type"). Klien iOS URLSession melakukan hal yang sama melalui properti URLResponse.mimeType. Di kedua platform, Content-Type digunakan untuk memilih parser: JSON — melalui Moshi atau Gson di Android, melalui Codable di iOS; gambar — melalui Glide, Coil atau SDWebImage.

Content Negotiation melalui Accept dan Content-Type

Content negotiation (negosiasi konten) — mekanisme HTTP di mana klien menunjukkan format respons yang diinginkan melalui header Accept, dan server memilih format yang sesuai dan mengembalikannya dengan Content-Type yang sesuai. Misalnya, klien mengirim Accept: application/json, server merespon dengan Content-Type: application/json. Jika server tidak dapat menyediakan format yang diminta, ia mengembalikan 406 Not Acceptable. Di REST API, mekanisme ini memungkinkan satu endpoint mengembalikan data dalam JSON, XML atau HTML.

Content-Type dalam permintaan dan respons

Header Content-Type digunakan baik dalam permintaan HTTP (Request) maupun dalam respons HTTP (Response). Dalam permintaan, ini menunjukkan format body permintaan, misalnya saat mengirim JSON melalui POST. Dalam respons — format data yang dikembalikan. Perbedaan mendasar adalah bahwa Content-Type permintaan diatur oleh klien, sedangkan Content-Type respons — oleh server. Pengaturan yang salah Content-Type dalam permintaan menyebabkan server tidak dapat mem-parsing body, mengembalikan kesalahan 400 Bad Request atau 415 Unsupported Media Type.

Dalam permintaan HTTP, Content-Type wajib untuk metode POST, PUT dan PATCH jika permintaan berisi body. GET, HEAD dan DELETE biasanya tidak menggunakan body, sehingga Content-Type untuk mereka tidak ditentukan atau diabaikan. Saat mengirim formulir HTML dengan atribut enctype="multipart/form-data", browser secara otomatis mengatur Content-Type: multipart/form-data dengan string batas (boundary) unik yang memisahkan bagian-bagian dari permintaan gabungan. Setiap bagian dipisahkan oleh --boundary, dan akhir permintaan ditandai oleh --boundary--.

Dalam respons HTTP, Content-Type diatur oleh server. Jika server tidak menentukan Content-Type, klien baik mengaktifkan MIME sniffing, atau memproses respons sebagai application/octet-stream. Metode HTTP HEAD memungkinkan mendapatkan header respons, termasuk Content-Type, tanpa mengirim body. Ini berguna untuk memeriksa jenis sumber daya sebelum memuatnya sepenuhnya. Server CDN dapat menimpa Content-Type saat transformasi konten — misalnya, saat mengonversi gambar ke WebP.

kotlin
import okhttp3.*

fun checkContentType() {
    val client = OkHttpClient()
    val request = Request.Builder()
        .url("https://api.example.com/resource")
        .head()
        .build()

    client.newCall(request).execute().use { response ->
        val contentType = response.header("Content-Type")
        val mediaType = MediaType.parse(contentType)
        println("Tipe: ${mediaType?.type}, Subtipe: ${mediaType?.subtype}")
    }
}

Content-Type dalam klien HTTP seluler

Dalam pengembangan seluler, header Content-Type diproses secara otomatis oleh klien HTTP. Di OkHttp di Android, Content-Type diatur melalui RequestBody: val body = "{}".toRequestBody("application/json".toMediaType()). Retrofit mengelola Content-Type melalui anotasi: @Body untuk JSON, @Part untuk multipart. Di iOS, URLSession mengatur Content-Type untuk HTTPBody, dan Alamofire melakukannya melalui parameter encoding: JSONEncoding.default atau URLEncoding.default. Pengaturan manual Content-Type diperlukan saat bekerja dengan soket mentah atau protokol kustom.

Kesalahan saat bekerja dengan Content-Type

Content-Type yang salah — salah satu masalah paling umum dalam pengembangan dan integrasi layanan web. Kesalahan yang paling umum adalah ketika server mengembalikan text/html sebagai ganti application/json. Klien menerima JSON sebagai string HTML, tidak dapat mem-parsingnya dan melempar pengecualian. Ini terjadi ketika kerangka kerja web dikonfigurasi secara default ke HTML, dan pengembang lupa menimpa Content-Type untuk endpoint API. Di PHP, ini bermanifestasi dengan tidak adanya header('Content-Type: application/json'), di Spring Boot — dengan tidak adanya anotasi produces.

Kesalahan kedua yang paling umum adalah charset yang salah atau hilang. Jika server mengirim text/html; charset=iso-8859-1 dan browser mengharapkan UTF-8, karakter Sirilik ditampilkan dengan kacau. Masalah ini khas untuk situs lama yang belum beralih ke UTF-8. Untuk JSON, kesalahan semacam itu lebih jarang terjadi, karena RFC 8259 menetapkan UTF-8 tanpa persetujuan tambahan. Solusi — selalu tentukan secara eksplisit charset=utf-8 untuk tipe MIME teks dalam konfigurasi server.

Masalah ketiga — ketidaksesuaian Content-Type dengan konten sebenarnya. Jika server mengirim Content-Type: image/png tetapi body respons berisi gambar WebP, browser mungkin tidak dapat mendekodenya. Server CDN terkadang mengompresi gambar dengan mengubah format, tetapi tidak memperbarui header Content-Type. Pemeriksaan kesesuaian Content-Type dengan konten sebenarnya adalah tahap wajib pengujian API dan pengujian integrasi aplikasi seluler.

Diagnosis dan perbaikan kesalahan Content-Type

Untuk debugging, gunakan alat pengembang browser (tab Network), curl dengan bendera -I untuk memeriksa header respons, atau sniffer lalu lintas seperti Charles Proxy dan Wireshark. Nginx dikonfigurasi melalui direktif include mime.types, Apache — melalui AddType dan AddDefaultCharset. Untuk file statis, selalu periksa bahwa ekstensi file sesuai dengan tipe MIME-nya. Untuk respons dinamis, di semua bahasa pemrograman, atur Content-Type secara eksplisit sebelum mengeluarkan data — ini mencegah sebagian besar masalah.

Pertanyaan yang Sering Diajukan

Apa yang terjadi jika Content-Type tidak ditentukan dalam respons HTTP?

Tanpa Content-Type, browser mengaktifkan MIME sniffing — analisis byte pertama respons untuk menentukan tipe data secara otomatis. Ini dapat menyebabkan pemrosesan konten yang salah dan menciptakan kerentanan keamanan. Browser modern dengan header X-Content-Type-Options: nosniff sepenuhnya memblokir penebakan.

Apa perbedaan Content-Type dan Accept di HTTP?

Content-Type menunjukkan format data yang dikirim dalam pesan saat ini (body permintaan atau respons). Accept — adalah header permintaan yang memberi tahu server format respons apa yang disukai klien. Content-Type diatur oleh pengirim data, dan Accept — oleh penerima, dan mereka berpartisipasi dalam mekanisme negosiasi konten.

Content-Type apa yang benar untuk JSON?

Tipe MIME resmi untuk JSON adalah application/json menurut spesifikasi RFC 8259. Sebelumnya digunakan text/x-json, tetapi tipe ini sudah usang. Parameter charset untuk application/json tidak diperlukan, karena JSON menurut spesifikasi selalu dikirim dalam pengkodean UTF-8, UTF-16 atau UTF-32 dengan deteksi otomatis urutan byte (BOM).

Mengapa server mengembalikan text/html sebagai ganti application/json?

Ini terjadi ketika kerangka kerja web tidak menimpa Content-Type default untuk endpoint API. Di PHP diperbaiki dengan panggilan header('Content-Type: application/json'), di Spring Boot — dengan anotasi @GetMapping(produces = "application/json"), di Express.js — dengan metode res.set('Content-Type', 'application/json').

Apa arti Content-Type: application/octet-stream?

application/octet-stream — tipe MIME universal untuk data biner yang formatnya tidak diketahui. Browser tidak mencoba menampilkan file seperti itu di jendela, tetapi menawarkan untuk menyimpannya ke disk. Ini digunakan untuk unduhan file, lampiran email, dan data streaming ketika server tidak dapat menentukan jenis konten yang dikirim.

Kesimpulan

  • Content-Type — header HTTP yang menentukan tipe MIME data yang dikirim, wajib untuk pesan dengan body.
  • Tipe MIME terdiri dari kategori (text, image, application) dan subtipe (html, json, png), dipisahkan oleh garis miring — misalnya, text/html atau application/json.
  • Parameter charset menunjukkan pengkodean untuk tipe teks; standar untuk web adalah UTF-8, penentuan eksplisit mencegah masalah tampilan karakter.
  • Content-Type digunakan baik dalam permintaan (POST, PUT) maupun respons, mempengaruhi pemilihan parser dan pemrosesan data oleh klien.
  • Kesalahan Content-Type menyebabkan tampilan yang salah, masalah parsing, kesalahan 400/415 dan kerentanan MIME sniffing.
  • Header X-Content-Type-Options: nosniff menonaktifkan penebakan tipe MIME oleh browser dan direkomendasikan oleh OWASP untuk semua aplikasi web.
  • Pemeriksaan Content-Type dalam pengujian API wajib — setiap endpoint harus mengembalikan tipe MIME yang diharapkan sesuai dengan konten respons yang sebenarnya.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga