Base64 URL Güvenli Kodlama: Nedir ve Neden Önemlidir
Base64 URL Güvenli Kodlama Nedir?
Base64 URL güvenli kodlama (Base64url olarak da adlandırılır), URL'lerde ve dosya adlarında özel anlamları olan karakterleri güvenli alternatiflerle değiştiren standart Base64'ün bir varyantıdır. Standart Base64, 64 karakterlik alfabesinin bir parçası olarak + ve / ile dolgu için = kullanır ve bu üçü de URL'lerde, sorgu dizelerinde ve dosya yollarında sorunludur.
Base64url bunu iki basit ikame ile çözer:
| Standart Base64 | URL Güvenli Base64 |
|-----------------|-------------------|
| + (artı) | - (eksi) |
| / (eğik çizgi) | _ (alt çizgi) |
| = (dolgu) | atlanır (genellikle) |
Standart Base64 URL'leri Neden Bozar
+ veya / içeren Base64 ile kodlanmış bir dize bir URL'de göründüğünde, tarayıcı ve sunucu davranışı tahmin edilemez hale gelir.
+ Sorunu
URL sorgu dizelerinde, + karakteri boşluk olarak yorumlanır. Bu davranış application/x-www-form-urlencoded belirtiminden gelir ve çözülen verilerde beklenmeyen boşluklara neden olur.
Örneğin, Pj4+Pz8/Pw== gibi bir Base64 dizesi + karakterleri içerir. Bu bir URL parametresinde ?token=Pj4+Pz8/Pw== olarak görünürse, sunucu ?token=Pj4 Pz8/Pw== olarak görecektir — + boşluğa dönüşür.
/ Sorunu
URL yollarında, / karakteri bir yol ayırıcıdır. ab/CD+Ef== gibi bir Base64 dizesi, bir dizin seviyesi olarak yorumlanacak bir / içerir. Bu bir URL segmentinde görünürse, hem istemci hem de sunucu yapıyı yanlış yorumlayabilir.
= Sorunu
= karakteri, sorgu dizelerinde anahtar-değer çiftleri için kullanılır. ?data=SGVsbG8= içindeki sondaki = belirsiz olabilir — = Base64 dolgusunun mu yoksa sorgu parametresi sözdiziminin mi bir parçası?
Yüzde kodlaması bu sorunları çözebilse de (+ %2B olur, / %2F olur), dize uzunluğunu şişirir ve hata ayıklamayı zorlaştırır. Base64url daha temiz bir çözümdür.
Base64url Nasıl Çalışır
Base64url, RFC 4648 Bölüm 5'te resmi olarak tanımlanmıştır. Standart Base64 ile tamamen aynı algoritmayı kullanır — 3 bayt 4 karakter olur — ancak alfabenin 62 ve 63 numaralı pozisyonlarında bir karakterlik ikame ile:
- Alfabe indeksi 62:
+→-(eksi) - Alfabe indeksi 63:
/→_(alt çizgi)
Dolgu (=) genellikle kaldırılır, çünkü kod çözme sırasında dize uzunluğundan çıkarılabilir. Bir Base64url dizesi, ek kaçış karakterleri olmadan her zaman geçerli bir URL bileşenidir.
Öncesi ve Sonrası
Aynı ikili verinin her iki formatta nasıl göründüğü:
Standard: Pj4+Pz8/Pw==
URL-safe: Pj4-Pz8_Pw
Base64url Nerelerde Kullanılır
JSON Web Token'lar (JWT)
JWT, Base64url'nin en belirgin kullanıcısıdır. Her JWT üç bölümden oluşur — başlık, yük ve imza — her biri URL güvenli Base64 ile kodlanmış ve noktalarla ayrılmıştır:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0
Tire ve alt çizgilere dikkat edin — artı işareti veya eğik çizgi yok. Eğer JWT standart Base64 kullansaydı, token'lar web uygulamalarında en yaygın kullanım şekli olan URL parametreleri olarak geçirildiğinde bozulurdu.
OAuth ve OpenID Connect
Hem OAuth 2.0 hem de OpenID Connect, erişim token'ları ve ID token'ları için JWT'ye dayanır, bu da Base64url kodlamasını modern kimlik doğrulamanın temeli haline getirir. Yetkilendirme kodu akışı, implicit akış ve client credentials akışının tümü Base64url kullanan token'lar iletir.
Web API'leri ve Sorgu Parametreleri
Birçok REST ve GraphQL API'si, sayfalama imleçleri, filtreler veya kodlanmış yükler için sorgu parametrelerinde Base64 ile kodlanmış verileri kabul eder. Base64url, bu parametrelerin ek URL kodlaması olmadan doğru çalışmasını sağlar.
Gerçek dünya örneği — API imleç sayfalama:
GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo
GitHub'ın API'si, büyük sonuç kümelerini sayfalamak için tam olarak bu kalıbı kullanır.
Dosya Adları ve Dosya Depolama
Base64url dizeleri, yol ayırıcı (/), dosya sistemlerini karıştıran özel karakterler veya Windows'ta geçersiz karakterler (:, *, ? vb.) içermediği için güvenli dosya adları oluşturur.
İçerik Dağıtım Ağları ve Önbellek Anahtarları
CDN'ler ve önbellekleme katmanları genellikle önbellek anahtarları olarak Base64url ile kodlanmış değerler kullanır. / içeren standart Base64, önbellek ad alanında sahte dizin hiyerarşileri oluşturarak belirsiz anahtarlara yol açar.
Standart Base64 ve Base64url Arasında Dönüşüm
İki varyant arasında dönüşüm her dilde basittir:
JavaScript
// Standard Base64 to URL-safe Base64
function base64ToBase64url(base64) {
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
// URL-safe Base64 to Standard Base64
function base64urlToBase64(base64url) {
let result = base64url.replace(/-/g, '+').replace(/_/g, '/');
// Restore padding
while (result.length % 4) {
result += '=';
}
return result;
}
Node.js
Node.js, 15.7.0 sürümünden itibaren yerel Base64url desteği sağlar:
// Encode to Base64url
const encodedUrl = Buffer.from('Hello, world!').toString('base64url');
console.log(encodedUrl);
// Output: SGVsbG8sIHdvcmxkIQ
// Decode from Base64url
const decoded = Buffer.from(encodedUrl, 'base64url').toString('utf-8');
console.log(decoded);
// Output: Hello, world!
Python
import base64
# Encode to Base64url
encoded = base64.urlsafe_b64encode(b"Hello, world!")
print(encoded.decode())
# Output: SGVsbG8sIHdvcmxkIQ==
# Decode from Base64url
decoded = base64.urlsafe_b64decode(encoded)
print(decoded.decode())
# Output: Hello, world!
Ne Zaman Standart Base64 vs Base64url Kullanılmalı
Standart Base64 Kullanın:
- E-posta eklerini kodlama (MIME standardı gerektirir)
- HTML/CSS gömme için veri URL'leri oluşturma
- URL güvenliğinin önemsiz olduğu veritabanlarında veri depolama
- Standart Base64 bekleyen eski sistemlerle etkileşim
Base64url Kullanın:
- JWT token'ları oluşturma veya ayrıştırma
- URL sorgu parametrelerinde veya yol segmentlerinde kodlanmış veri iletme
- İkili verilerden dosya adları oluşturma
- Önbellek anahtarları veya tanımlayıcılar oluşturma
- OAuth token'ları veya OpenID Connect ile çalışma
Base64 URL Güvenli Kodlamayı Çevrimiçi Deneyin
Standart Base64 ve URL güvenli Base64 formatları arasında dönüşüm yapmak için ücretsiz çevrimiçi Base64 kodlayıcı ve kod çözücümüzü kullanın. Verilerinizi yapıştırın, varyantınızı seçin ve sonucu anında alın.