Réponse rapide : NextAuth (Auth.js v5) si vous voulez le contrôle et 0 $/mois de licence. Clerk pour démarrer vite et avoir une UI prête sous 10K MAU. Supabase Auth pour scaler à 100K+ users sans exploser le budget. Auth0 uniquement pour l'enterprise B2B avec SOC2/HIPAA/SAML complexes. Et quel que soit votre choix : adoptez le Data Access Layer après le CVE-2025-29927.
En résumé (TL;DR)
- Coût à 100K MAU : Supabase 163 $/mois < NextAuth 0 $ + dev << Clerk 1 800 $ << Auth0 6 475 $.
- Free tier : Clerk 10K MAU · Auth0 7,5K MAU · Supabase 50K MAU · NextAuth illimité.
- UI prête : Clerk (excellent) > Auth0 (bon) > Supabase (basique) > NextAuth (vous codez).
- Sécurité critique : CVE-2025-29927 a montré que nous ne peut pas faire confiance au middleware seul. Patch + DAL obligatoires.
- B2B Organizations : Clerk (natif) > Auth0 (natif) >> Supabase / NextAuth (à coder).
1. Tarifs 2026 — chiffres officiels
| Solution | Free tier | Au-delà | Plan supérieur |
|---|---|---|---|
| Clerk | 10 000 MAU | $0,02 / MAU additionnel | Pro Plan : 25 $/mois minimum |
| Auth0 | 7 500 MAU (Free B2C) | $0,07 / MAU additionnel | Plus de features = $240+/mois mini |
| Supabase Auth | 50 000 MAU | $0,00325 / MAU additionnel | Inclus dans Pro plan 25 $/mois (DB + Auth + Storage) |
| NextAuth.js (Auth.js) | Illimité (open-source) | 0 $ | 0 $ — vous payez votre DB / serveur |
Sources : clerk.com/pricing, auth0.com/pricing, supabase.com/pricing, vérifiés mai 2026.
2. Coût réel à 1K, 10K, 100K utilisateurs actifs mensuels
| MAU | Clerk | Auth0 | Supabase | NextAuth |
|---|---|---|---|---|
| 1 000 | 0 $ | 0 $ | 0 $ | 0 $ |
| 10 000 | 0 $ | 175 $/mo (2 500 × 0,07 $) | 0 $ | 0 $ |
| 50 000 | 800 $/mo (40 000 × 0,02 $) | 2 975 $/mo (42 500 × 0,07 $) | 0 $ | 0 $ |
| 100 000 | 1 800 $/mo (90 000 × 0,02 $) | 6 475 $/mo (92 500 × 0,07 $) | 163 $/mo (50 000 × 0,00325 $) | 0 $ + maintenance (~ 200 $/mo dev) |
| 500 000 | 9 800 $/mo | 34 475 $/mo | 1 463 $/mo | 0 $ + dev |
À 100 K MAU, Auth0 coûte 40× plus cher que Supabase Auth. À 500 K MAU, le ratio passe à 23×. Si votre SaaS espère un million d'users à terme, le choix d'auth est presque aussi structurant que le choix de DB.
3. CVE-2025-29927 — la leçon de mars 2025
Sévérité 9,1 / 10 — middleware Next.js bypassable par header forgé
En mars 2025, la CVE-2025-29927 a révélé qu'un attaquant pouvait contourner intégralement le middleware en envoyant simplement un header x-middleware-subrequest. Toutes les routes "protégées" via middleware.ts étaient accessibles sans auth. Patch : Next.js 15.2.3, 14.2.25, 13.5.9, 12.3.5. Si vous tournez sur une version inférieure, mettez à jour aujourd'hui.
La leçon : ne JAMAIS faire reposer la sécurité sur le middleware seul
Le middleware reste utile pour la redirection UX (rediriger les non-logés vers /login), mais l'autorisation finale doit se faire au niveau des données, dans les Server Components, Server Actions, et Route Handlers. C'est le pattern Data Access Layer (DAL), recommandé par Vercel depuis 2024.
Exemple de DAL en Next.js 15
// lib/dal.ts
import { cache } from 'react';
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
import { decrypt } from '@/lib/session';
export const verifySession = cache(async () => {
const cookie = (await cookies()).get('session')?.value;
const session = await decrypt(cookie);
if (!session?.userId) redirect('/login');
return { userId: session.userId, isAuth: true };
});
export const getCurrentUser = cache(async () => {
const session = await verifySession();
return db.user.findUnique({ where: { id: session.userId } });
});
export const getProject = cache(async (projectId: string) => {
const user = await getCurrentUser();
const project = await db.project.findUnique({ where: { id: projectId } });
if (!project || project.ownerId !== user.id) {
throw new Error('Forbidden');
}
return project;
});
Avantages : cache() de React déduplique les calls dans une même requête. Toute autorisation est centralisée dans /lib/dal.ts. Si demain nous découvrons une nouvelle CVE, on patch UN endroit, pas 50.
4. Code minimal Next.js 15 par solution
Clerk
// app/layout.tsx
import { ClerkProvider, SignedIn, SignedOut, SignInButton, UserButton } from '@clerk/nextjs';
export default function RootLayout({ children }) {
return (
<ClerkProvider>
<html lang="fr">
<body>
<header>
<SignedOut><SignInButton /></SignedOut>
<SignedIn><UserButton /></SignedIn>
</header>
{children}
</body>
</html>
</ClerkProvider>
);
}
// app/dashboard/page.tsx (Server Component)
import { auth, currentUser } from '@clerk/nextjs/server';
export default async function Dashboard() {
const { userId, redirectToSignIn } = await auth();
if (!userId) return redirectToSignIn();
const user = await currentUser();
return <p>Bonjour {user?.firstName}</p>;
}
Setup en 10 minutes. Composants UI prêts. Webhooks pour synchro DB. Très peu de code custom à écrire.
Auth0
// app/api/auth/[auth0]/route.ts
import { handleAuth } from '@auth0/nextjs-auth0';
export const GET = handleAuth();
// app/dashboard/page.tsx
import { getSession } from '@auth0/nextjs-auth0';
import { redirect } from 'next/navigation';
export default async function Dashboard() {
const session = await getSession();
if (!session) redirect('/api/auth/login');
return <p>Bonjour {session.user.name}</p>;
}
Setup similaire à Clerk mais l'UI est universal login Auth0 (redirection vers une page hébergée par eux par défaut).
Supabase Auth
// lib/supabase/server.ts
import { createServerClient } from '@supabase/ssr';
import { cookies } from 'next/headers';
export async function createClient() {
const cookieStore = await cookies();
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll: () => cookieStore.getAll(),
setAll: (cookies) => cookies.forEach(c => cookieStore.set(c.name, c.value, c.options)),
},
}
);
}
// app/dashboard/page.tsx
import { redirect } from 'next/navigation';
import { createClient } from '@/lib/supabase/server';
export default async function Dashboard() {
const supabase = await createClient();
const { data: { user } } = await supabase.auth.getUser();
if (!user) redirect('/login');
return <p>Bonjour {user.email}</p>;
}
Couplage fort avec la DB Supabase. Row Level Security (RLS) au niveau Postgres : la sécurité descend dans la base elle-même, ce qui protège même si votre code applicatif a un bug.
NextAuth.js (Auth.js v5)
// auth.ts
import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';
import { PrismaAdapter } from '@auth/prisma-adapter';
import { prisma } from '@/lib/prisma';
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [GoogleProvider({ clientId: process.env.GOOGLE_ID!, clientSecret: process.env.GOOGLE_SECRET! })],
session: { strategy: 'database' },
});
// app/api/auth/[...nextauth]/route.ts
export { GET, POST } from '@/auth';
// app/dashboard/page.tsx
import { auth } from '@/auth';
import { redirect } from 'next/navigation';
export default async function Dashboard() {
const session = await auth();
if (!session?.user) redirect('/api/auth/signin');
return <p>Bonjour {session.user.name}</p>;
}
Plus de code de setup mais 100 % vôtre. Tables users, accounts, sessions dans VOTRE Postgres via Prisma adapter. Aucune dépendance SaaS externe sauf vos OAuth providers.
5. Comparatif 12 critères
| Critère | Clerk | Auth0 | Supabase | NextAuth |
|---|---|---|---|---|
| Free tier MAU | 10 000 | 7 500 | 50 000 | Illimité |
| Coût $/MAU au-delà | $0,02 | $0,07 | $0,00325 | 0 $ |
| Setup time MVP | 15 min | 30 min | 1 h | 2-4 h |
| UI prête (login, signup, profile) | ★★★★★ | ★★★★ | ★★ | 0 (à coder) |
| Social providers | 20+ | 30+ | 18+ | 80+ |
| MFA / 2FA | Inclus | Inclus | TOTP inclus | À coder |
| B2B Organizations | Natif | Natif | À coder | À coder |
| Magic links | Inclus | Inclus | Inclus (signInWithOtp) | Email Provider |
| SAML SSO (B2B) | Plan Pro | Plan Pro | Plan Pro | Possible (complexe) |
| Self-hostable | Non | Oui (Identity Cloud) | Oui (open-source) | Oui (par design) |
| Hébergement EU | US par défaut | EU disponible | EU disponible | Vous décidez |
| Compliance enterprise | SOC 2 | SOC 2 + HIPAA | SOC 2 | Vous gérez |
6. Choisissez Clerk si…
- Vous lancez un MVP / startup et voulez gagner 2-3 semaines de dev
- Volume cible < 50 000 MAU dans les 12 prochains mois
- Vous voulez les Organizations B2B natives (members, invitations, roles)
- L'UI doit être polished sans effort design
- Stack Next.js exclusivement (Clerk est très Next.js-first)
7. Choisissez Auth0 si…
- Vous vendez à de grandes entreprises avec besoins SOC2 / HIPAA / SAML SSO complexes
- Vous avez le budget enterprise (240 $+/mois minimum)
- Vous avez besoin de RBAC très fin (rôles + permissions + attributs)
- Vous voulez la maturité du leader (Auth0 est sur le marché depuis 2013)
8. Choisissez Supabase Auth si…
- Vous démarrez sur stack Supabase (Postgres + Auth + Storage + Realtime)
- Volume cible > 100 000 MAU à terme — vos coûts d'auth resteront raisonnables
- Vous voulez tirer parti de Row Level Security (sécurité au niveau DB, ultime defense)
- Hébergement EU (Frankfurt) requis pour RGPD
- Vous êtes prêt à coder vos propres formulaires de login (peu polish out-of-the-box)
9. Choisissez NextAuth (Auth.js) si…
- Vous voulez maîtriser 100 % du code et 0 dépendance SaaS externe
- Votre stack utilise déjà Prisma / Drizzle + Postgres ou MySQL
- Volume cible élevé — vous économisez 1 800 $+/mois à 100K MAU vs Clerk
- Vous avez le temps dev (2-4 jours pour un setup propre + magic links + OAuth)
- Vous êtes confortable de coder MFA, gestion sessions, password reset si besoin
La règle du pouce 2026 : Clerk pour aller vite, NextAuth pour aller loin pas cher, Supabase pour aller loin pas cher AVEC stack postgres, Auth0 si SAML SSO B2B obligatoire.
10. Patterns sécurité 2026 à adopter (peu importe la solution)
- Data Access Layer — toute lecture protégée passe par
/lib/dal/*qui vérifie l'auth. - Server Actions over API Routes — par défaut, préférez Server Actions (Next.js 14+). Plus simple, type-safe, l'auth se vérifie dans la fonction serveur.
- Pas de session côté client — la session vit dans un cookie HTTP-only. Le client ne lit jamais la JWT directement.
- Rotation des secrets — JWT secret renouvelé tous les 90 jours, OAuth client secrets idem. Toutes les solutions le supportent.
- Rate limiting au niveau de l'auth endpoint — Vercel KV, Upstash Redis ou middleware custom. Sinon brute-force trivial.
- MFA obligatoire pour les comptes admin — au minimum TOTP. Clerk, Auth0, Supabase l'offrent en 1 case à cocher.
- Audit logs — qui s'est connecté, depuis où, quand. Auth0 et Clerk les fournissent natifs. Pour Supabase / NextAuth, à logger vous-même.
Questions fréquentes
Quelle est la solution d'auth la moins chère pour un SaaS Next.js en 2026 ?
À long terme : Supabase Auth (50 000 MAU gratuits, puis $0,00325/MAU). Pour 100 000 MAU, ~163 $/mois chez Supabase contre 1 800 $/mois chez Clerk et 6 475 $/mois chez Auth0. NextAuth.js est gratuit en self-hosted mais demande de gérer vos propres tables users + sessions + emails.
Clerk vaut-il son prix vs NextAuth gratuit ?
Pour un MVP / startup en dessous de 1 000 MAU : oui. Clerk vous fait gagner 2-3 semaines de dev. À 10 000 MAU, vous êtes à 0 $/mois (free tier) chez Clerk. Au-delà, le coût grimpe vite — à 50 000 MAU, c'est 800 $/mois.
Auth0 est-il encore pertinent en 2026 ?
Auth0 reste leader sur l'enterprise B2B avec besoins de compliance forts (SOC 2, HIPAA, SAML SSO complexe). Tarif positionné enterprise. Pour une startup ou un B2C, c'est trop cher — préférez Clerk ou Supabase Auth.
Qu'est-ce que CVE-2025-29927 et comment ça impacte mon auth ?
CVE-2025-29927 (mars 2025) est une vulnérabilité critique de Next.js (sévérité 9,1 / 10) qui permettait de bypass complètement le middleware en envoyant un header HTTP forgé (x-middleware-subrequest). Patch dans Next.js 15.2.3, 14.2.25, 13.5.9, 12.3.5. Leçon : ne JAMAIS faire reposer la sécurité finale sur le middleware. Toujours revérifier l'auth au niveau Server Component, Server Action ou Route Handler — le pattern Data Access Layer.
Faut-il utiliser le middleware Next.js pour l'auth après CVE-2025-29927 ?
Oui, mais comme un layer de redirection UX, pas comme un layer de sécurité. Le middleware reste utile pour rediriger les visiteurs non logés vers /login (UX). Mais la vérification d'autorisation finale doit se faire dans les Server Components, Server Actions, et Route Handlers — au plus près des données.
NextAuth (Auth.js) est-il production-ready en 2026 ?
Oui. Auth.js v5 (anciennement NextAuth v5) est stable depuis 2024, supporte Next.js 15 App Router nativement, gère 80+ providers OAuth, integration parfaite avec Prisma, Drizzle, Supabase. C'est le bon choix si vous voulez le contrôle, l'auto-hébergement, et 0 $ de licence. Le coût caché : maintenance + features (MFA, magic links, organizations B2B) que les autres fournissent out-of-the-box.
Supabase Auth : avantages vs alternatives ?
Avantages : tarif imbattable à scale ($0,00325/MAU au-dessus de 50K), intégration native avec Postgres + Row Level Security, MFA TOTP, magic links, OAuth 18+ providers, hébergement EU (Frankfurt). Inconvénients : moins de polish UI que Clerk, pas de B2B Organizations natif, couplé à l'écosystème Supabase. Excellent si vous démarrez sur stack Supabase.
Comment gérer le login social (Google, GitHub, Apple) en 2026 ?
Les 4 solutions le supportent. Clerk et Supabase Auth incluent les providers majeurs sans config OAuth manuelle. Auth.js demande de créer vos OAuth apps chez chaque provider. Apple Sign In demande systématiquement plus de configuration et un compte Apple Developer payant ($99/an). Magic links et passwordless sont disponibles partout.
Qu'est-ce que le Data Access Layer (DAL) et pourquoi l'adopter ?
Le DAL est un pattern où toute logique d'accès aux données passe par une couche unifiée qui fait elle-même la vérification d'autorisation. Le DAL centralise les invariants de sécurité, simplifie l'audit, et protège contre des CVE comme CVE-2025-29927. Vercel l'a recommandé officiellement en 2024.
Peut-on migrer entre solutions d'auth sans casse ?
Oui mais c'est rarement trivial. Migration la plus simple : NextAuth → Supabase Auth. Migration sensible : Auth0 → Clerk. Stratégie recommandée : double-run sur 1-1,5 semaine, nouveaux signups sur la nouvelle solution, anciens users migrés progressivement par batches via API admin. Comptez 1 400 à 5 600 € HT pour une migration accompagnée.
Architecture SaaS Next.js + auth optimisée ?
Nous choisissons la bonne solution selon votre stack et votre cible MAU, nous implémentons le Data Access Layer, nous livrons un boilerplate sécurisé. SaaS sur-mesure dès 5600 €.
Voir l'offre SaaS →