Base64URL modifie deux caractères alphabétiques : le plus standard de Base64 devient un tiret et la barre oblique devient un trait de soulignement. Les informations codées restent inchangées. La variante est utile lorsque le protocole environnant donne une signification particulière au plus ou à la barre oblique, mais elle n'exempte pas la valeur de chaque URL ou règle d'application.
Utilisez un vecteur qui expose la différence
Les octets FB FF codent comme +/8= dans la norme Base64 et -_8= dans Base64URL. Un test tel que Hello produit uniquement des caractères alphabétiques partagés. Il ne peut donc pas révéler si la conversion sécurisée URL fonctionne.
const standard = btoa(String.fromCharCode(251, 255));
const urlSafe = standard.replace(/\+/g, '-').replace(/\//g, '_');
console.log(standard); // +/8=
console.log(urlSafe); // -_8=
Le rembourrage est un accord distinct
De nombreux formats de jetons omettent les signes égal à la fin, tandis que d’autres systèmes les conservent. Changer l’alphabet et supprimer le remplissage sont deux choix distincts. Pour une entrée sans remplissage, si la division de sa longueur par quatre donne un reste de 2, il faut ajouter deux signes égal ; si le reste vaut 3, il en faut un. Un reste de 1 ne peut pas être corrigé par le seul remplissage, car un caractère de six bits ne suffit pas à représenter un octet complet.
Lors de la validation, vérifiez également les bits inutilisés dans le dernier caractère. Un décodeur qui les ignore peut accepter plusieurs chaînes pour la même séquence d'octets. Cette ambiguïté peut avoir son importance lorsqu'une application compare des chaînes codées au lieu d'octets décodés. Un producteur canonique doit émettre une représentation convenue.
Ne confondez pas l'analyse des requêtes avec le décodage Base64
L'analyse des requêtes de type formulaire interprète un plus littéral comme un espace. Une valeur standard Base64 collée sans échappement dans une requête peut donc être corrompue avant que le décodeur ne la voie. Construisez la requête avec URLSearchParams, ou utilisez la variante Base64URL si le protocole de réception le spécifie.
const query = new URLSearchParams({ payload: '+/8=' });
console.log(query.toString()); // payload=%2B%2F8%3D
console.log(query.get('payload')); // +/8=
Ne remplacez pas automatiquement chaque espace par un plus : un espace peut être un véritable formatage ou la preuve d'une autre erreur. Préservez la source, identifiez la couche de transport qui l'a modifiée et appliquez une correction délibérée. Pour les segments JWT, utilisez les règles Base64URL du format de jeton plutôt que d'inventer une politique générale de réparation.
Les alphabets standard et sécurisés URL sont décrits dans RFC 4648. Votre intégration nécessite toujours des choix explicites en matière de remplissage, d'acceptation des espaces et de longueur maximale.