Base64 URL-safe

Enkode dan dekode Base64 aman URL (Base64url)

Teks Biasa

Base64

Berjalan lokal · Aman untuk menempel rahasia
Output Base64...

Apa Itu Enkoding Base64url?

Base64url adalah varian dari enkoding Base64 yang dirancang khusus untuk digunakan dalam URL, nama file, dan konteks lain di mana karakter Base64 standar + dan / menimbulkan masalah. Didefinisikan dalam RFC 4648 Bagian 5, Base64url mengganti + dengan - (tanda hubung) dan / dengan _ (garis bawah), serta menghilangkan karakter padding = di akhir. Hasilnya adalah string yang dapat disematkan langsung dalam parameter kueri URL, nama file, atau header HTTP tanpa memerlukan percent-encoding tambahan.

Base64 standar (RFC 4648 Bagian 4) menggunakan 64 karakter: A-Z, a-z, 0-9, +, dan /. Karakter + dan / digunakan secara khusus dalam URL: + ditafsirkan sebagai spasi dalam query string (application/x-www-form-urlencoded), dan / adalah pemisah jalur. Menggunakan Base64 standar di dalam URL karena itu memerlukan percent-encoding karakter tersebut (%2B, %2F), yang menambah panjang string dan membuatnya lebih sulit dibaca. Base64url menghilangkan masalah ini sepenuhnya dengan menggunakan karakter yang aman untuk URL sejak awal.

Penggunaan Base64url yang paling menonjol adalah dalam JSON Web Tokens (JWT). Ketiga segmen JWT — header, payload, dan tanda tangan — semuanya dienkode dengan Base64url. Code verifier OAuth 2.0 PKCE, nilai challenge WebAuthn, dan banyak skema token API juga bergantung pada Base64url. Memahami enkoding ini sangat penting bagi setiap pengembang yang bekerja dengan autentikasi, otorisasi, atau pertukaran data kriptografis.

Mengapa Menggunakan Alat Base64url Ini?

Konversi antara Base64url dan teks atau data biner langsung di browser Anda. Enkoding maupun dekoding didukung, dengan penanganan otomatis untuk padding dan penggantian karakter. Baik saat Anda men-debug token JWT, membuat code challenge PKCE, maupun membangun pengidentifikasi yang aman untuk URL, alat ini memproses semuanya secara lokal di browser Anda dengan latensi nol dan tanpa perlu bolak-balik ke server.

Konversi Instan
Output diperbarui saat Anda mengetik. Enkode teks ke Base64url atau dekode Base64url kembali ke teks tanpa penundaan — tanpa pengiriman formulir atau pemuatan ulang halaman.
🔗
Output Aman URL
Output hanya menggunakan karakter yang aman dalam URL, nama file, dan header HTTP: A-Z, a-z, 0-9, tanda hubung, dan garis bawah. Tidak diperlukan percent-encoding.
🔒
Pemrosesan Mengutamakan Privasi
Semua enkoding dan dekoding berjalan secara lokal di browser Anda. Token JWT, rahasia OAuth, dan kunci API yang Anda tempelkan di sini tidak pernah dikirimkan ke server mana pun.
🏛️
Sesuai Standar
Mengimplementasikan RFC 4648 Bagian 5 secara tepat: - dan _ menggantikan + dan /, padding dihilangkan. Kompatibel dengan pustaka JWT, OAuth 2.0 PKCE, dan implementasi WebAuthn.

Kasus Penggunaan Base64url

Inspeksi Token JWT
Dekode segmen JWT individual (header, payload) untuk memeriksa klaim, waktu kedaluwarsa, dan algoritma penandatanganan tanpa mengimpor pustaka JWT atau memverifikasi tanda tangan.
Alur OAuth 2.0 PKCE
Buat dan verifikasi nilai code_verifier dan code_challenge PKCE. Metode code_challenge_method S256 memerlukan hash SHA-256 yang dienkode Base64url dari code_verifier.
Integrasi WebAuthn / FIDO2
Challenge WebAuthn, ID kredensial, dan data attestation ditransmisikan sebagai string Base64url antara browser dan server relying party. Dekode untuk men-debug alur registrasi dan autentikasi.
Pembuatan Token API
Buat token aman URL dari byte acak untuk tautan reset kata sandi, verifikasi email, dan pengidentifikasi sesi. Base64url menghasilkan string ringkas yang berfungsi dalam URL tanpa perlu escaping.
Pipeline DevOps dan CI/CD
Simpan nilai konfigurasi biner (sertifikat, kunci) sebagai string Base64url dalam variabel lingkungan atau file YAML. Tidak seperti Base64 standar, output tidak mengandung karakter yang bertentangan dengan ekspansi shell atau sintaks YAML.
Rekayasa Data
Enkode pengidentifikasi biner, hash, atau checksum sebagai Base64url untuk digunakan dalam nama file, kunci database, atau kolom CSV di mana karakter + dan / akan merusak penguraian atau memerlukan escaping.

Base64 Standar vs Base64url

Base64url berbeda dari Base64 standar dalam tepat tiga hal. Algoritma enkoding identik — hanya alfabet dan perilaku padding yang berubah:

FiturStandar (RFC 4648 §4)Base64url (RFC 4648 §5)
Index 62+-
Index 63/_
Padding= (required)Omitted

Ketiga perbedaan ini berarti konversi antara Base64 standar dan Base64url sangat mudah: ganti + dengan -, / dengan _, dan hapus karakter = di akhir. Sebaliknya, ganti - dengan +, _ dengan /, dan tambahkan kembali padding agar panjangnya merupakan kelipatan 4. Sebagian besar bahasa pemrograman menyediakan dukungan Base64url secara native, sehingga konversi manual tidak diperlukan. Kedua konversi ini sepenuhnya dapat dibalik dan tanpa kehilangan data, sehingga urutan byte asli dipertahankan secara tepat.

Tabel Perbandingan Enkoding

Tabel di bawah menunjukkan input yang sama dienkode dengan Base64 standar dan Base64url. Perhatikan bagaimana karakter padding (=) dihilangkan dan + / / diganti dengan - / _ dalam varian aman URL:

InputBase64 StandarBase64url (tanpa padding)
HelloSGVsbG8=SGVsbG8
AQQ==QQ
1+1=2MSsxPTI=MSsxPTI
subject?ref=1c3ViamVjdD9yZWY9MQ==c3ViamVjdD9yZWY9MQ
👍 (thumbs up)8J+RjQ==8J-RjQ

Contoh Kode

Cara mengenkode dan mendekode string Base64url dalam bahasa pemrograman populer. Setiap contoh menghasilkan output yang aman digunakan dalam URL, nama file, dan header HTTP:

JavaScript (browser)
// Encode to Base64url
function toBase64url(str) {
  return btoa(unescape(encodeURIComponent(str)))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '')
}
toBase64url('Hello!') // → "SGVsbG8h"

// Decode from Base64url
function fromBase64url(b64url) {
  const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')
  const pad = (4 - b64.length % 4) % 4
  return decodeURIComponent(escape(atob(b64 + '='.repeat(pad))))
}
fromBase64url('SGVsbG8h') // → "Hello!"
Node.js
// Native base64url support since Node 15.7
const encoded = Buffer.from('Hello!').toString('base64url')
// → "SGVsbG8h"

const decoded = Buffer.from('SGVsbG8h', 'base64url').toString()
// → "Hello!"

// Decode a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0...'
const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString())
// → { sub: "1234567890" }
Python
import base64

# Encode to Base64url (no padding)
encoded = base64.urlsafe_b64encode(b'Hello!').rstrip(b'=').decode()
# → "SGVsbG8h"

# Decode from Base64url (re-add padding)
def b64url_decode(s: str) -> bytes:
    s += '=' * (4 - len(s) % 4)  # restore padding
    return base64.urlsafe_b64decode(s)

b64url_decode('SGVsbG8h')  # → b'Hello!'
Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    // Encode to Base64url (no padding)
    encoded := base64.RawURLEncoding.EncodeToString([]byte("Hello!"))
    fmt.Println(encoded) // → "SGVsbG8h"

    // Decode from Base64url
    decoded, _ := base64.RawURLEncoding.DecodeString("SGVsbG8h")
    fmt.Println(string(decoded)) // → "Hello!"
}

Pertanyaan yang Sering Diajukan

Apa perbedaan antara Base64 dan Base64url?
Base64url mengganti + dengan - dan / dengan _ dari alfabet Base64 standar, serta menghilangkan karakter padding = di akhir. Ini membuat output aman digunakan dalam URL, parameter kueri, nama file, dan header HTTP tanpa enkoding tambahan. Algoritma yang mendasarinya (membagi byte menjadi kelompok 6-bit yang dipetakan ke karakter ASCII) identik. Dalam praktiknya, string Base64url dapat muncul langsung dalam URL dan header HTTP tanpa modifikasi, sementara string Base64 standar memerlukan percent-encoding (%2B untuk +, %2F untuk /) dalam konteks tersebut.
Mengapa token JWT menggunakan Base64url bukan Base64 standar?
JWT sering ditransmisikan dalam parameter kueri URL dan header HTTP Authorization. Karakter Base64 standar + dan / perlu di-percent-encode dalam URL, menambah panjang dan merusak perbandingan string sederhana. Spesifikasi JWT (RFC 7519) mewajibkan Base64url tanpa padding agar token ringkas dan aman URL secara default.
Bagaimana cara mengkonversi Base64 standar ke Base64url?
Ganti setiap + dengan -, setiap / dengan _, dan hapus semua karakter = di akhir. Dalam JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''). Dalam Python: base64.urlsafe_b64encode(data).rstrip(b'='). Sebagian besar bahasa modern juga menyediakan fungsi enkoding Base64url tersendiri. Konversi ini umumnya diperlukan saat mengintegrasikan pustaka lama yang menghasilkan Base64 standar dengan sistem modern yang mengharapkan Base64url.
Apakah enkoding Base64url dapat dibalik?
Ya, Base64url sepenuhnya dapat dibalik. Untuk mendekode, ganti - dengan + dan _ dengan /, tambahkan kembali karakter padding = agar panjangnya merupakan kelipatan 4, lalu dekode sebagai Base64 standar. Output yang didekode identik byte-per-byte dengan input asli.
Bisakah saya menggunakan Base64url untuk mengenkripsi data?
Tidak. Base64url adalah enkoding, bukan enkripsi. Ini mengubah data biner ke format teks yang aman tanpa kerahasiaan apa pun — siapa pun dapat mendekodenya. Jika Anda perlu melindungi data, enkripsi terlebih dahulu dengan algoritma yang tepat (AES, ChaCha20), lalu enkode ciphertext dengan Base64url untuk transportasi.
Mengapa padding dihilangkan dalam Base64url?
Karakter padding (=) tidak berguna ketika decoder dapat menghitung jumlah byte yang hilang dari panjang string: (4 - length % 4) % 4 memberikan padding yang dibutuhkan. Menghilangkan padding membuat string lebih pendek dan menghindari karakter =, yang perlu di-percent-encode dalam URL. RFC 4648 Bagian 5 secara eksplisit mengizinkan penghilangan padding dalam Base64url.
Bagaimana cara menangani string Base64url dengan padding dalam kode saya?
Beberapa sistem menghasilkan string Base64url yang mempertahankan padding =. Sebagian besar decoder menangani ini dengan benar. Jika decoder Anda tidak, hapus = di akhir sebelum mendekode. Sebaliknya, jika suatu pustaka memerlukan padding, hitung dan tambahkan: const padded = str + '='.repeat((4 - str.length % 4) % 4). Ini berfungsi karena jumlah padding dapat ditentukan dari panjang string.