Base64URL ve standart Base64 karşılaştırması: alfabe, dolgu ve URL ayrıştırma

URL sorgu parametrelerinde tire ve alt çizgiyi tanıyın, isteğe bağlı doldurmayı anlayın ve artıdan boşluğa bozulmayı önleyin.

Base64URL iki alfabe karakterini değiştirir: standart Base64'nin artısı kısa çizgiye, eğik çizgi ise alt çizgiye dönüşür. Kodlanmış bilgi değişmez. Değişken, çevreleyen protokolün artı veya eğik çizgiye özel bir anlam vermesi durumunda yardımcı olur, ancak değeri her URL veya uygulama kuralından muaf tutmaz.

Farkı ortaya çıkaran bir vektör kullanın

FB FF baytları şu şekilde kodlanır: +/8= Base64 standardında ve -_8= Base64URL içinde. Merhaba gibi bir test yalnızca paylaşılan alfabe karakterleri üretir, dolayısıyla URL-güvenli dönüşümün çalışıp çalışmadığını ortaya çıkaramaz.

const standard = btoa(String.fromCharCode(251, 255));
const urlSafe = standard.replace(/\+/g, '-').replace(/\//g, '_');
console.log(standard); // +/8=
console.log(urlSafe); // -_8=

Dolgu ayrı bir anlaşmadır

Birçok belirteç biçimi sondaki eşittir işaretlerini kaldırırken bazı sistemler bunları korur. Alfabeyi değiştirmek ve dolguyu kaldırmak birbirinden bağımsız seçimlerdir. Dolgusuz girişin uzunluğu 4’e bölündüğünde kalan 2 ise iki eşittir işareti eklenmelidir; kalan 3 ise bir işaret eklenmelidir. Kalan 1 olduğunda yalnızca dolgu eklemek girişi düzeltemez; çünkü altı bitlik tek bir karakter, tam bir baytı temsil etmeye yetmez.

Doğrulama sırasında son karakterdeki kullanılmayan bitleri de kontrol edin. Bunları göz ardı eden bir kod çözücü, aynı bayt dizisi için birden fazla dizeyi kabul edebilir. Bu belirsizlik, bir uygulamanın kodu çözülmüş baytlar yerine kodlanmış dizeleri karşılaştırdığında önemli olabilir. Kanonik bir üreticinin üzerinde anlaşmaya varılan bir temsili yayınlaması gerekir.

Sorgu ayrıştırmayı Base64 kod çözmeyle karıştırmayın

Form stili sorgu ayrıştırma, gerçek bir artıyı boşluk olarak yorumlar. Bu nedenle, bir sorguya çıkış yapılmadan yapıştırılan standart bir Base64 değeri, kod çözücü onu görmeden önce bozulabilir. Sorguyu şununla oluşturun: URLSearchParamsveya alıcı protokol bunu belirtiyorsa Base64URL değişkenini kullanın.

const query = new URLSearchParams({ payload: '+/8=' });
console.log(query.toString()); // payload=%2B%2F8%3D
console.log(query.get('payload')); // +/8=

Her alanı otomatik olarak artı ile değiştirmeyin: bir alan orijinal biçimlendirme veya başka bir hatanın kanıtı olabilir. Kaynağı koruyun, onu değiştiren aktarım katmanını tanımlayın ve kasıtlı bir düzeltme uygulayın. JWT segmentleri için, genel bir onarım politikası oluşturmak yerine belirteç formatının Base64URL kurallarını kullanın.

Standart ve URL-güvenli alfabeler şurada açıklanmıştır: RFC 4648. Entegrasyonunuzda dolgu, boşluk kabulü ve maksimum uzunluk için hâlâ açık seçimlere ihtiyaç vardır.