Clerk vs Auth0 vs NextAuth.js 2026 — SaaS 인증 서비스 완전 비교
Clerk, Auth0, NextAuth.js(Auth.js) 세 인증 서비스를 기능·가격·마이그레이션 난이도로 비교한다. MAU 구간별 청구액, Passkey 지원 현황, 상황별 선택 기준을 실제 코드와 함께 정리했다.
한 줄 요약: Clerk는 Next.js 스타트업 최속 구현, Auth0는 엔터프라이즈 컴플라이언스, NextAuth.js(Auth.js)는 비용 제로 셀프호스팅 — 세 선택지는 각각 뚜렷한 이유가 있다.
이 글이 필요한 사람
Next.js/Vercel 스택으로 SaaS를 시작하려는 1인 개발자·스타트업
Auth0에서 비용 급증을 경험하고 대안을 찾는 팀
SOC 2·HIPAA 등 컴플라이언스가 필요한 B2B 제품 담당자
MAU 1만 명 이상 구간에서 인증 서비스를 재검토 중인 엔지니어
※ 2026년 4월 기준. 각 서비스 공식 문서 및 가격 페이지 데이터를 참조했다.
왜 지금 인증 서비스 선택이 중요한가
2026년 현재, Next.js App Router 기반 SaaS의 인증 스택은 사실상 세 선택지로 좁혀졌다. Clerk, Auth0(Okta CIC), 그리고 NextAuth.js v5(Auth.js)다. 셋 다 OAuth 2.0·OIDC 표준을 구현하지만, 개발 속도·운영 비용·기능 범위에서 차이가 크다.
선택을 잘못하면 두 가지 상황이 온다. 첫째, MAU 수천 명 단계에서 월 수백 달러짜리 청구서를 받는다. 둘째, 엔터프라이즈 고객이 SAML SSO나 SCIM 프로비저닝을 요청했을 때 서비스 전체를 교체해야 한다. 인증은 "나중에 바꾸기 어렵다"는 특성 때문에 초기 선택이 결정적이다.
이 글에서는 실제 설정 코드와 가격 구조를 기준으로 세 서비스를 비교한다. 마케팅 문구가 아니라 "내 프로젝트 규모와 요구사항에 무엇이 맞는가"를 판단할 수 있게 정리했다.
핵심 기능 비교표 — 한 눈에 보는 차이
세 인증 서비스의 대시보드 UI 비교. Clerk는 사용자 관리 UI를 기본 제공한다.
Clerk — Next.js 개발자의 가장 빠른 시작
Clerk는 2021년 출시 이후 Next.js 생태계에서 빠르게 확산됐다. 핵심 이유는 하나다: React 컴포넌트 몇 줄로 로그인 UI까지 완성된다. 별도 설계 없이 `<SignIn />`, `<UserButton />` 같은 컴포넌트를 배치하면 이메일·소셜 로그인·MFA가 즉시 동작한다.
2026년 기준 Clerk의 강점은 다음과 같다.
Organizations: B2B SaaS의 멀티테넌트 구조를 별도 구현 없이 제공한다. 팀 초대, 역할 관리, 도메인 기반 자동 가입을 지원한다.
세션 관리: JWT 기반이지만 클라이언트·서버 양쪽에서 `auth()` 헬퍼 하나로 세션을 읽는다. App Router의 RSC에서도 동작한다.
Webhook: 사용자 생성·삭제·업데이트 이벤트를 Webhook으로 수신해 내부 DB와 동기화할 수 있다.
Device tracking / Anomaly detection: 로그인 위치·기기 이상 감지를 기본 대시보드에서 확인할 수 있다.
단점은 두 가지다. 클라우드 전용이라 사용자 데이터가 Clerk 서버에 저장된다. GDPR·개인정보보호법 관점에서 데이터 위치가 중요한 서비스라면 이 부분을 검토해야 한다. 두 번째는 MAU 초과 시 비용이다. 무료 구간(10,000 MAU)을 넘으면 $0.02/MAU로 급격히 올라간다.
Clerk — Next.js App Router 설정 (5분 완성)
# 1. 설치
npm install @clerk/nextjs
# 2. 환경변수 (.env.local)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# 3. middleware.ts — 보호할 경로 설정
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
const isProtectedRoute = createRouteMatcher(['/dashboard(.*)'])
export default clerkMiddleware((auth, req) => {
if (isProtectedRoute(req)) auth().protect()
})
export const config = {
matcher: ['/((?!.*\..*|_next).*)', '/', '/(api|trpc)(.*)'],
}
# 4. layout.tsx — ClerkProvider 래핑
import { ClerkProvider } from '@clerk/nextjs'
export default function RootLayout({ children }) {
return (
<ClerkProvider>
<html><body>{children}</body></html>
</ClerkProvider>
)
}
# 5. 로그인 페이지 — pages/sign-in/[[...sign-in]]/page.tsx
import { SignIn } from '@clerk/nextjs'
export default function Page() {
return <SignIn />
}
Clerk 무료 플랜 제한 (2026년 4월 기준) 무료: 최대 10,000 MAU, Organizations 무제한, MFA 포함. Pro($25/월): 무제한 MAU (+$0.02/초과), 커스텀 도메인. Enterprise: SAML SSO, SCIM, 전용 지원. MAU 5만 명 이상이면 월 $1,000+가 될 수 있다.
Auth0 — 엔터프라이즈 B2B의 사실상 표준
Auth0는 2013년 출시, 2021년 Okta에 인수됐다. 현재는 Okta Customer Identity Cloud(CIC)로 운영된다. 기능 폭이 가장 넓고, 엔터프라이즈 컴플라이언스(SOC 2 Type II, HIPAA, ISO 27001, PCI DSS)를 모두 충족한다.
Auth0를 선택해야 하는 상황은 명확하다.
B2B 고객이 SAML SSO를 요구하는 경우 — Okta, Azure AD, Google Workspace와의 연동이 이미 검증돼 있다.
Fine-grained Authorization(FGA)이 필요한 경우 — Zanzibar 기반 권한 시스템으로 복잡한 역할·리소스 권한을 모델링할 수 있다.
커스텀 Actions·Rules로 로그인 흐름을 세밀하게 제어해야 하는 경우 — 예: 이상 로그인 시 추가 검증, 외부 DB와 토큰 클레임 병합.
단점도 분명하다. 설정 복잡도가 가장 높다. Universal Login, Custom Domain, API 설정, 애플리케이션 등록을 모두 대시보드에서 수동으로 구성해야 한다. Next.js App Router와의 통합도 공식 SDK보다 커뮤니티 패키지(auth0-nextjs)를 주로 쓴다. 가격은 세 서비스 중 가장 비싸다. MAU 7,500 초과 시 $0.023/MAU부터 시작하며, SAML SSO는 Enterprise 플랜($800/월~)에서만 제공된다.
Auth0 대시보드의 엔터프라이즈 연결 화면. SAML SSO, SCIM 프로비저닝, 세밀한 로그인 흐름 제어를 지원한다.
NextAuth.js v5 (Auth.js) — 비용 제로, 완전한 데이터 소유
NextAuth.js v5(공식명: Auth.js)는 2024년 말 대규모 리팩터링을 마쳤다. Next.js App Router·Edge Runtime을 완전히 지원하며, 어댑터 시스템으로 Prisma·Drizzle·Supabase 등 자신의 DB와 직접 연결한다. 비용은 제로다 — 사용자 데이터가 자신의 DB에 저장되기 때문에 MAU가 늘어도 추가 청구가 없다.
선택하기 적합한 상황:
MAU가 수만~수십만 명이고 인증 비용을 고정비로 통제하고 싶은 경우
GDPR 또는 국내 개인정보보호법상 데이터 국내 보관이 필요한 서비스
사용자 테이블에 커스텀 컬럼을 자유롭게 추가해야 하는 경우
오픈소스를 선호하거나 벤더 의존성을 없애고 싶은 경우
단점도 있다. UI는 직접 만들어야 한다. `<SignIn />` 같은 내장 컴포넌트가 없다. MFA, Passkey, Organizations도 기본 제공이 안 되므로 직접 구현하거나 별도 라이브러리를 붙여야 한다. 엔터프라이즈 SAML SSO가 필요하면 NextAuth.js로는 구현이 복잡해진다.
Auth.js v5 — Next.js App Router + Drizzle 어댑터
# 1. 설치
npm install next-auth@5 @auth/drizzle-adapter drizzle-orm
# 2. auth.ts — 설정 파일
import NextAuth from 'next-auth'
import { DrizzleAdapter } from '@auth/drizzle-adapter'
import GitHub from 'next-auth/providers/github'
import Google from 'next-auth/providers/google'
import { db } from '@/db'
export const { handlers, auth, signIn, signOut } = NextAuth({
adapter: DrizzleAdapter(db),
providers: [
GitHub({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
}),
],
callbacks: {
session({ session, user }) {
session.user.id = user.id // 세션에 DB user.id 포함
return session
},
},
})
# 3. app/api/auth/[...nextauth]/route.ts
import { handlers } from '@/auth'
export const { GET, POST } = handlers
# 4. middleware.ts — 보호 경로
import { auth } from '@/auth'
export default auth((req) => {
if (!req.auth && req.nextUrl.pathname.startsWith('/dashboard')) {
return Response.redirect(new URL('/login', req.url))
}
})
# 5. 서버 컴포넌트에서 세션 읽기
import { auth } from '@/auth'
export default async function Page() {
const session = await auth()
if (!session) redirect('/login')
return <div>{session.user?.email}</div>
}
Auth.js v5 어댑터 선택 기준 Prisma 어댑터: 모델 자동 마이그레이션 편리, ORM 이미 쓰는 경우. Drizzle 어댑터: 타입 안전성 극대화, 스키마 직접 제어 선호 시. Supabase 어댑터: Supabase 풀스택 사용 시 (Row Level Security 주의). 어댑터 없이 JWT 모드: DB 없이 빠른 프로토타입.
가격 비교 — MAU 구간별 실제 청구액
인증 서비스 선택에서 가장 많이 간과되는 것이 스케일 시 비용이다. 초기 무료 구간이 넉넉해 보여도 MAU가 늘면 비용이 기하급수적으로 오른다. 아래 표는 2026년 4월 기준 공식 가격 기준으로 구간별 월 청구 예상액을 정리했다.
MAU 2만 명이 분기점이다 MAU 2만 명 이하라면 Clerk Pro($25/월 + 초과분)가 Auth0보다 저렴하다. 2만 명을 넘으면 두 서비스 모두 비용이 급등한다. 이 구간에서 Auth.js로 마이그레이션을 검토하는 팀이 많다. 단, 마이그레이션 비용(개발 공수, 세션 이전)을 반드시 계산에 포함해야 한다.
마이그레이션 현실 — 한번 쓰면 바꾸기 어려운 이유
인증 서비스 교체는 단순히 코드를 바꾸는 게 아니다. 기존 사용자의 세션과 비밀번호 해시가 현재 서비스에 저장돼 있기 때문이다.
Clerk나 Auth0에서 Auth.js로 전환할 때 발생하는 실제 문제들:
비밀번호 해시 이전 불가: Clerk와 Auth0는 비밀번호 해시를 외부로 내보내지 않는다. 이전 시 사용자 전체에게 비밀번호 재설정 이메일을 보내야 한다.
소셜 계정 연결 유실: 소셜 로그인은 provider_id가 새 시스템에 연결되지 않는다. 이메일 기반으로 재연결 로직을 구현해야 한다.
세션 무효화: 전환 시 기존 JWT가 새 서비스에서 검증되지 않는다. 동시 운영 구간(기존·신규 세션 모두 허용)을 두고 단계적으로 전환해야 한다.
MFA 초기화: MFA 등록 정보(TOTP 시드 등)도 이전이 사실상 불가능하다. 사용자들이 재등록해야 한다.
반대로 Auth.js에서 Clerk/Auth0로 이전하는 경우, 사용자 데이터를 Export API로 내보내거나 Auth0의 User Import Extension을 활용할 수 있다. 비밀번호 해시는 bcrypt 호환 시 이전 가능하다.
단계적 마이그레이션 전략 — 기존 Auth0 세션과 신규 Auth.js 세션을 middleware에서 병렬로 검증하는 구조.
상황별 선택 가이드 — 무엇을 골라야 하나
세 서비스 중 어떤 것을 선택할지는 제품 단계와 요구사항에 따라 달라진다. 아래 기준을 체크해보자.
Clerk를 선택해야 하는 경우:
Next.js + Vercel 스택으로 스타트업 MVP를 빠르게 출시해야 한다
B2B SaaS이고 Organization 기능이 곧 필요하다
MAU 1만 명까지는 공짜로 쓰고 싶다
인증 UI를 직접 디자인하는 데 시간을 쓰고 싶지 않다
Auth0를 선택해야 하는 경우:
엔터프라이즈 고객이 Okta/Azure AD SAML SSO를 요구하거나 요구할 가능성이 높다
SOC 2, HIPAA, ISO 27001 등 컴플라이언스 요건이 있다
복잡한 권한 시스템(Fine-grained Authorization)이 필요하다
이미 Okta 생태계를 사용 중이다
Auth.js(NextAuth.js)를 선택해야 하는 경우:
MAU가 수만 명 이상이고 인증 비용을 고정비화하고 싶다
사용자 데이터를 외부 서비스에 맡기기 어려운 컴플라이언스 환경이다
이미 Prisma·Drizzle·Supabase DB를 운영 중이라 추가 인프라가 없다
커스텀 인증 플로우가 많아 서비스 제약이 장애가 된다
처음 시작하는 팀에게 현실적인 조언 MVP 단계에서는 Clerk로 시작하는 것이 합리적이다. MAU 1만 명까지 무료이고, Organizations와 MFA가 기본 포함돼 있어 설계 부채가 적다. MAU 2만~3만 명 구간에서 비용을 보면서 Auth.js 마이그레이션을 검토하면 된다. Auth0는 "처음부터 엔터프라이즈 B2B"가 확실한 경우에만 초기부터 선택을 권장한다.
Passkey 지원 현황 — 2026년 인증의 다음 스텝
Passkey(FIDO2/WebAuthn 기반)는 2025년부터 주요 서비스에 빠르게 확산됐다. 비밀번호 없이 기기 생체인증으로 로그인하는 방식으로, 피싱 공격에 원천 차단된다.
2026년 4월 기준 지원 현황:
Clerk: Pro 플랜 이상에서 기본 지원. `<UserProfile />` 컴포넌트에서 사용자가 직접 등록 가능.
Auth0: Enterprise 플랜에서 Passkey 지원. Actions를 통해 조건부 활성화 가능.
Auth.js: v5.1+ 기준 WebAuthn 어댑터가 실험적으로 포함됐다. Simplewebauthn 라이브러리와 통합하는 커스텀 구현이 필요하다.
Passkey 구현이 지금 당장 필요하다면 Clerk Pro가 가장 빠르다. Auth.js로 직접 구현하려면 `@simplewebauthn/server`·`@simplewebauthn/browser`를 붙여야 하며, DB에 credential 테이블을 별도로 관리해야 한다.