Base64
7 alat
Apa itu Encoding?
Encoding adalah proses mengubah data dari satu representasi ke representasi lain. Dalam pengembangan web, encoding digunakan untuk mengirimkan data secara aman melalui saluran yang dirancang untuk set karakter terbatas — misalnya, mengirim data biner melalui protokol berbasis teks, atau menyertakan karakter khusus dalam URL.
Encoding karakter mendefinisikan bagaimana karakter teks dipetakan ke byte. Encoding Base64 mengubah data biner menjadi teks ASCII. Encoding URL membuat teks sembarang aman untuk digunakan dalam URL. Memahami ketiga lapisan encoding ini mencegah bug samar dan celah keamanan.
Sejarah Encoding Karakter
Encoding karakter adalah pemetaan antara karakter (huruf, simbol) dan representasi binernya. Evolusi dari ASCII ke Unicode mencerminkan web yang semakin mengglobal:
Kode Standar Amerika 7-bit. 128 karakter: huruf Inggris, angka, tanda baca, dan kode kontrol. Mendefinisikan encoding dasar yang menjadi landasan semua encoding lainnya.
ASCII yang diperluas untuk bahasa Eropa Barat. Menambahkan 128 karakter (huruf beraksen, simbol). Tidak cocok untuk aksara non-Latin.
Set karakter universal yang mencakup semua sistem penulisan di dunia. Mendefinisikan code point untuk lebih dari 149.000 karakter dalam 161 aksara. Tidak mendefinisikan encoding — itu adalah tugas UTF-8/16/32.
Encoding lebar variabel untuk Unicode menggunakan 1–4 byte per karakter. Kompatibel dengan ASCII (128 code point pertama berupa byte tunggal). Encoding dominan di web — lebih dari 98% situs web menggunakannya.
Encoding lebar variabel menggunakan 2 atau 4 byte per karakter. Digunakan secara internal oleh Windows, Java, dan string JavaScript. Tidak kompatibel dengan ASCII.
Encoding lebar tetap: selalu 4 byte per karakter. Sederhana namun boros ruang. Digunakan di beberapa internal basis data. Jarang ditemui di web.
Mengapa UTF-8 Menang
UTF-8 menjadi dominan karena kompatibel ke belakang dengan ASCII (128 karakter pertama diencode secara identik), bersifat self-synchronizing (batas karakter dapat ditemukan dengan pemindaian), dan hemat ruang untuk teks Latin. Setiap dokumen ASCII adalah dokumen UTF-8 yang valid. Hal ini membuat migrasi berjalan mulus.
Encoding Base64
Base64 mengubah data biner menjadi representasi teks menggunakan hanya 64 karakter ASCII yang dapat dicetak: A-Z, a-z, 0-9, +, dan /. Ini diperlukan ketika data biner harus melewati saluran yang hanya menangani teks — lampiran email, data URI, token JWT, dan HTTP Basic Auth semuanya menggunakan Base64.
Cara Kerjanya
Base64 mengelompokkan byte input menjadi potongan 3 byte (24 bit) dan mengubah setiap potongan menjadi 4 karakter Base64 (masing-masing 6 bit). Jika input bukan kelipatan 3 byte, karakter padding = ditambahkan untuk melengkapi kelompok terakhir:
| Input | Byte hex | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
Karakter padding = di akhir menunjukkan berapa byte yang kurang untuk melengkapi kelompok 3 byte terakhir. Satu = berarti satu byte padding diperlukan; == berarti dua byte diperlukan. Base64 standar selalu menghasilkan output dengan panjang yang merupakan kelipatan 4.
Encoding URL
URL hanya boleh mengandung sekumpulan karakter ASCII yang aman. Karakter apa pun di luar kumpulan tersebut — termasuk spasi, tanda baca, karakter non-ASCII, dan karakter URL khusus seperti &, =, dan # — harus di-encode dengan persen (URL-encoded) sebelum ditempatkan dalam URL.
Encoding persen menggantikan setiap byte yang tidak aman dengan karakter % diikuti dua digit heksadesimal yang mewakili nilai byte tersebut. Spasi menjadi %20, karakter ampersand menjadi %26, dan seterusnya.
Karakter yang Umum Di-encode
| Karakter | Ter-encode | Catatan |
|---|---|---|
| Space | %20 | Paling umum; digunakan dalam pengiriman formulir sebagai + dalam application/x-www-form-urlencoded |
| & | %26 | Pemisah query string; harus di-encode jika digunakan sebagai nilai literal |
| = | %3D | Pemisah key-value dalam query string; encode jika digunakan sebagai data |
| + | %2B | Ditafsirkan sebagai spasi dalam application/x-www-form-urlencoded; encode untuk mempertahankan + literal |
| # | %23 | Penanda fragment; encode jika digunakan sebagai data literal dalam path atau query |
| / | %2F | Pemisah segmen path; encode jika digunakan sebagai data literal, bukan sebagai pemisah path |
| : | %3A | Pemisah scheme; encode dalam konteks path dan query |
| @ | %40 | Digunakan dalam mailto: dan autentikasi; encode jika digunakan sebagai data literal |
encodeURI vs encodeURIComponent
JavaScript menyediakan dua fungsi encoding dengan cakupan berbeda. encodeURI mengubah keseluruhan URL — fungsi ini membiarkan karakter yang memiliki makna dalam URL (:, /, ?, #, @) tidak ter-encode. encodeURIComponent mengubah komponen URL (nilai parameter query tunggal atau segmen path) — fungsi ini mengubah semua karakter kecuali A-Z, a-z, 0-9, -, _, ., ~. Selalu gunakan encodeURIComponent untuk nilai individual dan encodeURI untuk URL lengkap.
Di Mana Encoding Muncul dalam Pengembangan Web
Header Authorization: Basic mengubah kredensial menjadi Base64(username:password). Ini adalah encoding untuk kemudahan transmisi, BUKAN keamanan — Base64 sangat mudah dibalik. Selalu gunakan HTTPS bersama Basic Auth.
Data URI menyematkan konten file langsung ke dalam HTML atau CSS: data:image/png;base64,.... Menyematkan gambar dan font secara inline dengan Base64 menghilangkan permintaan HTTP dengan konsekuensi peningkatan ukuran dokumen (~33% overhead).
Email dirancang untuk ASCII 7-bit. Lampiran biner (gambar, PDF) di-encode dengan Base64 oleh MIME sebelum dikirim. Klien email Anda mendekodenya secara transparan saat menampilkan email.
Token JWT menggunakan encoding Base64url (varian yang mengganti + dengan - dan / dengan _, tanpa padding) untuk ketiga bagiannya (header, payload, signature). Ini membuat token aman digunakan dalam URL tanpa perlu encoding persen tambahan.
Setiap data yang disediakan pengguna dalam query string URL harus di-encode dengan persen. Kegagalan mengubah & atau = dalam sebuah nilai akan merusak penguraian query string secara diam-diam. Selalu gunakan encodeURIComponent untuk nilai individual.
Nama domain non-ASCII (misalnya, münchen.de) di-encode menggunakan Punycode (awalan xn--) untuk kompatibilitas dengan sistem DNS. Browser menampilkan bentuk Unicode tetapi mengirimkan bentuk Punycode ke resolver DNS.
Pertanyaan yang Sering Diajukan
Tidak. Base64 adalah encoding, bukan enkripsi. Ini adalah transformasi yang dapat dibalik tanpa kunci rahasia. Siapa pun yang melihat string Base64 dapat mendekodenya secara instan. Jangan pernah menggunakan Base64 sebagai langkah keamanan.
Base64 memproses input dalam kelompok 3 byte. Jika input bukan kelipatan 3 byte, padding = ditambahkan untuk melengkapi kelompok terakhir. Satu = berarti satu byte padding; == berarti dua. Beberapa implementasi menghilangkan padding (Base64url untuk JWT).
Base64url adalah varian Base64 yang aman untuk URL, mengganti + dengan - dan / dengan _, serta biasanya menghilangkan padding =. Ini membuatnya aman digunakan dalam URL dan header HTTP tanpa encoding persen. JWT menggunakan Base64url untuk ketiga bagiannya.
Gunakan encodeURIComponent untuk nilai individual (nilai parameter query, nilai segmen path). Gunakan encodeURI untuk string URL lengkap di mana Anda ingin mempertahankan karakter struktur URL (/, :, ?, #). Jika ragu, gunakan encodeURIComponent.
UTF-8 kompatibel dengan ASCII dan hemat ruang untuk teks Latin (sebagian besar URL, tag HTML, dan kode adalah ASCII). UTF-16 boros ruang untuk konten ASCII dan tidak kompatibel ke belakang. HTTP dan HTML menggunakan UTF-8 sebagai default.
Encoding persen (URL encoding) merepresentasikan karakter sebagai % diikuti nilai byte heksadesimal dua digit. Misalnya, spasi adalah %20 (desimal 32, hex 20). Karakter UTF-8 multi-byte mengubah setiap byte secara terpisah: é menjadi %C3%A9.
Base64 meningkatkan ukuran data sekitar 33% dan menambah overhead CPU untuk encoding/decoding. Untuk sistem dengan throughput tinggi, sebaiknya gunakan protokol biner. Encoding URL menambah overhead minimal namun dapat membuat URL jauh lebih panjang jika banyak karakter khusus.
Punycode adalah encoding untuk merepresentasikan karakter Unicode dalam sistem DNS yang kompatibel dengan ASCII. Nama domain internasional seperti münchen.de di-encode sebagai xn--mnchen-3ya.de dalam query DNS. Browser menampilkan bentuk Unicode namun menggunakan Punycode secara internal.