Encodage Base64 adapté aux URL : ce que c'est et pourquoi c'est important
Qu'est-ce que l'encodage Base64 adapté aux URL ?
L'encodage Base64 adapté aux URL (également appelé Base64url) est une variante du Base64 standard qui remplace les caractères ayant une signification particulière dans les URL et les noms de fichiers par des alternatives sûres. Le Base64 standard utilise + et / comme partie de son alphabet de 64 caractères, plus = pour le rembourrage, et ces trois éléments posent problème dans les URL, les chaînes de requête et les chemins de fichiers.
Le Base64url résout ce problème avec deux substitutions simples :
| Base64 standard | Base64 adapté aux URL |
|-----------------|-----------------|
| + (plus) | - (moins) |
| / (barre oblique) | _ (trait de soulignement) |
| = (rembourrage) | omis (généralement) |
Pourquoi le Base64 standard casse les URL
Lorsqu'une chaîne encodée en Base64 contenant + ou / apparaît dans une URL, le comportement du navigateur et du serveur devient imprévisible.
Le problème du +
Dans les chaînes de requête d'URL, le caractère + est interprété comme une espace. Ce comportement provient de la spécification application/x-www-form-urlencoded et fait que les données décodées contiennent des espaces inattendues.
Par exemple, une chaîne Base64 comme Pj4+Pz8/Pw== contient des caractères +. Si elle apparaît dans un paramètre d'URL ?token=Pj4+Pz8/Pw==, le serveur verra ?token=Pj4 Pz8/Pw== — le + devient une espace.
Le problème du /
Dans les chemins d'URL, le caractère / est un séparateur de chemins. Une chaîne Base64 comme ab/CD+Ef== contient un / qui sera interprété comme un niveau de répertoire. Si elle apparaît dans un segment d'URL, le client et le serveur peuvent mal interpréter la structure.
Le problème du =
Le caractère = est utilisé pour les paires clé-valeur dans les chaînes de requête. Un = final dans ?data=SGVsbG8= pourrait être ambigu — le = fait-il partie du rembourrage Base64 ou de la syntaxe du paramètre de requête ?
Bien que l'encodage de pourcentage puisse résoudre ces problèmes (+ devient %2B, / devient %2F), il gonfle la longueur de la chaîne et rend le débogage plus difficile. Le Base64url est une solution plus propre.
Comment fonctionne le Base64url
Le Base64url est formellement défini dans la RFC 4648 Section 5. Il utilise exactement le même algorithme que le Base64 standard — 3 octets deviennent 4 caractères — mais avec la substitution d'un caractère aux positions 62 et 63 de l'alphabet :
- Index 62 de l'alphabet :
+→-(moins) - Index 63 de l'alphabet :
/→_(trait de soulignement)
Le rembourrage (=) est généralement supprimé, car il peut être déduit de la longueur de la chaîne lors du décodage. Une chaîne Base64url est toujours un composant d'URL valide sans échappement supplémentaire.
Avant et après
Voici ce que les mêmes données binaires donnent dans les deux formats :
Standard: Pj4+Pz8/Pw==
URL-safe: Pj4-Pz8_Pw
Où le Base64url est utilisé
JSON Web Tokens (JWT)
Le JWT est l'utilisateur le plus éminent du Base64url. Chaque JWT se compose de trois parties — l'en-tête, la charge utile et la signature — chacune encodée en Base64url et séparée par des points :
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNqP0m2iTgCjD0
Remarquez les tirets et les traits de soulignement — pas de signes plus ni de barres obliques. Si JWT utilisait le Base64 standard, les jetons casseraient lorsqu'ils sont passés comme paramètres d'URL, ce qui est la façon la plus courante de les utiliser dans les applications web.
OAuth et OpenID Connect
OAuth 2.0 et OpenID Connect reposent tous deux sur JWT pour les jetons d'accès et les jetons d'identification, ce qui rend l'encodage Base64url fondamental pour l'authentification moderne. Le flux de code d'autorisation, le flux implicite et le flux d'identifiants client transmettent tous des jetons qui utilisent le Base64url.
API web et paramètres de requête
De nombreuses API REST et GraphQL acceptent des données encodées en Base64 dans les paramètres de requête pour les curseurs de pagination, les filtres ou les charges utiles encodées. Le Base64url garantit que ces paramètres fonctionnent correctement sans encodage d'URL supplémentaire.
Exemple concret — pagination par curseur d'API :
GET /api/users?cursor=MjAyNC0wMS0xNVQxMDozMDowMFo
L'API de GitHub utilise exactement ce modèle pour paginer de grands ensembles de résultats.
Noms de fichiers et stockage de fichiers
Les chaînes Base64url constituent des noms de fichiers sûrs car elles ne contiennent pas de séparateurs de chemins (/), pas de caractères spéciaux qui perturbent les systèmes de fichiers, et pas de caractères invalides sous Windows (:, *, ?, etc.).
Réseaux de diffusion de contenu et clés de cache
Les CDN et les couches de cache utilisent souvent des valeurs encodées en Base64url comme clés de cache. Le Base64 standard avec / créerait de fausses hiérarchies de répertoires dans l'espace de noms du cache, conduisant à des clés ambiguës.
Convertir entre Base64 standard et Base64url
La conversion entre les deux variantes est simple dans n'importe quel langage :
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 offre une prise en charge native du Base64url depuis la version 15.7.0 :
// 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!
Quand utiliser le Base64 standard vs le Base64url
Utilisez le Base64 standard lorsque :
- Vous encodez des pièces jointes d'e-mails (la norme MIME l'exige)
- Vous générez des URL de données pour l'intégration HTML/CSS
- Vous stockez des données dans des bases de données où la sécurité des URL est sans importance
- Vous interagissez avec des systèmes hérités qui attendent le Base64 standard
Utilisez le Base64url lorsque :
- Vous créez ou analysez des jetons JWT
- Vous passez des données encodées dans des paramètres de requête d'URL ou des segments de chemin
- Vous générez des noms de fichiers à partir de données binaires
- Vous créez des clés de cache ou des identifiants
- Vous travaillez avec des jetons OAuth ou OpenID Connect
Essayez l'encodage Base64 adapté aux URL en ligne
Utilisez notre encodeur et décodeur Base64 gratuit en ligne pour convertir entre les formats Base64 standard et Base64 adapté aux URL. Collez vos données, choisissez votre variante, et obtenez le résultat instantanément.