Ana içeriğe geç

Base64 Encoding Nedir? Nasıl Çalışır?

Base64 Encoding Nedir - Nasıl Çalışır - SeoDenetim

Bir API'den dönen yanıtta garip görünümlü uzun bir karakter dizisi gördüyseniz, büyük ihtimalle Base64 ile karşılaşmışsınızdır. SGVsbG8gV29ybGQ= gibi bir şey. Ne olduğu belli değil, ama şifreli de değil. Tam olarak ne işe yarıyor?

Base64, binary (ikili) verileri ASCII metin formatına dönüştüren bir encoding yöntemidir. 1987'de RFC 989 ile tanımlandı, güncel standardı RFC 4648. Adındaki "64" rakamı kullandığı karakter sayısından gelir: A-Z, a-z, 0-9, + ve / — toplam 64 karakter. Şifreleme ile karıştırılması çok yaygın bir hata. Encoding geri dönüşümlüdür, herkes decode edebilir. Şifreleme ise bir anahtar gerektirir.

Binary veriyi neden metne çevirmek gerekir?

Bilgisayarlar binary ile çalışır — 0 ve 1. Bir resim dosyası, bir PDF, bir müzik dosyası hep binary veridir. Sorun şu: bazı sistemler sadece metin tabanlı veri taşıyabilir.

Email protokolü (SMTP) bunun en bilinen örneği. 1980'lerde tasarlandığında sadece 7-bit ASCII karakterleri destekliyordu. Bir fotoğrafı email ile göndermek istediğinizde, o fotoğrafın binary verisini metin formatına çevirmeniz gerekiyordu. Base64 tam olarak bu ihtiyaç için geliştirildi.

Günümüzde durum değişti ama temel sorun aynı kaldı. JSON formatı binary veri taşıyamaz. URL'ler belirli karakterleri kabul etmez. HTML içine doğrudan binary veri gömemezsiniz. Tüm bu senaryolarda Base64 devreye girer.

3 byte nasıl 4 karaktere dönüşür?

Base64'ün çalışma mantığı aslında basit bir matematik işlemidir.

Girdi olarak 3 byte (24 bit) alınır ve 6'şar bitlik 4 gruba bölünür. Her grup 0-63 arasında bir sayıya karşılık gelir — bu sayı da Base64 alfabesindeki bir karakterle eşleştirilir.

Somut bir örnekle görelim. "Merhaba" kelimesinin ilk 3 harfi "Mer":

M = 77  → 01001101
e = 101 → 01100101
r = 114 → 01110010

Birleşik: 010011 010110 010101 110010

Decimal:  19     22     21     50
Base64:   T      W      V      y

"Mer" metni Base64'te "TWVy" olur. 3 karakter girdi, 4 karakter çıktı. Bu dönüşüm oranı sabittir ve Base64'ün boyut artışının temel nedenidir — her zaman yaklaşık %33 daha büyük çıktı üretir.

Padding nedir?

Girdi her zaman 3'ün katı olmayabilir. "Hi" kelimesi sadece 2 byte. Bu durumda eksik byte'lar sıfırla tamamlanır ve çıktının sonuna = karakteri eklenir. Tek byte eksikse bir =, iki byte eksikse iki = eklenir.

"Hi"     → SGk=      (2 byte girdi, 1 padding)
"H"      → SA==      (1 byte girdi, 2 padding)
"Mer"    → TWVy      (3 byte girdi, padding yok)

Padding, decode işleminde orijinal verinin uzunluğunu doğru hesaplamak için gereklidir. URL-Safe Base64 varyantında padding kaldırılır çünkü = karakteri URL'lerde sorun çıkarır.

Nerelerde kullanılır?

Kullanım alanı düşünüldüğünden geniş. Birkaç yaygın senaryo:

Data URI ile HTML/CSS'e görsel gömme

Küçük ikonları ve logoları doğrudan HTML veya CSS içine gömmek mümkün. data:image/png;base64,iVBOR... formatında bir string, tarayıcının ayrı bir HTTP isteği yapmasını engeller. 1-2 KB'lık ikonlar için mantıklı bir yaklaşım — her ikon için ayrı sunucu isteği yapmak yerine tek seferde yüklenir.

Ancak dikkat edilmesi gereken bir nokta var. Base64 çıktısı orijinalden %33 büyük olduğu için, büyük görsellerde bu yöntem ters teper. 50 KB'lık bir resim Base64'e çevrildiğinde yaklaşık 67 KB olur. Üstelik tarayıcı bu veriyi cache'leyemez. Genel kural: 5 KB'ın altındaki dosyalar için Data URI, üstündekiler için normal dosya referansı kullanılmalı.

Email ekleri (MIME)

Email ile gönderdiğiniz her ek — PDF, resim, ZIP dosyası — arka planda Base64'e dönüştürülür. MIME (Multipurpose Internet Mail Extensions) standardı bunu zorunlu kılar. Email istemciniz eki otomatik olarak encode eder, alıcının istemcisi de otomatik decode eder. Kullanıcı bu sürecin farkında bile olmaz.

API'lerde binary veri taşıma

REST API'ler genellikle JSON formatında veri taşır. JSON'da binary veri için doğal bir tip yok. Profil fotoğrafı yükleme, dosya paylaşımı, dijital imza gibi işlemlerde binary veri Base64'e çevrilip JSON içinde taşınır.

{
  "kullanici": "ahmet",
  "avatar": "iVBORw0KGgoAAAANSUhEUgAA...",
  "dosya_tipi": "image/png"
}

Alternatif olarak multipart/form-data kullanılabilir ama Base64 yaklaşımı tek bir JSON nesnesi içinde her şeyi taşıma kolaylığı sağlar. Büyük dosyalarda boyut artışı nedeniyle multipart tercih edilir.

JWT token yapısı

Web uygulamalarında kimlik doğrulama için kullanılan JWT (JSON Web Token) üç parçadan oluşur: header, payload ve signature. İlk iki parça Base64URL ile encode edilir. Base64URL, standart Base64'ün URL-güvenli versiyonudur — + yerine -, / yerine _ kullanılır ve padding kaldırılır.

Bir JWT token'ının header kısmını decode ettiğinizde şöyle bir JSON görürsünüz:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Decode →
{"alg":"HS256","typ":"JWT"}

Token'daki veri Base64 ile encode edilmiş, şifrelenmemiş. Herkes okuyabilir. Güvenlik, üçüncü parça olan signature ile sağlanır.

Base64 şifreleme midir?

Hayır. Bu en sık yapılan yanlış anlamadır ve güvenlik açıklarına yol açabilir.

Encoding, veriyi farklı bir formata dönüştürür — herhangi bir anahtar gerekmez. Herkes encode edebilir, herkes decode edebilir. Amaç veriyi gizlemek değil, farklı sistemler arasında taşınabilir hale getirmektir.

Şifreleme (encryption) ise bambaşka bir mekanizma. Bir anahtar ile veriyi okunamaz hale getirir ve anahtarı olmayan kişi veriyi çözemez. AES, RSA gibi algoritmalar gerçek şifreleme sağlar.

Özellik Base64 (Encoding) AES (Şifreleme)
Anahtar gerekli mi? Hayır Evet
Herkes çözebilir mi? Evet Hayır
Amaç Format dönüşümü Veri gizleme
Güvenlik sağlar mı? Hayır Evet

Şifre, API anahtarı veya kişisel veri gibi hassas bilgileri Base64 ile "gizlemeye" çalışmak tehlikelidir. Tarayıcının geliştirici araçlarında veya herhangi bir online decode aracında saniyeler içinde okunabilir.

Tarayıcıda Base64 işlemleri

JavaScript'te Base64 işlemleri için iki yerleşik fonksiyon var: btoa() encode, atob() decode yapar.

// Encode
btoa("Merhaba")  // "TWVyaGFiYQ=="

// Decode
atob("TWVyaGFiYQ==")  // "Merhaba"

Basit görünür ama bir tuzak var. btoa() sadece Latin-1 karakter setini destekler. Türkçe karakterler (ş, ç, ğ, ı, ö, ü) veya emoji gibi Unicode karakterlerde hata verir. Çözüm, önce encodeURIComponent() ile UTF-8'e dönüştürmektir:

// Türkçe karakter desteği
const encoded = btoa(unescape(encodeURIComponent("Türkçe şğüöçı")));
const decoded = decodeURIComponent(escape(atob(encoded)));

Node.js tarafında ise Buffer sınıfı kullanılır:

// Node.js
Buffer.from("Merhaba").toString("base64")     // Encode
Buffer.from("TWVyaGFiYQ==", "base64").toString()  // Decode

Dosya bazlı dönüşümlerde FileReader API'si devreye girer. readAsDataURL() metodu bir dosyayı okuyup Base64 formatında Data URI olarak döndürür. Drag & drop ile dosya yükleyip anında Base64 çıktısı almak bu yöntemle mümkün. Metin ve dosya dönüşümlerini hızlıca test edebilirsiniz.

URL-Safe Base64 nedir?

Standart Base64 alfabesinde + ve / karakterleri var. Bu karakterler URL'lerde özel anlam taşır — + boşluk olarak, / path ayırıcı olarak yorumlanır. URL parametrelerinde Base64 verisi taşımak istediğinizde bu durum sorun yaratır.

URL-Safe Base64 (Base64URL) bu sorunu çözer:

  • + yerine - (minus)
  • / yerine _ (underscore)
  • = padding kaldırılır

JWT token'ları, OAuth parametreleri ve URL query string'lerinde Base64URL kullanılır. Standart Base64 ile arasındaki fark sadece bu üç karakter değişikliğidir — dönüşüm mantığı aynıdır.

Boyut etkisi ve performans

Her 3 byte girdi 4 karakter çıktı üretir. Bu %33'lük sabit bir artış demek. 1 MB'lık bir dosya Base64'e çevrildiğinde yaklaşık 1.33 MB olur. Küçük veriler için önemsiz gibi görünür ama ölçek büyüdüğünde fark hissedilir.

API yanıtlarında Base64 ile taşınan büyük dosyalar hem bant genişliğini hem sunucu belleğini tüketir. 10 MB'lık bir dosyayı Base64 olarak JSON içinde taşımak, 13.3 MB'lık bir yanıt demek. Üstelik bu veri JSON parser tarafından string olarak bellekte tutulur — gerçek bellek kullanımı daha da yüksek olabilir.

Performans açısından dikkat edilmesi gerekenler:

  • 5 KB altındaki dosyalar için Data URI mantıklı (HTTP istek tasarrufu)
  • Büyük dosyalarda multipart/form-data veya doğrudan binary transfer tercih edilmeli
  • API yanıtlarında GZIP sıkıştırma Base64'ün boyut artışını kısmen telafi eder
  • Tarayıcıda büyük Base64 string'leri DOM'a eklemek render performansını düşürür

Veri boyutunu ve dönüşüm sonucunu görmek için metninizi veya dosyanızı doğrudan dönüştürebilirsiniz. Karakter sayısı ve boyut bilgisi anlık olarak hesaplanır.

Base64, web geliştirmenin sessiz ama vazgeçilmez bir parçası. Email ekleri, API iletişimi, JWT token'ları, Data URI — farkında olmasanız bile günlük olarak onlarca Base64 işlemi gerçekleşir. Çalışma mantığı basit, kullanım alanı geniş. Tek hatırlanması gereken şey: encoding bir güvenlik mekanizması değildir. Veriyi taşınabilir hale getirir, gizlemez. Hassas veriler için her zaman gerçek şifreleme algoritmaları kullanılmalıdır.

JSON verilerinizi API'ye göndermeden önce doğrulamak da iyi bir alışkanlık — özellikle Base64 ile birlikte kullanıldığında format hataları sık karşılaşılan bir sorun.