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.