Vous avez sûrement déjà vu du Base64 — ces longues chaînes étranges comme SGVsbG8gV29ybGQ=. On les retrouve dans les emails, les URIs de données, les payloads d'API et les JWTs. Mais qu'est-ce que Base64 exactement, et quand devriez-vous l'utiliser ? Démystifions tout ça.
Ce que fait Base64 (en termes simples)
Base64 prend n'importe quelles données — texte, images, fichiers, n'importe quoi — et les convertit en une chaîne utilisant seulement 64 caractères ASCII « sûrs » : A-Z, a-z, 0-9, + et /. Le = à la fin est du remplissage.
Pourquoi ? Parce que tous les systèmes ne gèrent pas les données binaires brutes. L'email a été conçu pour le texte. JSON ne supporte pas le binaire. Les paramètres URL ne peuvent pas contenir d'octets arbitraires. Base64 est le pont qui permet de faire passer des données binaires à travers des canaux texte uniquement.
Comment ça fonctionne en interne
L'algorithme est étonnamment simple. Il prend 3 octets d'entrée (24 bits), les divise en 4 groupes de 6 bits chacun, et associe chaque groupe à l'un des 64 caractères. Voici un exemple rapide :
Entrée : Hi (2 octets : 72, 105)
Binaire : 01001000 01101001 + zéros de remplissage
Divisé en groupes de 6 bits : 010010 000110 100100
Associé à l'alphabet Base64 : SGk=
Les mathématiques font que la sortie Base64 est toujours environ 33% plus grande que l'entrée. C'est le compromis pour une transmission textuelle sûre. La spécification RFC 4648 définit l'algorithme exact si vous voulez les détails techniques.
Quand utiliser Base64
Intégrer de petites images en HTML/CSS : Au lieu de faire télécharger un fichier séparé par le navigateur, vous pouvez insérer une petite icône inline : . Cela économise une requête HTTP. Idéal pour les icônes de moins de 2-3Ko.
Envoyer des données binaires dans les APIs JSON : JSON ne peut pas stocker d'octets bruts. Besoin d'uploader un fichier via une API JSON ? Encodez-le en Base64 :
Pièces jointes d'email : C'est littéralement pour ça que Base64 a été conçu. L'encodage MIME utilise Base64 pour intégrer des pièces jointes binaires dans des messages email textuels.
JWTs et tokens d'authentification : Les JSON Web Tokens utilisent l'encodage Base64URL (une variante sûre pour les URLs) pour leurs sections header et payload.
Stocker du binaire dans des champs texte : Colonnes texte de base de données, variables d'environnement, fichiers de configuration — Base64 vous permet de mettre des données binaires partout où du texte peut aller.
Quand NE PAS utiliser Base64
- Fichiers volumineux. L'augmentation de 33% fait vraiment mal avec les gros fichiers. Une image de 10Mo devient 13,3Mo en Base64. Utilisez plutôt l'upload multipart.
- Sécurité. Base64 n'est pas du chiffrement. C'est trivialement réversible. Ne l'utilisez jamais pour « cacher » des mots de passe ou des données sensibles. N'importe qui peut décoder
cGFzc3dvcmQ=enpassworden quelques secondes. - Grandes images inline. Pour les images de plus de ~5Ko, un fichier séparé avec mise en cache HTTP appropriée sera plus performant qu'une URI de données Base64.
La variante URL-safe
Le Base64 standard utilise + et /, qui ont une signification spéciale dans les URLs. La variante Base64URL les remplace par - et _. Vous la verrez dans les JWTs et partout où des données Base64 apparaissent dans des URLs.
Exemples de code rapides
Voici comment encoder et décoder du Base64 dans les langages les plus courants :
Notez que la fonction btoa() du navigateur en JavaScript ne fonctionne qu'avec des chaînes ASCII. Si vous devez encoder du texte Unicode, vous devez passer par un TextEncoder d'abord — ça piège beaucoup de développeurs.
Erreurs courantes avec Base64
Voici les pièges dans lesquels je vois les développeurs tomber le plus souvent :
1. Supposer que Base64 est du chiffrement. Je ne le dirai jamais assez. J'ai vu des codebases en production qui encodent en Base64 des clés API et des mots de passe, pensant qu'ils sont « protégés ». N'importe qui avec une console de navigateur peut les décoder instantanément. Si vous devez protéger des données, utilisez un vrai chiffrement (AES, RSA) ou du hachage (bcrypt, argon2).
2. Ne pas gérer le remplissage correctement. Certaines implémentations suppriment les signes = finaux, ce qui peut causer des erreurs de décodage dans les parsers stricts. Si vous envoyez du Base64 entre systèmes, mettez-vous d'accord sur l'inclusion ou non du remplissage.
3. Utiliser le Base64 standard dans les URLs. Les caractères + et / du Base64 standard vont casser les URLs. Utilisez toujours la variante URL-safe (Base64URL) quand vous intégrez des données encodées dans des paramètres de requête ou des segments de chemin.
4. Encoder des gros fichiers en Base64 dans des payloads JSON. Un fichier de 5Mo devient presque 7Mo après encodage Base64, et toute cette chaîne doit tenir en mémoire. Pour tout ce qui dépasse quelques Ko, utilisez multipart/form-data à la place.
Référence rapide du jeu de caractères Base64
| Plage | Caractères | Nombre |
| Majuscules | A-Z | 26 |
| Minuscules | a-z | 26 |
| Chiffres | 0-9 | 10 |
| Symboles | + / | 2 |
| Remplissage | = | 1 |
| URL-safe remplace | - _ (au lieu de + /) | 2 |
Cas d'usage réel : Intégrer des polices dans le CSS
Un usage courant de Base64 auquel on ne pense pas forcément est l'intégration de polices personnalisées directement dans les fichiers CSS. Cela évite une requête HTTP supplémentaire pour le fichier de police :
Cette technique fonctionne bien pour les petites polices d'icônes (moins de 10-15Ko). Pour les fichiers de police plus volumineux, il est préférable de les servir séparément pour que le navigateur puisse les mettre en cache indépendamment.
Base64 vs autres schémas d'encodage
Base64 n'est pas la seule façon de représenter des données binaires sous forme de texte. Il existe plusieurs alternatives, et chacune a son point fort. Comparons les principales.
Encodage Hex (Base16) : L'approche la plus simple — chaque octet devient deux caractères hex (0-9, A-F). Ainsi Hi devient 4869. C'est très simple et lisible par l'humain, mais la sortie est 100% plus grande que l'entrée (le double de la taille). On voit l'hex partout : codes couleur (#FF5733), hashes SHA, adresses MAC et sorties de débogage.
Base32 : Utilise 32 caractères (A-Z et 2-7). La sortie est environ 60% plus grande que l'entrée. Vous l'avez probablement vu sans le savoir — les codes à 6 chiffres de Google Authenticator et autres applications TOTP/2FA utilisent des secrets encodés en Base32 en coulisses. C'est aussi insensible à la casse, ce qui le rend idéal quand les utilisateurs doivent saisir manuellement les données encodées.
ASCII85 / Base85 : Utilise 85 caractères ASCII imprimables, produisant une sortie seulement environ 25% plus grande que l'entrée. C'est plus efficace que Base64. Git utilise une variante de Base85 dans son format de patch binaire (packfiles), et les fichiers Adobe PostScript et PDF utilisent l'encodage ASCII85 en interne. L'inconvénient ? Il utilise des caractères comme {, } et les guillemets qui peuvent causer des maux de tête dans JSON, XML et les URLs.
Voici une comparaison pour l'encodage de la même entrée de 100 octets :
| Encodage | Taille de sortie | Overhead | Caractères utilisés | Meilleur pour |
| Hex (Base16) | 200 octets | +100% | 16 (0-9, A-F) | Débogage, hashes |
| Base32 | ~160 octets | +60% | 32 (A-Z, 2-7) | Codes TOTP, contextes insensibles à la casse |
| Base64 | ~133 octets | +33% | 64 (A-Z, a-z, 0-9, +/) | Email, JSON, URIs de données |
| Base85 | ~125 octets | +25% | 85 (ASCII imprimable) | Packfiles Git, internes PDF |
Pourquoi Base64 gagne-t-il dans la plupart des cas ? Il atteint le juste milieu : overhead raisonnable, largement supporté dans chaque langage et plateforme, et il évite la plupart des caractères spéciaux qui posent problème dans les formats courants. Base85 est plus compact mais moins universellement supporté et plus difficile à utiliser en toute sécurité dans les formats de texte structurés.
Base64 dans les flux d'authentification
L'un des usages les plus répandus (et les plus mal compris) de Base64 est l'authentification HTTP Basic. Quand vous envoyez un nom d'utilisateur et un mot de passe via Basic Auth, le navigateur les concatène avec deux-points et encode le résultat en Base64.
Voici ce qui se passe en coulisses quand vous vous connectez avec le nom d'utilisateur admin et le mot de passe secret123 :
Le serveur reçoit cet en-tête, le décode en Base64, sépare au deux-points et vérifie les identifiants. Simple, non ? Mais voici le point critique : ce n'est PAS sécurisé sans HTTPS. Cette chaîne Base64 est trivialement réversible — quiconque intercepte la requête peut décoder YWRtaW46c2VjcmV0MTIz et obtenir votre mot de passe en moins d'une seconde. La spécification RFC 7617 pour Basic Auth met explicitement en garde à ce sujet.
Base64 apparaît aussi dans d'autres contextes d'authentification. Les tokens d'accès et de rafraîchissement OAuth 2.0 sont souvent encodés en Base64 (bien que ce soit un détail d'implémentation, pas une exigence). Beaucoup de clés API de services comme AWS, Stripe et Google Cloud sont des chaînes encodées en Base64. Encore une fois, l'encodage est pour le transport sûr — pas pour la sécurité. Envoyez-les toujours via HTTPS et stockez-les de manière sécurisée.
Les URIs de données en profondeur
Nous avons mentionné les URIs de données brièvement plus tôt, mais elles méritent un examen plus approfondi. Une URI de données vous permet d'intégrer le contenu d'un fichier directement dans du HTML, CSS ou JavaScript — sans requête HTTP externe nécessaire. La syntaxe complète est :
Le mediatype est un type MIME standard, le drapeau ;base64 indique au navigateur que les données sont encodées en Base64 (sans lui, les données sont supposées être du texte encodé en URL), et est le contenu réel.
Voici des exemples pour différents types de médias :
Image PNG (le plus courant) :
SVG inline (pas besoin de Base64 !) :
Notez que les SVGs sont déjà du texte, donc vous pouvez les encoder en URL au lieu de les encoder en Base64. C'est en fait plus petit car vous évitez les 33% d'overhead. Les développeurs malins utilisent cette astuce pour les icônes SVG simples.
Document PDF :
Fichier audio :
Maintenant, concernant les limites des navigateurs. Bien que la spécification des URIs de données sur MDN ne définisse pas de taille maximale, les navigateurs imposent leurs propres limites. Chrome plafonne les URIs de données à environ 2Mo dans les contextes de navigation (comme les iframes et les pages de niveau supérieur). Firefox est plus généreux. Pour les images de fond CSS et les images inline, la limite pratique est la patience de vos utilisateurs — une chaîne Base64 de 500Ko dans votre fichier CSS est techniquement valide mais détruira absolument les temps de chargement.
Impact sur les performances : Quand Base64 nuit
Parlons de vrais chiffres, parce que « 33% d'overhead » semble abstrait jusqu'à ce que vous voyiez l'impact en pratique.
Coût en bande passante : Une image de 50Ko devient ~67Ko après encodage Base64. Ce sont 17Ko supplémentaires par image. Multipliez ça sur une page avec 20 icônes inline et vous envoyez 340Ko de données inutiles. Pour référence, c'est plus que le HTML entier de la plupart des pages web.
Utilisation mémoire : Quand vous encodez une image en Base64 et l'intégrez dans du HTML ou CSS, toute la chaîne encodée doit être conservée en mémoire comme partie du DOM ou de la feuille de style. Le navigateur la décode ensuite en binaire, donc brièvement vous maintenez à la fois la version encodée et décodée. Pour une image de 1Mo, c'est environ 2,33Mo juste pour la chaîne encodée, plus 1Mo pour le binaire décodé — plus de 3x la taille originale du fichier.
Temps de parsing : Les chaînes Base64 à l'intérieur du HTML ou CSS doivent être parsées comme partie de ces documents. Une grande URI de données rend l'ensemble du fichier CSS ou document HTML plus lent à parser. Selon le guide d'optimisation d'images de web.dev, les images inline devraient généralement faire moins de 2-4Ko pour fournir un bénéfice net en performance.
Inefficacité du cache : C'est celui que les développeurs oublient le plus. Quand vous servez une image comme fichier séparé, le navigateur la met en cache indépendamment — les chargements de page suivants sautent complètement le téléchargement. Mais quand vous encodez cette même image en Base64 dans votre fichier CSS, elle devient partie du CSS. Si vous changez quoi que ce soit d'autre dans le CSS, le navigateur re-télécharge tout le fichier, y compris les données d'image Base64 qui n'ont pas changé. Vous perdez la granularité du cache.
Voici un benchmark approximatif pour la perspective :
| Scénario | Fichier séparé | Base64 inline |
| Icône de 2Ko | 1 requête HTTP supplémentaire (~5ms en HTTP/2) | +0,67Ko au HTML/CSS, pas de requête supplémentaire |
| Image de 50Ko | Cachée indépendamment, multiplexée HTTP/2 | +17Ko au CSS, re-téléchargée à chaque changement CSS |
| Photo de 500Ko | Cachée, lazy-loadable, rendu progressif | +167Ko au document, bloque le rendu, pas de lazy-load possible |
La règle générale : Intégrez en Base64 tout ce qui fait moins de 2-4Ko. Servez tout le reste comme fichier séparé. Avec HTTP/2 et HTTP/3, le coût des requêtes supplémentaires est minimal, donc le seuil a encore baissé au fil des années.
Base64 dans différents langages de programmation
Nous avons couvert JavaScript et Python plus tôt. Voici comment gérer Base64 dans d'autres langages populaires — chacun en seulement quelques lignes :
Remarquez que chaque langage a Base64 dans sa bibliothèque standard — aucun package tiers nécessaire. C'est un témoignage de l'importance fondamentale de cet encodage. Notez aussi que Ruby a strict_encode64 (sans retours à la ligne) et encode64 (insère des retours à la ligne tous les 60 caractères, conformément au standard MIME original). La plupart des usages modernes veulent la version stricte.
L'histoire de Base64
Base64 n'est pas apparu de nulle part. Son histoire est liée à celle de l'email, et la comprendre explique beaucoup de choix de conception.
Aux premiers jours d'internet, l'email (SMTP) était conçu pour ne gérer que du texte ASCII 7 bits — 128 caractères, et c'est tout. C'était suffisant pour du texte en anglais, mais complètement inutile pour envoyer des images, des documents, ou même du texte dans des langues non anglaises. On ne pouvait tout simplement pas envoyer de données binaires par email.
La première spécification formelle de Base64 est apparue dans RFC 1421 en 1993, dans le cadre du standard Privacy Enhanced Mail (PEM). L'idée était simple : convertir des données binaires en un sous-ensemble d'ASCII qui survivrait à n'importe quel système de transport textuel sans corruption.
Puis est venu RFC 2045 en 1996, qui a défini MIME (Multipurpose Internet Mail Extensions). MIME a standardisé le fonctionnement des pièces jointes d'email, et Base64 était son encodage principal pour le contenu binaire. C'est pourquoi vous verrez encore des en-têtes Content-Transfer-Encoding: base64 dans les messages email bruts aujourd'hui.
L'encodage a été affiné à nouveau dans RFC 4648 (2006), qui est devenu la référence définitive. Ce RFC a aussi introduit la variante URL-safe (Base64URL) et clarifié les cas limites autour du remplissage. La page du glossaire Base64 sur MDN est un bon point de départ si vous voulez explorer la spécification sans lire des RFCs bruts.
Ce qui est fascinant, c'est que Base64 est né d'une limitation — l'email 7 bits — qui n'existe plus. Le SMTP moderne supporte le transfert 8 bits et binaire. Pourtant, Base64 a largement survécu à son objectif initial, trouvant une nouvelle vie dans les APIs web, les JWTs, les URIs de données et d'innombrables autres contextes. C'est une de ces technologies qui a si bien résolu un problème que les gens continuent de lui trouver de nouveaux problèmes à résoudre.
Essayez vous-même
Vous voulez voir Base64 en action ? Collez n'importe quel texte ou fichier dans notre Base64 Encoder pour voir la sortie encodée instantanément. Besoin de décoder quelque chose ? Le Base64 Decoder s'en charge. Et si vous travaillez avec des images encodées en Base64, notre outil Base64 to Image vous permet de les prévisualiser directement dans le navigateur.