ToolDeck

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:

ASCII1963
128 karakter

Kode Standar Amerika 7-bit. 128 karakter: huruf Inggris, angka, tanda baca, dan kode kontrol. Mendefinisikan encoding dasar yang menjadi landasan semua encoding lainnya.

Latin-11987
256 karakter

ASCII yang diperluas untuk bahasa Eropa Barat. Menambahkan 128 karakter (huruf beraksen, simbol). Tidak cocok untuk aksara non-Latin.

Unicode1991
149 186+ karakter

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.

UTF-81993
Semua Unicode karakter

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.

UTF-161996
Semua Unicode karakter

Encoding lebar variabel menggunakan 2 atau 4 byte per karakter. Digunakan secara internal oleh Windows, Java, dan string JavaScript. Tidak kompatibel dengan ASCII.

UTF-322000
Semua Unicode karakter

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:

InputByte hexBase64
"Man"77 61 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

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

KarakterTer-encodeCatatan
Space%20Paling umum; digunakan dalam pengiriman formulir sebagai + dalam application/x-www-form-urlencoded
&%26Pemisah query string; harus di-encode jika digunakan sebagai nilai literal
=%3DPemisah key-value dalam query string; encode jika digunakan sebagai data
+%2BDitafsirkan sebagai spasi dalam application/x-www-form-urlencoded; encode untuk mempertahankan + literal
#%23Penanda fragment; encode jika digunakan sebagai data literal dalam path atau query
/%2FPemisah segmen path; encode jika digunakan sebagai data literal, bukan sebagai pemisah path
:%3APemisah scheme; encode dalam konteks path dan query
@%40Digunakan 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

HTTP Basic Authentication

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

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).

Lampiran Email MIME

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

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.

Parameter Query String

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 Internasional

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

Apakah Base64 adalah bentuk enkripsi?

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.

Mengapa output Base64 terkadang diakhiri dengan ==?

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).

Apa perbedaan antara Base64 dan Base64url?

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.

Kapan harus menggunakan encodeURI vs encodeURIComponent?

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.

Mengapa UTF-8 lebih baik dari UTF-16 untuk web?

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.

Apa itu encoding persen?

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.

Apakah encoding memengaruhi performa?

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.

Apa itu Punycode?

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.