Le frontend est l’interface qui tourne dans le navigateur ; le full-stack ajoute un backend, une base de données et l’authentification pour un produit réel (voir OWASP Top 10 pour les risques d’authentification). Lisez la suite pour savoir quand une démo devient une vraie app.
Besoin d'aide ? Découvrez les solutions de notre agence de developpement d'application No Code.
Qu’est-ce qu’un frontend
Un frontend est l’interface utilisateur (HTML/CSS/JS et frameworks comme React/Vue/Svelte) exécutée côté client.
Le frontend est la couche visible par l’utilisateur, exécutée dans le navigateur ou une application cliente. Il s’occupe du rendu, des interactions et de la communication avec des services distants, mais n’assure pas les garanties de sécurité et de persistance qu’offre le serveur.
- Rendu : Le frontend transforme les données en éléments visuels (DOM).
- Interaction utilisateur : Le frontend gère les clics, formulaires, animations et retours visuels.
- Validation client : Le frontend réalise des contrôles rapides (format, contraintes simples) pour améliorer l’expérience utilisateur.
- Appels API : Le frontend effectue des requêtes HTTP (fetch, XHR) vers des API pour récupérer ou envoyer des données.
- Persistance fiable : Le frontend ne doit pas être la source unique de vérité pour stocker durablement des données.
- Authentification sécurisée : Le frontend peut gérer un token en mémoire/localStorage mais ne doit pas implémenter la logique d’authentification critique.
- Logique serveur protégée : Les règles métier sensibles et la validation finale doivent rester côté serveur pour éviter la manipulation client.
Exemple React fonctionnel simple affichant une liste et appelant une API avec fetch :
// Composant React (JSX)
function TodoList() {
const [items, setItems] = React.useState([]);
React.useEffect(() => {
fetch('/api/todos')
.then(res => res.json())
.then(data => setItems(data))
.catch(err => console.error(err));
}, []);
return (
{items.map(item => (
- {item.title}
))}
);
}Fragment HTML/CSS montrant séparation présentation/données :
<div class="card">
<h3>Titre</h3>
<p class="muted">Description provenant d'une API</p>
</div>
.card { padding:16px; border:1px solid #ddd; border-radius:6px; }
.muted { color:#666; }Les frameworks comme React, Vue ou Svelte facilitent la gestion d’état (state) et le routage (navigation entre vues).
Le state représente les données locales d’une interface et le routing gère les URLs et vues. Ces outils restent exécutés côté client et complètent l’expérience, sans remplacer le backend pour la sécurité ou la persistance.
| Fonction | Côté client (frontend) | Côté serveur (backend) |
| Rendu de l’UI | Oui | Parfois (SSR), mais pas obligatoire |
| Validation utilisateur | Oui (UX) | Oui (validation finale et sécurité) |
| Authentification | Stockage/présentation de token | Gestion sécurisée des identités |
| Persistance | Cache local (non fiable) | Base de données durable |
| Logique métier sensible | Non | Oui |
Qu’est-ce qu’une app full-stack
Une app full-stack combine frontend, backend, base de données et gestion de l’authentification pour offrir persistance, sécurité et logique métier côté serveur.
Je décris ici ce que j’entends par « full-stack » et pourquoi ces briques sont essentielles pour une application fiable et multi-utilisateurs.
- Rôle du backend : Je gère les API exposées au frontend, j’implémente la logique métier, j’effectue la validation côté serveur, j’envoie des e-mails transactionnels, j’orchestre les tâches planifiées (cron/jobs) et je contrôle finement l’accès aux ressources.
- Rôle de la base de données : Je fournis la persistance des données, je gère les transactions pour garantir la cohérence en cas de concurrence et j’optimise les requêtes pour des accès multi-utilisateurs.
- Authentification et autorisation : Je traite ces fonctions côté serveur pour éviter les contournements côté client. Référence concise : OWASP Top 10 (2021) classe Broken Access Control en A01, soulignant la nécessité de contrôles serveur stricts.
Architecture typique : Single Page Application (SPA) en React côté frontend, API REST ou GraphQL côté backend (Node/Express, Django, Spring, etc.), et base SQL (Postgres) ou NoSQL (MongoDB) selon les besoins de modèle et de scalabilité.
Exemple de endpoint minimal (pseudocode sécurisé) :
// POST /login
// Vérifier les entrées, comparer le mot de passe haché et renvoyer un token
app.post('/login', async (req, res) => {
const { email, password } = req.body;
const user = await db.findUserByEmail(email);
if (!user) return res.status(401).json({ error: 'Invalid credentials' });
const ok = await bcrypt.compare(password, user.passwordHash); // bcrypt côté serveur
if (!ok) return res.status(401).json({ error: 'Invalid credentials' });
const token = jwt.sign({ sub: user.id }, process.env.JWT_SECRET /* secret stocké côté serveur */, { expiresIn: '1h' });
res.json({ token });
});Différence logique client vs serveur : Le client réalise l’UI, la validation UX et des calculs non sensibles. Le serveur réalise la logique qui doit rester digne de confiance : règles de facturation, calculs multi-utilisateurs, agrégation de données et contrôle d’accès.
| Côté client | Côté serveur |
| Validation UX, rendu, appels API | Validation finale, transactions, facturation, sécurité |
Pour la facturation multi-utilisateurs, je garde la logique côté serveur car elle implique des soldes partagés, des transactions atomiques et des preuves d’audit impossibles à garantir uniquement côté client.
Pourquoi le backend est indispensable
Le backend est indispensable pour la persistance, la sécurité, la logique métier et la coordination multi-utilisateurs.
Je conçois le backend pour assurer la persistance et l’intégrité des données : gestion des transactions (pour que plusieurs opérations réussissent ou échouent ensemble), sauvegardes régulières et politiques de rétention (conservation légale et conformité). Des bases relationnelles comme PostgreSQL ou des systèmes distribués garantissent des transactions ACID (Atomicité, Cohérence, Isolation, Durabilité) pour éviter les écritures partielles et la corruption des données.
Je mets en place la sécurité serveur parce que le stockage côté client est vulnérable. Les mots de passe doivent être hachés côté serveur avec bcrypt/argon2 et des salts. Les endpoints HTTP doivent être protégés par authentification et autorisation serveur-side pour prévenir la manipulation client. OWASP (Open Web Application Security Project) Top 10 2021 liste des risques fréquents comme Injection, Broken Authentication et CSRF (Cross-Site Request Forgery), d’où l’importance des contrôles serveur.
Je développe les fonctionnalités critiques côté backend : gestion des comptes, envoi d’e-mails transactionnels (confirmation, réinitialisation), workflows asynchrones et jobs serveur (traitements lourds, envoi en masse). Ces composants gèrent les files d’attente, la temporalité et la fiabilité que le navigateur ne peut garantir.
Je garantis la scalabilité et la durée de vie de l’application via déploiement, monitoring et mises à jour progressives sans dépendre du cache navigateur. Le backend permet de déployer des correctifs, d’observer les métriques (latence, erreurs) et d’adapter la capacité.
Je donne un exemple concret : la fonctionnalité «Partager avec un autre utilisateur» nécessite un backend pour enregistrer les droits, vérifier l’existence du destinataire, notifier et auditer l’action; la logique ne peut pas reposer sur du JavaScript exécuté uniquement chez le client.
Exemples d’incidents évités par un backend :
- Fuite de tokens d’authentification stockés en localStorage évitée grâce à des cookies sécurisés HttpOnly et validation serveur.
- Modification de soldes utilisateurs par manipulation client évitée grâce à des transactions serveur et vérifications d’autorisation.
- Envoi massif d’e-mails non désirés évité par des quotas et jobs serveur authentifiés.
| Problème | Risque si pas de backend | Solution backend |
| Authentification | Expose les mots de passe et tokens côté client | Hachage serveur, cookies HttpOnly, validation d’API |
| Partage de ressources | Permissions falsifiables par l’utilisateur | Contrôles d’accès serveur et journalisation |
| Traitements lourds | Blocage UI et perte de fiabilité | Jobs asynchrones, files d’attente, retries |
// Exemple Node.js : hachage côté serveur avec bcrypt
const bcrypt = require('bcrypt');
async function hashPassword(password){
const saltRounds = 12;
return await bcrypt.hash(password, saltRounds);
}
Quand utiliser Supabase ou Firebase
Supabase et Firebase sont des Backend-as-a-Service (BaaS) utiles pour accélérer le développement mais ne remplacent pas toujours une architecture backend personnalisée.
Ces services couvrent les besoins classiques d’un backend moderne.
- Authentification : Fournissent des flows prêts à l’emploi pour inscription, connexion, gestion des mots de passe et OAuth (explication : OAuth est un protocole d’autorisation pour déléguer l’accès sans partager de mot de passe).
- Base temps réel : Proposent des bases ou des synchronisations temps réel pour push/subscribe, utiles pour chats ou tableaux de bord.
- Stockage : Gèrent les fichiers, permissions et CDNs intégrés pour servir des assets.
- Fonctions serverless : Permettent d’exécuter du code côté serveur en réponse à des événements sans gérer d’infrastructure.
Ces mêmes services ont des limites qu’il faut connaître.
- Logique métier complexe : Les règles très spécifiques deviennent difficiles à maintenir uniquement via fonctions serverless et règles DB.
- Contrôle fin des performances : Les optimisations basse latence ou tuning précis des requêtes ne sont pas toujours possibles.
- Conformité et verrouillage fournisseur : Les exigences réglementaires (ex. hébergement sur des zones géographiques précises) et le vendor lock-in sont des risques réels.
Cas d’usage recommandés : Prototypes, MVP, petites applications, équipes sans backend dédié et projets nécessitant un time-to-market rapide.
Cas où préférer un backend dédié : Besoins avancés de sécurité, architectures multi-tenant complexes, pipelines ETL/data engineering, ou intégrations avec des systèmes legacy.
Exemple concret (authentification Supabase, conceptuel). Étapes : créer un projet Supabase, activer l’auth, intégrer le client, appeler signUp/signIn depuis le frontend. Exemple minimal :
// Initialisation du client Supabase
const supabase = createClient('https://url.supabase.co', 'ANON_KEY');
// Inscription
const { user, error } = await supabase.auth.signUp({
email: 'utilisateur@example.com',
password: 'MotDePasseS3cure'
});
// Connexion
const { session, error: signInError } = await supabase.auth.signIn({
email: 'utilisateur@example.com',
password: 'MotDePasseS3cure'
});Migrer vers une API custom devient pertinent lorsque la logique métier s’étoffe, que la conformité nécessite un contrôle total ou que le coût et la flexibilité du BaaS deviennent limitants.
| Solution | Coûts de démarrage | Temps de mise en production | Contrôle | Montée en charge | Conformité |
| BaaS (Supabase/Firebase) | Faible pour débuter | Très rapide | Limité | Géré par le fournisseur (scalable mais parfois coûteux) | Variable, peut poser problème pour exigences fortes |
| Backend custom | Plus élevé (dev + infra) | Plus long | Complet, sur-mesure | Contrôle total mais nécessité d’ingénierie | Plus facile à aligner sur des contraintes strictes |
Comment vérifier si une démo est vraiment full-stack
Vérifiez la présence d’une API serveur, d’une base de données, d’authentification réelle et de persistance réelle des données.
La validation d’une démo full-stack ne se limite pas à l’interface. La checklist ci‑dessous et les méthodes d’audit confirment qu’il y a bien un backend qui stocke et protège les données.
- Tester la persistance : Créer un enregistrement, fermer le navigateur, rouvrir et vérifier que l’enregistrement existe toujours dans la démo. Cela prouve que les données sont stockées côté serveur et non seulement en mémoire ou dans localStorage.
- Vérifier l’authentification : S’assurer que les tokens sont émis par un serveur et validés côté serveur. Expliquer : Un token (par exemple JWT, JSON Web Token) est une preuve d’identité; il doit être signé par le serveur et vérifié à chaque requête backend, pas seulement stocké dans le navigateur.
- Inspecter les requêtes réseau : Ouvrir l’onglet Réseau du navigateur et regarder si les appels ciblent des endpoints API hébergés (domaines backend) et non seulement des fichiers JSON locaux ou des mocks front-end.
- Analyser le code public (si disponible) : Rechercher un dossier backend (Express, Django, Spring, etc.) ou une configuration de fonctions serverless (AWS Lambda, Vercel, Netlify). Expliquer : Les fonctions serverless sont des petits endpoints exécutés côté serveur sans serveur dédié.
- Conseils pour les recruteurs/clients : Demander accès aux logs, aux scripts de migration de la base de données (migrations) ou au schéma de données. En entretien je demande aussi des accès temporaires aux environnements de staging ou des captures d’écran des tables en base pour vérification.
| Test | Résultat attendu | Action si échec |
| Persistance | Enregistrement visible après fermeture/rouvrir | Demander accès DB, logs ou script d’insert; rejeter la démo si données uniquement locales |
| Authentification | Token émis et validé par le serveur | Vérifier endpoint d’auth, exiger preuve de validation serveur (middleware, vérif JWT) |
| Requêtes réseau | Appels vers endpoints backend hébergés | Inspecter l’URL des requêtes; demander code backend ou config serverless |
Prêt à transformer une démo frontend en un vrai produit full-stack ?
Le frontend gère l’expérience utilisateur ; le full-stack ajoute le backend, la base de données et l’authentification pour garantir persistance, sécurité et logique métier. Les BaaS comme Supabase/Firebase accélèrent les MVP, mais une architecture serveur reste nécessaire pour la production, la conformité et la scalabilité. Si vous voulez réduire les risques et livrer de la valeur durable, équipez votre projet d’un backend solide.
FAQ
-
Qu’est-ce qui distingue techniquement un frontend d’un backend ?
Le frontend exécute le rendu et l’interaction dans le navigateur (HTML/CSS/JS). Le backend gère la persistance, la logique métier, l’authentification et la sécurité sur un serveur ou via des services hébergés. -
Puis-je mettre en production une app sans backend ?
Pour un prototype ou une landing page, oui. Pour un produit multi-utilisateurs, nécessitant persistance, sécurité ou workflows, non : un backend est nécessaire. -
Supabase/Firebase suffisent-ils pour remplacer un backend custom ?
Ils accélèrent le développement (auth, DB, stockage, fonctions serverless) mais peuvent limiter le contrôle, la conformité et la logique complexe. Migrer vers un backend custom reste fréquent pour la production. -
Comment vérifier qu’une démo est full-stack et pas seulement frontend ?
Testez la persistance après fermeture du navigateur, inspectez les requêtes réseau pour des endpoints serveur, cherchez un dossier backend dans le repo ou des fonctions serverless déployées. -
Quels risques si j’ignore le backend côté sécurité ?
Sans backend sécurisé vous vous exposez à des fuites d’identifiants, manipulation de logique côté client et violation de données. Les bonnes pratiques de l’OWASP recommandent de traiter l’authentification et l’autorisation côté serveur.
A propos de l’auteur
Je suis Franck Scandolera, expert & formateur en tracking avancé server-side, Analytics Engineering, automatisation No/Low Code (n8n) et intégration de l’IA en entreprise. J’accompagne des clients comme Logis Hôtel, Yelloh Village, BazarChic, la Fédération Française de Football et Texdecor. Responsable de l’agence webAnalyste et de l’organisme de formation Formations Analytics. Disponible pour aider les entreprises => contactez moi.

