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)

1. Tarifs 2026 — chiffres officiels

SolutionFree tierAu-delàPlan supérieur
Clerk10 000 MAU$0,02 / MAU additionnelPro Plan : 25 $/mois minimum
Auth07 500 MAU (Free B2C)$0,07 / MAU additionnelPlus de features = $240+/mois mini
Supabase Auth50 000 MAU$0,00325 / MAU additionnelInclus 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

MAUClerkAuth0SupabaseNextAuth
1 0000 $0 $0 $0 $
10 0000 $175 $/mo
(2 500 × 0,07 $)
0 $0 $
50 000800 $/mo
(40 000 × 0,02 $)
2 975 $/mo
(42 500 × 0,07 $)
0 $0 $
100 0001 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 0009 800 $/mo34 475 $/mo1 463 $/mo0 $ + 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.

Service Visionary

Architecture SaaS Next.js + auth optimisée — devis 24h

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.

Ressource gratuite · décision tree

Recevez le décision tree "Quelle auth pour mon SaaS ?"

Arbre de décision PDF avec 8 questions clés pour choisir entre Clerk, Auth0, Supabase Auth, NextAuth, en fonction de votre stack, volume cible, contraintes B2B et budget. Envoyé immédiatement.

5. Comparatif 12 critères

CritèreClerkAuth0SupabaseNextAuth
Free tier MAU10 0007 50050 000Illimité
Coût $/MAU au-delà$0,02$0,07$0,003250 $
Setup time MVP15 min30 min1 h2-4 h
UI prête (login, signup, profile)★★★★★★★★★★★0 (à coder)
Social providers20+30+18+80+
MFA / 2FAInclusInclusTOTP inclusÀ coder
B2B OrganizationsNatifNatifÀ coderÀ coder
Magic linksInclusInclusInclus (signInWithOtp)Email Provider
SAML SSO (B2B)Plan ProPlan ProPlan ProPossible (complexe)
Self-hostableNonOui (Identity Cloud)Oui (open-source)Oui (par design)
Hébergement EUUS par défautEU disponibleEU disponibleVous décidez
Compliance enterpriseSOC 2SOC 2 + HIPAASOC 2Vous gérez

6. Choisissez Clerk si…

7. Choisissez Auth0 si…

8. Choisissez Supabase Auth si…

9. Choisissez NextAuth (Auth.js) si…

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)

  1. Data Access Layer — toute lecture protégée passe par /lib/dal/* qui vérifie l'auth.
  2. 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.
  3. Pas de session côté client — la session vit dans un cookie HTTP-only. Le client ne lit jamais la JWT directement.
  4. Rotation des secrets — JWT secret renouvelé tous les 90 jours, OAuth client secrets idem. Toutes les solutions le supportent.
  5. Rate limiting au niveau de l'auth endpoint — Vercel KV, Upstash Redis ou middleware custom. Sinon brute-force trivial.
  6. MFA obligatoire pour les comptes admin — au minimum TOTP. Clerk, Auth0, Supabase l'offrent en 1 case à cocher.
  7. 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 →