Langsung ke konten
Belajar HTML & CSS

Cara Menggunakan iFrame HTML: Panduan Lengkap untuk Memasukkan Halaman Lain

Foto TaufiqOleh Taufiq
Memasukkan Halaman Lain dengan iFrame

Pernahkah Anda ingin memasukkan halaman lain dengan iframe ke dalam website — misalnya menampilkan video YouTube, peta Google Maps, atau formulir dari layanan pihak ketiga tanpa mengarahkan pengunjung ke tab baru? Elemen <iframe> (inline frame) adalah jawabannya: sebuah “jendela” di dalam halaman HTML yang memuat dokumen HTML lain secara langsung. Berbeda dengan <frame> dan <frameset> yang sudah lama ditinggalkan, iframe memberikan fleksibilitas jauh lebih besar — Anda bisa menaruhnya di mana saja, menggabungkannya dengan konten lain, dan mengontrol perilakunya secara detail lewat atribut maupun JavaScript. Dalam panduan lengkap ini kita akan membahas sintaks dasar, seluruh atribut penting, teknik keamanan, cara membuat iframe responsif, hingga komunikasi lintas domain memakai postMessage, lengkap dengan contoh kode yang siap dipakai — jadi Anda benar-benar tahu cara menggunakan iframe HTML dengan benar dan aman.

Apa Itu iFrame dan Kapan Sebaiknya Dipakai?

<iframe> adalah elemen HTML yang menyematkan satu dokumen HTML di dalam dokumen HTML lainnya. Bayangkan sebuah bingkai foto: foto di dalamnya bisa diganti tanpa harus mengganti bingkainya. Begitu pula iframe — konten di dalamnya dimuat dari URL src yang terpisah, sehingga halaman induk dan konten iframe tetap independen satu sama lain.

Beberapa penggunaan iframe yang paling umum dalam pengembangan web sehari-hari:

  • Embed video — YouTube, Vimeo, dan platform video lain menyediakan kode embed berbasis iframe yang tinggal ditempel.
  • Peta interaktif — Google Maps dan OpenStreetMap menyediakan iframe untuk menampilkan lokasi tanpa plugin tambahan.
  • Formulir pihak ketiga — layanan seperti Google Forms, Typeform, atau payment gateway sering menggunakan iframe agar data tidak perlu melewati server Anda.
  • Widget media sosial — timeline Instagram, Facebook Page plugin, dan postingan Twitter/X bisa disematkan lewat iframe.
  • Konten dari sistem lain — dashboard, laporan, atau aplikasi internal yang sudah jadi bisa ditampilkan di dalam halaman utama.

Intinya, setiap kali Anda membutuhkan konten dari sumber lain agar tampil menyatu dengan halaman Anda, iframe adalah cara paling sederhana dan paling banyak didukung browser.

Cara Menggunakan iFrame HTML: Sintaks Dasar

Bentuk paling sederhana dari sebuah iframe hanya butuh satu atribut wajib, yaitu src:

Block Code Snippet Code
<iframe src="https://www.example.com/"> Browser Anda tidak mendukung iframe.
</iframe>

Teks di antara tag <iframe> dan </iframe> berfungsi sebagai fallback — hanya ditampilkan jika browser pengunjung sama sekali tidak mendukung iframe. Dalam praktiknya hampir semua browser modern mendukung iframe, jadi fallback ini jarang terlihat. Meski begitu, menuliskannya tetap kebiasaan yang baik karena menjaga validitas HTML dan membantu mesin pencari memahami maksud halaman.

Satu hal yang perlu diingat sejak awal: iframe bukanlah elemen yang bisa “menutup sendiri” seperti <img>. Pastikan Anda selalu menulis pasangan tag penutup </iframe>, karena lupa menutupnya adalah salah satu penyebab paling umum layout halaman berantakan.

Atribut iFrame yang Perlu Anda Kuasai

HTML5 mendefinisikan sejumlah atribut penting untuk <iframe>. Memahami masing-masing atribut akan membantu Anda memakai iframe dengan benar, aman, dan optimal.

Atribut Dasar

AtributNilaiDeskripsi
srcURLURL dokumen yang dimuat di dalam iframe. Ini atribut paling fundamental.
widthpixels / %Lebar iframe. Gunakan persen untuk layout responsif.
heightpixels / %Tinggi iframe. Harus ditentukan secara eksplisit atau dikontrol lewat CSS.
namestringNama iframe, dipakai sebagai target link (<a target="nama">) atau target JavaScript.
titlestringJudul iframe untuk screen reader. Penting untuk aksesibilitas (WCAG).

Dari tabel di atas, atribut title sering kali paling sering dilupakan padahal dampaknya besar. Pengguna screen reader akan mendengar judul ini saat berpindah ke dalam iframe. Jika judulnya kosong, mereka hanya mendengar “frame” tanpa informasi apa pun — pengalaman yang membingungkan.

Atribut Keamanan dan Performa

AtributNilaiDeskripsi
loadinglazy / eagerMengontrol kapan iframe dimuat. lazy menunda pemuatan sampai iframe mendekati viewport — sangat meningkatkan performa.
sandboxstring kosong atau tokenMembatasi kemampuan konten di dalam iframe. Token tersedia: allow-scripts, allow-same-origin, allow-forms, allow-popups, dan lainnya.
allowstringMengizinkan fitur browser spesifik seperti kamera, mikrofon, atau geolocation.
referrerpolicystringMengontrol informasi Referer yang dikirim saat memuat iframe.

Contoh Penggunaan loading=”lazy”

Atribut loading="lazy" adalah salah satu optimasi performa paling sederhana dan paling efektif. Bayangkan halaman dengan tiga video embed di bagian bawah artikel — tanpa lazy, ketiganya langsung dimuat begitu halaman terbuka, memperlambat waktu muat. Dengan lazy, browser baru memuat iframe ketika pengunjung menggulir mendekatinya:

Block Code Snippet Code
<iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" width="560" height="315" loading="lazy" title="Video YouTube"
></iframe>

Efeknya signifikan, terutama di halaman mobile dengan koneksi lambat. Google sendiri menjadikan kecepatan halaman sebagai faktor peringkat, jadi atribut kecil ini bisa ikut membantu SEO secara tidak langsung — salah satu langkah praktis dalam cara meningkatkan kecepatan loading website secara keseluruhan.

Atribut sandbox — Benteng Keamanan Dasar

Atribut sandbox adalah mekanisme keamanan utama untuk iframe. Ketika Anda menambahkan sandbox tanpa nilai (atau string kosong), browser membatasi semua kemampuan konten di dalam iframe:

  • Script tidak dapat dijalankan
  • Form tidak dapat disubmit
  • Link tidak dapat membuka popup
  • Navigasi tingkat atas (top-level navigation) tidak diizinkan
  • Same-origin policy diterapkan secara ketat
  • Plugin seperti Flash atau Java tidak dapat berjalan

Untuk mengizinkan kemampuan tertentu, tambahkan token yang diinginkan:

HTML Snippet HTML
<!-- Izinkan script + form, tapi tetap batasi navigasi -->
<iframe src="https://www.example.com/form" sandbox="allow-scripts allow-forms"
></iframe> <!-- Izinkan script + same-origin (hati-hati!) -->
<iframe src="https://www.example.com/" sandbox="allow-scripts allow-same-origin"
></iframe>

Peringatan penting: menggabungkan allow-scripts dan allow-same-origin secara bersamaan justru menghilangkan proteksi sandbox — konten di dalam iframe bisa menghapus atribut sandbox itu sendiri. Gunakan kombinasi ini hanya jika Anda benar-benar memahami risikonya, misalnya untuk konten dari domain yang Anda kendalikan penuh.

Pola terbaiknya: mulai dari sandbox kosong (paling ketat), lalu tambahkan token satu per satu hanya ketika konten benar-benar membutuhkannya. Pendekatan “least privilege” ini mengurangi permukaan serangan secara signifikan.

Atribut allow — Kontrol Fitur Browser

Atribut allow mengontrol fitur browser (Permissions Policy) yang tersedia untuk konten iframe. Ini terutama digunakan untuk embed video, kamera, mikrofon, atau fitur hardware lain:

Block Code Snippet Code
<iframe src="https://www.example.com/camera-demo" allow="camera; microphone; geolocation"
></iframe>

Untuk YouTube embed, YouTube merekomendasikan penggunaan allow agar video berjalan dengan benar:

Block Code Snippet Code
<iframe width="560" height="315" src="https://www.youtube.com/embed/dQw4w9WgXcQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen
></iframe>

Tanpa izin yang tepat, fitur seperti autoplay atau picture-in-picture bisa diblokir browser. Jadi jika embed pihak ketiga tidak berfungsi seperti yang diharapkan, cek dulu daftar allow yang direkomendasikan penyedia layanan tersebut.

Risiko Keamanan iFrame yang Harus Diwaspadai

Meskipun iframe sangat berguna, penggunaannya membawa risiko keamanan serius yang wajib dipahami setiap developer.

1. Clickjacking

Clickjacking adalah teknik serangan di mana penyerang menyembunyikan elemen interaktif di dalam iframe transparan di atas halaman yang sah. Pengguna mengira mereka mengklik tombol yang wajar, padahal sebenarnya mereka berinteraksi dengan konten berbahaya di dalam iframe.

Contoh skenario: penyerang membuat halaman bertuliskan “Klaim Hadiah Gratis” lalu menumpuknya dengan iframe transparan dari halaman banking korban. Tombol “Klaim” yang terlihat sebenarnya menekan tombol “Transfer” di halaman banking. Inilah mengapa melindungi halaman Anda dari dimasukkan ke iframe orang lain sangat penting.

2. Cross-Site Scripting (XSS) melalui iframe

Jika Anda mengizinkan allow-same-origin dan allow-scripts pada iframe yang memuat konten dari domain berbeda, konten berbahaya di dalamnya dapat mengakses cookie dan data sesi halaman induk, membuka pintu serangan XSS. Kombinasi kedua token ini pada konten yang tidak Anda percayai adalah kesalahan yang sering terjadi dan sangat berbahaya.

3. Phishing dan Content Injection

iframe bisa memuat halaman palsu yang meniru tampilan login bank atau layanan populer. Karena tampilannya menyatu dengan halaman Anda, pengunjung bisa tertipu menyerahkan kredensial mereka. Selalu waspadai konten apa yang Anda sematkan dan dari domain mana.

Mencegah Halaman Anda Dimasukkan ke iFrame Pihak Lain

Ada dua mekanisme HTTP response header utama untuk mencegah situs lain menyematkan halaman Anda ke dalam iframe berbahaya.

X-Frame-Options (XFO)

Header X-Frame-Options mengontrol apakah browser boleh merender halaman dalam iframe. Ada tiga nilai yang didukung:

Block Code Snippet Code
# Nginx
add_header X-Frame-Options "DENY" always; # Atau izinkan iframe hanya dari domain yang sama
add_header X-Frame-Options "SAMEORIGIN" always; # Apache .htaccess
Header always set X-Frame-Options "DENY"
NilaiDeskripsi
DENYHalaman TIDAK boleh dirender dalam iframe, dari domain mana pun.
SAMEORIGINHalaman hanya boleh di-iframe oleh halaman dari origin yang sama.
ALLOW-FROM uriHalaman hanya boleh di-iframe dari URI tertentu. (Sudah deprecated di banyak browser.)

Content-Security-Policy (CSP) — frame-ancestors

X-Frame-Options perlahan digantikan oleh directive frame-ancestors dalam Content Security Policy. CSP memberikan kontrol yang lebih fleksibel dan granular:

Block Code Snippet Code
# Nginx — izinkan iframe hanya dari domain sendiri dan Google
add_header Content-Security-Policy "frame-ancestors 'self' https://www.google.com" always; # Apache — blokir semua iframe dari domain lain
Header always set Content-Security-Policy "frame-ancestors 'none'"

Menggunakan CSP frame-ancestors direkomendasikan karena:

  • Mendukung multiple domain tanpa header berulang
  • Lebih selaras dengan standar modern
  • Bisa dikombinasikan dengan directive CSP lain dalam satu header

Cara paling aman adalah menggabungkan kedua header tersebut untuk kompatibilitas lintas browser:

Block Code Snippet Code
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;

Membuat iFrame Responsif dengan CSS

Salah satu tantangan terbesar dalam menggunakan iframe adalah membuatnya tampil baik di berbagai ukuran layar. Ukuran width dan height statis akan membuat iframe tidak optimal di perangkat mobile.

Teknik Intrinsic Ratio (Paling Populer)

Teknik ini memakai rasio aspek container untuk menjaga proporsi iframe tetap konsisten di semua layar:

Block Code Snippet Code
<style> .responsive-iframe { position: relative; width: 100%; padding-bottom: 56.25%; /* 16:9 aspect ratio */ height: 0; overflow: hidden; } .responsive-iframe iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
</style> <div class="responsive-iframe"> <iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" title="Video responsif" frameborder="0" allowfullscreen ></iframe>
</div>

Rasio padding-bottom: 56.25% menghasilkan proporsi 16:9. Untuk rasio 4:3, gunakan padding-bottom: 75%. Trik padding-bottom bekerja karena nilai persen pada padding dihitung dari lebar elemen induk, sehingga container selalu menjaga proporsi meski lebarnya berubah.

Teknik Modern dengan aspect-ratio CSS

Properti CSS aspect-ratio (didukung semua browser modern sejak 2021) memberikan solusi yang jauh lebih bersih:

Block Code Snippet Code
<style> .responsive-iframe { width: 100%; aspect-ratio: 16 / 9; border: none; }
</style> <iframe class="responsive-iframe" src="https://www.example.com/embed" title="Konten responsif" loading="lazy"
></iframe>

Untuk browser lama, kombinasikan dengan @supports agar terjadi penurunan fungsi yang mulus. Pemahaman tentang jenis-jenis selector pada CSS juga membantu saat Anda perlu menargetkan banyak iframe sekaligus dalam satu stylesheet:

Block Code Snippet Code
/* Fallback untuk browser yang tidak mendukung aspect-ratio */
@supports not (aspect-ratio: 16/9) { .responsive-iframe { position: relative; padding-bottom: 56.25%; height: 0; } .responsive-iframe iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
}

Komunikasi Cross-Origin dengan postMessage

Karena Same-Origin Policy, halaman induk dan konten iframe dari domain berbeda tidak bisa langsung mengakses DOM satu sama lain. window.postMessage() adalah API standar yang memungkinkan komunikasi aman di antara keduanya.

Mengirim Pesan dari Halaman Induk ke iFrame

Block Code Snippet Code
<script> // Kirim pesan ke iframe const iframe = document.getElementById('my-iframe'); iframe.contentWindow.postMessage( { type: 'UPDATE_DATA', payload: { userId: 123 } }, 'https://target-domain.com' // target origin — WAJIB spesifik! );
</script>

Menerima Pesan di dalam iFrame

Block Code Snippet Code
<script> // Listener di dalam iframe window.addEventListener('message', (event) => { // SELALU verifikasi origin pengirim! if (event.origin !== 'https://trusted-domain.com') { console.warn('Pesan dari origin tidak terpercaya:', event.origin); return; } console.log('Data diterima:', event.data); // Balas pesan ke parent event.source.postMessage( { type: 'RESPONSE', status: 'success' }, event.origin // kirim balik ke origin yang sama ); });
</script>

Penting: selalu verifikasi event.origin sebelum memproses pesan. Jangan pernah menggunakan event.source.postMessage(data, '*') karena ini mengirim pesan ke semua penerima, termasuk yang berbahaya. Referensi lengkap bisa dibaca di MDN — Window.postMessage().

Pola postMessage sangat berguna untuk kasus nyata seperti: widget chat yang perlu memberi tahu halaman induk tentang jumlah pesan baru, atau halaman induk yang mengubah tema konten iframe. Tanpa mekanisme ini, integrasi semacam itu mustahil dilakukan lintas domain.

Mematikan iFrame di Website Anda

Jika Anda ingin melindungi website agar tidak bisa disematkan ke iframe pihak ketiga, lakukan langkah berikut:

  1. Tambahkan header HTTP X-Frame-Options: DENY atau SAMEORIGIN di konfigurasi server.
  2. Tambahkan CSP header frame-ancestors 'none' untuk standar yang lebih modern.
  3. JavaScript fallback (opsional, untuk browser yang tidak mendukung header):
Block Code Snippet Code
<script> if (window.top !== window.self) { window.top.location = window.self.location; }
</script>

Script di atas hanya efektif di browser yang mengabaikan header X-Frame-Options atau CSP — jangan jadikan ini satu-satunya mekanisme pertahanan. Header HTTP tetaplah lapisan pertahanan utama yang paling andal.

iFrame dan SEO: Hal yang Perlu Diperhatikan

Banyak orang bertanya apakah penggunaan iframe merugikan SEO. Jawabannya: tergantung bagaimana Anda menggunakannya. Konten di dalam iframe umumnya dianggap sebagai bagian dari dokumen yang disematkan, bukan halaman induk Anda — jadi jangan berharap konten iframe membantu peringkat kata kunci halaman Anda. Sebaliknya, iframe bisa menjadi sumber masalah performa jika dipakai berlebihan, dan performa adalah faktor peringkat yang nyata.

Praktik terbaik untuk SEO:

  • Gunakan loading="lazy" untuk iframe di bawah lipatan agar tidak memperlambat waktu muat.
  • Berikan title yang deskriptif pada setiap iframe.
  • Pastikan konten penting halaman tidak bergantung pada iframe yang mungkin gagal dimuat.
  • Tambahkan konten pendukung di sekitar iframe sehingga halaman tetap bernilai meski embed gagal.

Kapan Sebaiknya Tidak Menggunakan iFrame?

Iframe bukan solusi universal. Ada situasi di mana alternatif lain lebih baik:

  • Data yang perlu diakses mesin pencari — jika konten penting bagi SEO, render langsung di halaman alih-alih disematkan.
  • Perlu kontrol penuh atas tampilan dan interaksi — pertimbangkan mengambil data lewat API dan merendernya sendiri.
  • Masalah performa berulang — setiap iframe menambah permintaan HTTP dan beban rendering; terlalu banyak iframe bisa memperlambat halaman secara nyata.
  • Konten responsif yang kompleks — beberapa layanan tidak menyediakan versi embed yang ramah mobile.

Sebagai aturan praktis: gunakan iframe untuk konten yang memang dirancang untuk disematkan (video, peta, widget, formulir dari layanan tepercaya), dan hindari untuk konten yang menjadi nilai utama halaman Anda.

Kesimpulan

<iframe> adalah elemen HTML yang kuat tetapi perlu digunakan dengan hati-hati. Kuasai atribut keamanan seperti sandbox dan allow, selalu pasang X-Frame-Options dan Content-Security-Policy untuk melindungi website Anda dari clickjacking, dan terapkan teknik CSS responsif agar iframe tampil optimal di semua perangkat. Untuk integrasi yang lebih kompleks, manfaatkan postMessage() dengan verifikasi origin yang ketat.

Mulailah dari kasus sederhana — sematkan video YouTube atau peta dengan loading="lazy" dan title yang deskriptif. Setelah itu, pelajari atribut sandbox untuk konten yang kurang tepercaya, lalu coba teknik responsif dan postMessage seiring kebutuhan Anda berkembang. Untuk referensi lengkap, kunjungi dokumentasi resmi di MDN Web Docs — iframe element dan MDN — X-Frame-Options practical guide. Anda juga bisa mempelajari tutorial HTML dan web development lainnya di infanthree.com.

Hal yang sering ditanyakan seputar iFrame HTML

Apa fungsi utama tag iframe dalam halaman web?

Tag digunakan untuk menyematkan dokumen atau halaman web lain (seperti video YouTube, Google Maps, atau widget) ke dalam halaman utama.

Atribut keamanan apa yang wajib dipasang pada tag iframe?

Gunakan atribut sandbox untuk membatasi hak akses script dan loading=’lazy’ untuk mengoptimalkan kecepatan halaman.

Mengapa beberapa website tidak bisa dimuat di dalam iframe?

Karena website tersebut memasang header keamanan X-Frame-Options: DENY atau Content-Security-Policy frame-ancestors ‘none’ untuk mencegah serangan clickjacking.

Komentar

Memuat komentar…

Tinggalkan Komentar

Alamat email Anda tidak akan dipublikasikan.