Comparison
Base64 vs base64url: fark yaratan iki karakter
Aynı alfabe, farklı son iki karakter, farklı dolgu. Tek satır fark, tamamen farklı kullanım senaryoları.
By Buğra SözeriPublished
Özet. Base64 ve base64url, RFC 4648'de tanımlanan üç detay dışında aynı kodlamadır: + yerine -, / yerine _ ve dolgu = kaldırılmış. Kodlanmış değer bir URL, JWT veya imzalı çerezde geçiyorsa base64url kullanın; e-posta ekleri, HTTP Basic Auth ve data URI'leri için standart Base64 kullanın.
Her ikisi de RFC 4648'de tanımlanmıştır. StandartBase64 (§4) ve base64url(§5) tam olarak üç detayda farklılaşır: iki alfabe değişikliği ve dolgunun işlenmesi. Hepsi bu kadar. Ancak birbirinin yerine kullanmak JWT'leri, imzalı çerezleri ve URL üzerinden aktarılan her şeyi bozar.
Fark
| Özellik | Standart Base64 | Base64url |
|---|---|---|
| 62. karakter | + | - |
| 63. karakter | / | _ |
| Dolgu | 4'ün katına = | Genellikle yok |
| URL güvenli mi? | Hayır (+, /, = yüzde-kodlama gerektirir) | Evet |
| Tanımlandığı RFC | RFC 4648 §4 | RFC 4648 §5 |
Aynı giriş, iki kodlama
https://example.com/?q=hello world kodlanıyor:
- Standart:
aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT1oZWxsbyB3b3JsZA== - Base64url:
aHR0cHM6Ly9leGFtcGxlLmNvbS8_cT1oZWxsbyB3b3JsZA
Standart formdaki / base64url'de _'ye dönüşmüş, sondaki == ise kaldırılmıştır.
URL'lerin neden kendi varyantına ihtiyacı var?
Standart Base64 alfabesi + ve /içerir. Her ikisi de URL sözdiziminde ayrılmış karakterlerdir:
/yol ayırıcısıdır.+, form kodlu sorgu dizelerinde geleneksel olarak boşluk anlamına gelir.=sorgu dizelerinde anahtar-değer ayırıcısıdır.
Standart Base64 dizesini URL'e gömmek üç karakterin de yüzde-kodlanmasını gerektirir: + → %2B,/ → %2F, = → %3D. Dize uzar ve okunaksız hale gelir. Base64url, zaten URL güvenli karakterleri seçerek yüzde-kodlamayı önler.
Base64url'de dolgu neden isteğe bağlı?
Standart Base64, çıktıyı her zaman = kullanarak 4'ün katına tamamlar. Bu matematiksel olarak zorunlu değildir — çözücü, çıktı uzunluğunun 4'e göre kalanından orijinal uzunluğu çıkarabilir. Dolgu, ardışık parçalar arasındaki sınırı bilmesi gereken akış çözücüleri için vardır.
Base64url dolguyu atlar çünkü: (a) gereksizdir, (b)= URL'lerde yüzde-kodlama gerektirir ve (c) URL'lerdeki sondaki eşittir işaretleri bazen yol ayrıştırıcılarını, CDN'leri ve önbellek anahtarlarını karıştırır.
Her biri nerede kullanılır?
| Kullanım alanı | Varyant |
|---|---|
| E-posta (MIME) ekleri | Standart Base64 |
HTTP Basic Auth (Authorization: Basic …) | Standart Base64 |
Data URI'leri (data:image/png;base64,…) | Standart Base64 |
| JWT (üç segment) | Base64url, dolgu yok |
| OAuth 2.0 PKCE kod doğrulayıcı/zorluğu | Base64url, dolgu yok |
| WebPush mesaj anahtarları, JOSE/JWS/JWE | Base64url, dolgu yok |
| İmzalı çerezler (Rails, Django vb.) | Base64url, dolgu yok |
Çözme tuzağı
Pek çok kütüphanenin varsayılan Base64 çözücüsü base64url girişinde başarısız olur. Python’un base64.b64decode'u- ve _'yi reddeder; Node.js’unBuffer.from(s, "base64")'ü toleranslıdır ama tersi (.toString("base64")) standart Base64 çıktı verir.
Diller arası geçici çözüm: çözmeden önce değiştirin.
// base64url → standart Base64
const standard = base64url
.replace(/-/g, "+")
.replace(/_/g, "/")
.padEnd(Math.ceil(base64url.length / 4) * 4, "=");Daha iyisi: base64url'yi açıkça destekleyen bir kütüphane kullanın (Node 16+ Buffer.from(s, "base64url"); Python base64.urlsafe_b64decode).
Pratik kural
Kodlanmış değer URL'de, JWT'de, imzalı çerezde veya yol segmenti olarak yer alacaksa base64url kullanın. E-posta eki, HTTP başlığı (çerezler dışında) veya JSON data URI'si için standart Base64 kullanın.
Base64 kodlayıcımız her iki varyantı da alfabe geçişli olarak destekler. JWT çözücümüz standart zorunlu kıldığı için base64url varsayar.
Sayısal gerçekler
- Kodlanmış uzunluk: her iki varyant da ikili veriyi tam 4/3 oranında genişletir (
ceil(n/3)*4). 100 giriş baytı → standart Base64'te 136, base64url'de dolgu olmadan 134 karakter. - Dolgu ek yükü: standart Base64 kodlanmış dize başına 0, 1 veya 2
=ekler — kısa yükler için en fazla %1,5 boyut cezası, uzunlar için ihmal edilebilir. - URL'lerde yüzde-kodlama maliyeti: standart Base64'teki her
+ / =, URL kodlamasında 3 bayta (%2B %2F %3D) genişler. 512 karakterlik bir JWT için tipik olarak 30-60 israf bayt — base64url tamamen önler. - Alfabe boyutu: her ikisinde de 64 karakter, dolayısıyla her çıktı karakteri tam 6 bit giriş taşır.
- JWT segment boyutları (RFC 7519): tipik başlık 40-50 karakter, yük 100-400 karakter, HS256 imzası 43 karakter (tam 32 bayt / 6 = 43 base64url karakteri, dolgu olmadan).
- Verim: Node 20
Buffer.from(s, "base64")~2 GB/s çözer; Pythonbase64.b64decode2024 dizüstü bilgisayarda ~600 MB/s.
Karar matrisi
| Değerin bulunduğu yer | Tercih |
|---|---|
| URL yolu veya sorgu dizesi | base64url, dolgu yok |
| JWT (başlık / yük / imza) | base64url, dolgu yok (RFC 7519) |
| OAuth 2.0 PKCE doğrulayıcısı | base64url, dolgu yok (RFC 7636 §4.1) |
| İmzalı çerez (Rails / Django / Express) | base64url, dolgu yok |
HTML/CSS'de data: URI'si | Dolgulu standart Base64 |
| MIME e-posta eki | Dolgulu standart Base64, 76 karakterlik satır sonu (RFC 2045) |
| HTTP Basic Auth başlığı | Standart Base64 (RFC 7617) |
| WebPush abonelik anahtarları | base64url, dolgu yok (RFC 8291) |
Kaynaklar
- RFC 4648 — The Base16, Base32, and Base64 Data Encodings — rfc-editor.org/rfc/rfc4648 (§4 standart, §5 URL güvenli).
- RFC 7519 — JSON Web Token (JWT), base64url dolgu olmadan kullanımı zorunlu kılar — rfc-editor.org/rfc/rfc7519.
- RFC 7636 — OAuth 2.0 PKCE, §4.1 SHA-256 base64url kodlu zorluğu belirtir — rfc-editor.org/rfc/rfc7636.
Frequently asked questions
- Base64url'yi standart bir Base64 çözücüyle çözebilir miyim?
- Bazen — Node'un Buffer.from'u toleranslıdır, Python'un b64decode'u değildir. Diller arası güvenli yaklaşım: çözmeden önce '-' yerine '+', '_' yerine '/' koyun ve '=' ile 4'ün katına tamamlayın. Modern çalışma ortamları bunu doğrudan ele alan açık base64url çözücüler sunar (Node 16+, Python'un urlsafe_b64decode'u).
- Base64url neden dolgu işaretini kaldırır?
- Üç neden: matematiksel olarak gereksizdir (çözücüler uzunluğu çıktı uzunluğunun 4'e göre kalanından çıkarabilir), '=' karakteri URL'lerde yüzde-kodlama gerektirir ve sondaki '=' bazı yol ayrıştırıcılarını, CDN'leri ve önbellek anahtarlarını karıştırır.
- JWT segmentleri her zaman base64url mi?
- Evet. RFC 7519, tüm üç JWT segmenti (başlık, yük, imza) için dolgu içermeyen base64url kullanımını zorunlu kılar. JWT'yi standart Base64 ile kodlamak, herhangi bir uyumlu kütüphanede doğrulanamayan bir token üretir.
- Base64url, standart Base64'e kıyasla bayt tasarrufu sağlar mı?
- Marjinal düzeyde — aynı alfabe boyutu dolgudan önce aynı kodlanmış uzunluk anlamına gelir. Dolgunun kaldırılması kodlama başına 0-2 bayt tasarruf eder. Asıl tasarruf yüzde-kodlamayı önlemekten gelir (her %XX, 1 yerine 3 bayttır); URL'deki her Base64 dizesi için 6-9 bayt tasarruf edilebilir.
Related
Published May 16, 2026