Base64 vs URL kodlama: fark nedir?
Benzer gelen ve sürekli karıştırılan iki kodlama şeması. İşte her birinin ne yaptığı, nerede kullanıldığı ve neden onları karıştırmamanız gerektiği.
“Base64 kodlama” ve “URL kodlama” — ikisi de benzer bir şey yapıyormuş gibi geliyor. Her ikisi de veriyi, yalnızca güvenli karakterler kullanan farklı bir gösterime dönüştürüyor. Ama farklı sorunları çözüyorlar, çok farklı çıktılar üretiyorlar ve farklı yerlerde kullanılıyorlar. İkisini karıştırmak API’leri bozmanın, linkleri mahvetmenin ve saatlerce hata ayıklamanın güvenilir yolu.
İki kodlamaya bakış
| Base64 | URL kodlama (percent-encoding) | |
|---|---|---|
| Amaç | İkili veriyi metin olarak temsil etmek | Dizeleri URL için güvenli yapmak |
| Alfabe | 64 karakter (A-Z, a-z, 0-9, +, /) | Herhangi bir yazdırılabilir ASCII, güvensiz karakterler için %XX |
| Boyut artışı | Tam olarak +%33 | Değişken (içeriğe bağlı, tipik %0-200) |
| Kullanıldığı yer | E-posta, JSON, data URI’leri, JWT’ler | URL’ler, form gönderileri, sorgu dizeleri |
| Girdi | Baytlar | Metin (özel karakterler içeren dize) |
URL kodlama aslında ne yapar
URL kodlama (resmi adıyla percent-encoding, RFC 3986’da tanımlı), keyfi metni bir URL’ye bozmadan yerleştirmenizi sağlayan şema.
URL’lerin yapısı var:
https://example.com/search?q=coffee&lang=en
Bazı karakterlerin özel anlamları var:
?yolu sorgu dizesinden ayırır&sorgu parametrelerini ayırır=anahtarı değerden ayırır/yol segmentlerini ayırır#parçayı başlatır
Bu karakterlerden herhangi birini veri olarak eklemek istiyorsanız — mesela “A & B” gibi bir sorgu — URL ayrıştırıcısı karışmasın diye kaçırmanız gerekir. URL kodlama her özel karakteri % ile ardından iki basamaklı onaltılık ASCII koduyla değiştirir:
- Boşluk →
%20(veya sorgu dizelerinde+) &→%26=→%3D#→%23
Yani A & B, A%20%26%20B olur. Güvenli karakterler (harfler, rakamlar, -, _, ., ~) değişmez. Zaten güvenli karakterlerden oluşan bir girdi için çıktı biraz daha uzun olur. Özel karakterlerle dolu bir girdi için çok daha uzun.
Base64 aslında ne yapar
Base64 tamamen farklı. Baytları — metin olmak zorunda değil — alır ve alfabesindeki yalnızca 64 karakteri kullanan metin üretir. Her 3 baytlık girdi her zaman 4 karakterlik çıktıya dönüşür.
Base64 girdinin ne olduğunu umursamaz. Her şeyi bayt olarak ele alır ve metin beklenen neredeyse her yere koyulabilecek bir dize üretir. Çıktı girdiden tam olarak %33 daha uzundur (artı = ile en yakın 4 karaktere dolgu).
Bir PNG görüntüsünü, zip dosyasını veya şifrelenmiş veriyi e-posta ya da JSON gibi yalnızca metin kanalı üzerinden geçirmeniz gerektiğinde Base64’e başvurursunuz. URL kodlama bunu gerçekten yapamaz — metinden metne dönüşüm için tasarlandı, keyfi ikili için değil.
Örtüşme: ikisine ne zaman ihtiyacınız olur
Her iki kodlamanın aynı anda devreye girdiği belirli bir senaryo var: ikili veriyi bir URL’ye koymak.
Diyelim ki küçük bir görüntünüz (20 baytlık PNG) var ve onu bir URL parametresi olarak gömmek istiyorsunuz:
- Görüntüyü Base64 kodlayın → 28 karakterlik dize elde edersiniz
- Base64 dizesini URL-kodlayın →
+,/ve=karakterleri%2B,%2F,%3Dolur
Sonuç URL biraz daha uzun ama artık herhangi bir URL’de kullanmak güvenli.
Bu kombinasyon o kadar yaygın ki, URL-güvenli Base64 adlı bir varyant var. + ve / yerine - ve _ kullanır, genellikle = dolgusunu atar:
- Standart Base64:
a+b/c= - URL-güvenli Base64:
a-b_c
JWT’ler (JSON Web Tokens) URL-güvenli Base64 kullanır — bu yüzden eyJhbGciOiJIUzI1NiJ9 gibi dizelerde + veya / görmezsiniz.
Yan yana örnek
Girdi: Hello, world! metni (13 bayt)
URL kodlama (metni metin olarak ele alır, virgülü, boşluğu ve !’i kaçırır):
Hello%2C%20world%21
Uzunluk: 19 karakter. Hâlâ okunabilir.
Base64 kodlama (13 baytı metne dönüştürür):
SGVsbG8sIHdvcmxkIQ==
Uzunluk: 20 karakter. Okunabilir değil.
URL-güvenli Base64 (kaçırma gerektiren karakterler olmadan Base64):
SGVsbG8sIHdvcmxkIQ
Uzunluk: 18 karakter. JWT’lerde ve kompakt kimliklerde kullanılır.
URL kodlama ne zaman kullanılır
Şu durumlarda URL kodlama doğru araç:
- Kullanıcı girişini URL yoluna veya sorgu dizesine gömmek. Arama kutusuna yazılan her şey URL’e gitmeden önce URL kodlama gerektirir.
- Form gönderilerinde özel karakterleri kaçırmak. HTML formları varsayılan olarak URL-kodlanmış biçimde gönderir.
- Özel karakterler içeren REST API URL’leri oluşturmak — kullanıcı adları, dosya yolları, kimlikler.
İkili veri ve dosyalar için URL kodlama kullanmayın — ASCII’nin ötesindeki baytları düzgün işleyemez. Önce Base64 gerekir.
Base64 ne zaman kullanılır
Şu durumlarda Base64 doğru araç:
- İkili veriyi yalnızca metin kanalı üzerinden (JSON, e-posta, XML) iletmek
- Data URI’leri aracılığıyla küçük dosyaları HTML veya CSS’e gömmek
- Belirteçler, sertifikalar, kriptografik verilerle çalışmak
- Kopyala-yapıştır yoluyla ikili dosya paylaşmak
Veri zaten metin ve sadece URL için özel karakterleri kaçırmanız gerekiyorsa — URL kodlama yeterlidir, Base64’e gerek yok. İkili-güvenli bir kanal varsa, baytları doğrudan gönderin; %33 şişirmeye gerek yok.
Yaygın karışıklıklar
”Bir dizeyi URL’e koymak için Base64 kodladım, hâlâ bozuk”
Base64 çıktısı +, / ve = içerir — URL’lerde özel anlamları var. Ya Base64 dizesini URL-kodlamanız ya da doğrudan URL-güvenli Base64 varyantını (- ve _ kullanan) kullanmanız gerekir.
”Bir dosyayı URL-kodladım ama bozuk çıktı”
URL kodlama girdiyi metin olarak ele alır, bu yüzden ASCII olmayan baytlar tutarsız işlenir. İkili dosyalar için önce Base64 gerekir, sonra gerekirse sonucu URL-kodlayın.
”API, Basic Auth için şifreyi Base64 kodlamayı söylüyor”
HTTP Basic Authentication username:password alır, tüm diziyi Base64 kodlar ve Authorization başlığına koyar. Bu, Base64 güvenli olduğu için değildir — değildir. Başlığın özel karakterlerle ham metni bozabilecek sistemler üzerinden iletimden sağ çıkması gerektiği için. Güvenlik HTTPS’den gelir, Base64’ten değil.
Pratik iş akışı
Base64 aracımız kodlama ve kod çözmeyi temiz şekilde halleder — metin yapıştırın ya da dosya bırakın, Base64 çıktısı alın; ya da Base64 yapıştırın, metin olarak çözün.
URL kodlama için her dilde tek satır yeterli:
- JavaScript:
encodeURIComponent(str)/decodeURIComponent(str) - Python:
urllib.parse.quote(str)/urllib.parse.unquote(str) - PHP:
urlencode($str)/urldecode($str) - Ruby:
CGI.escape(str)/CGI.unescape(str)
Bir URL içinde ikili veriye ihtiyacınız olduğunda standart desen: önce Base64, sonra gerekirse URL-kodlayın — ya da doğrudan URL-güvenli Base64 kullanın.
Temel ayrımı içselleştirdiğinizde — “URL kodlama metinden URL’ye, Base64 baytlardan metne” — karışıklık çözülür. Base64 aracı ihtiyaç duyduğunuzda tarayıcınızda yerel olarak çalışıyor; hassas belirteçler bile cihazınızdan ayrılmıyor.