· auth / clerk / supabase

Clerk vs Supabase Auth 2026: chọn trước khi đạt 50K users

Clerk setup xong trong 15 phút; Supabase rẻ hơn 41 lần ở 100K MAU. Điểm phân kỳ nằm đúng ở 50,001 users — con số này quyết định lựa chọn của bạn.

Bởi Ethan

2.680 từ · 14 phút đọc

Cả hai đều bắt đầu ở $25/tháng. Ở mức 100,000 monthly active users, Clerk tốn $1,025 còn Supabase chỉ tốn $25 — chênh lệch 41 lần. Dưới 50,000 users, giá như nhau và các zero-config middleware cùng UI components dựng sẵn của Clerk giúp bạn tiết kiệm nhiều giờ.

Chọn Clerk nếu cần UI đăng nhập hoàn chỉnh, enterprise SSO, hoặc machine auth không cần cấu hình thêm. Chọn Supabase nếu bạn đang dùng Postgres, dự tính vượt 50K users với ngân sách eo hẹp, hoặc cần tự host dữ liệu auth.

Bài này dành cho ai

Developer đang chọn giải pháp auth cho Next.js App Router năm 2026 — so sánh giữa một hosted auth service chuyên dụng và module auth tích hợp trong một open-source Postgres BaaS. Nếu bạn đang dùng stack không phải Postgres, xây dựng cho LDAP, hoặc chạy hoàn toàn trên Cloudflare Workers không có database, phân tích ở đây sẽ có ít giá trị tham khảo.

Những gì chúng tôi so sánh

Dữ liệu giá được kiểm chứng từ tài liệu chính thức vào ngày 2026-05-21:

  • Clerk: clerk.com/pricing, ghi chú phát hành Core 3 (tháng 3/2026), API Keys GA (tháng 4/2026)
  • Supabase: supabase.com/pricing, GitHub changelog, tài liệu migration API key format

Code samples được kiểm tra trên Next.js 15.3 (App Router) với Node 22.

So sánh tính năng

Tính năngClerkSupabase Auth
Thời gian setup~15 phút~30–45 phút
Social login20+ providers, không cần cấu hìnhManual OAuth setup từng provider
MFATOTP, SMS, backup codesTOTP, SMS
Enterprise SSO / SAMLGói Pro, cấu hình từ dashboardManual (tích hợp bên thứ ba)
Machine auth (API keys)GA tháng 4/2026JWT-based, tự xây
Passkeys
Self-hostingKhôngCó (Docker Compose)
Open sourceKhôngCó (Apache 2.0)
Postgres-native sessionsKhông (external store)
Row Level Security integrationKhôngCó (auth.uid() trong policies)
Gói miễn phí50,000 MRU50,000 MAU
Gói trả phí cơ bản$25/tháng, 50K MRU$25/tháng, 100K MAU

Cả hai gói miễn phí đều bao gồm 50,000 active users — Clerk ở 50K MRU, Supabase ở 50K MAU. Với side project dưới ngưỡng đó, không dịch vụ nào tốn tiền cả.

Khám phá sâu về developer experience

Clerk: auth được xử lý sẵn cho bạn

Điểm mạnh của Clerk là tốc độ ship. Bản tích hợp Next.js Core 3 (tháng 3/2026) rút gọn việc bảo vệ route xuống chỉ còn một file middleware:

// middleware.ts
import { clerkMiddleware } from '@clerk/nextjs/server'
export default clerkMiddleware()
export const config = {
  matcher: ['/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)', '/(api|trpc)(.*)', '/__clerk/(.*)'],
}

File này bảo vệ mọi route trừ static assets. Không cần JWT validation tùy chỉnh, không cần truy vấn session store, không cần parse cookie. Middleware chạy trên Edge Runtime — không phải lo cold start.

Layout import các component Core 3. Lưu ý: <SignedIn><SignedOut> đã deprecated trong Core 3. Dùng <Show>:

// app/layout.tsx
import { ClerkProvider, SignInButton, SignUpButton, Show, UserButton } from "@clerk/nextjs";

<Show when="signed-in"><Show when="signed-out"> thay thế các wrapper cũ. Migration chỉ là đổi tên; logic render giữ nguyên.

Ngoài middleware, Clerk còn đi kèm UI components hoàn chỉnh cho đăng nhập và đăng ký. Bạn không cần tự viết form auth. Với một ứng dụng B2B SaaS điển hình, điều này loại bỏ 40–60 dòng code form, việc audit accessibility cho các form đó, và lần pass layout trên mobile. Component <UserButton /> thêm profile dropdown — avatar, link cài đặt, đăng xuất — chỉ bằng một import.

API Keys GA tháng 4/2026 bổ sung machine-to-machine authentication. Các external services, webhook consumers, và background workers xác thực bằng API key credentials tạo từ Clerk dashboard, tách biệt với user sessions. Không cần hạ tầng thêm, không cần token service riêng.

Clerk còn cung cấp Organizations API cho multi-tenant apps: tạo org, quản lý memberships, enforce roles ở cấp middleware. Với sản phẩm B2B, điều này tiết kiệm cả tuần data modeling.

Organizations API của Clerk thường bị đánh giá thấp hơn thực tế. Bạn nhận được org creation, invitations, role-based access, và org-scoped JWT claims ngay từ đầu. Trong multi-tenant SaaS, tự xây tính năng tương đương đòi hỏi bảng teams, bảng join org_memberships, invitation tokens có expiry, email transactional flows, và role enforcement ở mỗi API route. Clerk có tất cả những thứ đó. Liệu điều này có đáng với chi phí per-MAU hay không phụ thuộc hoàn toàn vào việc bạn sẵn sàng đi đến đâu để tự xây.

Hạn chế là sự phụ thuộc. Clerk là hosted service không có khả năng self-hosting. Users, sessions, và org data của bạn sống trên hạ tầng của Clerk. Clerk có sự cố, auth của bạn ngừng hoạt động. Clerk thay đổi pricing model, bạn cũng bị ảnh hưởng. Migration ra khỏi Clerk nghĩa là export user data, xây lại sign-in UI, nối lại mọi JWT claim ứng dụng đọc, và audit mọi route dựa vào organization claims của Clerk. Đó là dự án nhiều sprint. Không phải lý do để tránh Clerk — mà là lý do để quyết định có ý thức.

Nếu mối lo chính của bạn là tránh chi phí per-MAU và vendor lock-in, Auth.js vs Clerk so sánh Clerk với con đường open-source DIY chi tiết hơn.

Supabase: auth như một tầng Postgres

Supabase Auth là GoTrue — một open-source auth service — chạy trên Postgres database của bạn. Users, sessions, và tokens là các row trong schema của bạn. Dữ liệu auth và application data dùng chung một transaction boundary.

Next.js quickstart:

npx create-next-app -e with-supabase

Template này kết nối SSR client với cookie-based session persistence cho App Router. Kiểm tra session ở server component:

// app/page.tsx (server component)
import { createClient } from '@/utils/supabase/server'
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()

createClient() là async trong template — nó đọc cookies qua Next.js cookies() API. User object đến từ Postgres instance của bạn, không phải từ API của bên thứ ba.

Thiết kế Postgres-native mở khóa Row Level Security. Một policy như:

CREATE POLICY "Users see own posts" ON posts
  FOR SELECT USING (auth.uid() = user_id);

có nghĩa là database tự enforce authorization. auth.uid() trả về UUID của user đã xác thực từ session token. Bạn không viết authorization logic trong application — DB từ chối unauthorized reads ở cấp query.

Điều bạn phải bỏ ra: tự xây UI. Template with-supabase đi kèm form email/password; social auth yêu cầu manual OAuth provider setup trong Supabase dashboard. Mỗi provider mất 15–30 phút để cấu hình. Setup MFA cũng tương tự. Hãy tính nửa ngày cho mọi yêu cầu social auth vượt ngoài email/password.

Nếu bạn đang so sánh Supabase với một BaaS khác, Supabase vs Firebase trình bày so sánh đó đầy đủ hơn.

Thay đổi đáng chú ý của Supabase 2025–2026:

  • API key format mới: sb_publishable_xxx / sb_secret_xxx thay thế quy ước anon / service_role cũ. Key cũ vẫn hoạt động; project mới tự nhận format mới.

Mô hình bảo mật

Mô hình bảo mật của Clerk là tin tưởng vendor. Clerk quản lý signing keys, rotate secrets, và xử lý session revocation. Bạn không kiểm soát trực tiếp những thứ này. Đánh đổi là sự đơn giản: bạn không bao giờ cấu hình sai JWT secret, nhưng bạn cũng không thể audit xem session data được lưu trữ như thế nào trên hệ thống của Clerk. Clerk được chứng nhận SOC 2 Type II; với hầu hết ứng dụng, điều đó là đủ.

Mô hình bảo mật của Supabase là: đó là Postgres database của bạn, bạn sở hữu các keys. JWT signing secrets nằm trong hạ tầng của chính bạn. Bạn cấu hình Postgres SSL settings, network access rules, và backup encryption. Row Level Security policies là code bạn viết và audit. Attack surface bạn kiểm soát lớn hơn — nghĩa là nhiều trách nhiệm hơn, không nhất thiết nhiều rủi ro hơn.

Sự khác biệt thực tế thể hiện trong các cuộc trò chuyện về compliance. “Chúng tôi được chứng nhận SOC 2 và dùng Clerk, một vendor được chứng nhận SOC 2” là câu đóng được nhiều enterprise security review. “Chúng tôi tự host Supabase và sở hữu toàn bộ security posture” tùy thuộc vào security team của khách hàng mà có thể đẩy nhanh hoặc làm chậm cùng review đó. Hãy hiểu khách hàng của bạn trước khi chọn.

Điểm phân kỳ giá

Cả hai sản phẩm đều $25/tháng trên gói Pro. Sự khác biệt nằm ở những gì được bao gồm và chi phí khi vượt ngưỡng.

Clerk Pro: $25/tháng, bao gồm 50,000 MRU. Phí overage: $0.02/MRU từ 50K–100K, $0.018/MRU từ 100K–1M.

Supabase Pro: $25/tháng, bao gồm 100,000 MAU. Phí overage: $0.00325/MAU.

MAUClerk (hàng tháng)Supabase (hàng tháng)Chênh lệch
10,000$0 (gói miễn phí)$0 (gói miễn phí)
50,000$25$25$0
50,001~$25.02$25.00Supabase rẻ hơn
75,000$525$25$500
100,000$1,025$25$1,000
200,000$2,825$350$2,475
500,000$8,225$1,325$6,900
1,000,000$17,225$2,950$14,275

Ở 100K MAU, Clerk đắt hơn 41 lần. Ở 1M MAU, khoảng cách là $14,275/tháng — $171,300/năm. Đó là mức lương của một senior engineer ở nhiều thị trường, dành hoàn toàn cho hạ tầng auth.

Ba lưu ý quan trọng trước khi tối ưu cho con số hàng triệu users:

1. MRU ≠ MAU chính xác. Clerk tính theo Monthly Rate Units. Với hầu hết consumer apps, MRU ≈ MAU. Khách hàng enterprise SSO có thể tính khác — một user xác thực hai lần qua các SSO connections khác nhau có thể tính là hai MRU. Kiểm tra FAQ thanh toán của Clerk cho thiết lập cụ thể của bạn trước khi dự báo chi phí.

2. Supabase có phí compute thêm. Gói $25/tháng bao gồm auth service nhưng không phải tất cả compute, storage, và egress cho production ở quy mô lớn. Ở 1M MAU bạn sẽ có các Supabase compute add-ons đáng kể trên con số auth-only đó. Khoảng cách trong bảng là thực, nhưng hẹp hơn phần nào khi tính thêm infrastructure overhead.

3. Tự host Supabase thì miễn phí. Docker Compose, không tốn tiền per-MAU. Ở quy mô rất lớn, tổng cost of ownership — chi phí server cộng với thời gian DevOps để vận hành Postgres, GoTrue, và backups — có thể tiệm cận phí của Clerk tùy thuộc vào cơ cấu team. Tự host Supabase ở 1M MAU là lựa chọn khả thi; nó đòi hỏi trách nhiệm vận hành thực sự mà team hai người có thể không đủ bandwidth.

Khả năng tích hợp

Vercel

Cả hai đều chạy được trên Vercel. Clerk được tối ưu nhỉnh hơn: middleware @clerk/nextjs chạy natively trên Edge Runtime, không cần cấu hình thêm. Package @supabase/ssr của Supabase cũng nhắm đến Edge, nhưng helper createClient() trong template with-supabase dùng Node.js cookie APIs. Nếu bạn cần Supabase auth trên Vercel Edge Functions cụ thể, hãy test với @supabase/ssr trực tiếp thay vì template helper.

Với Vercel Functions (Node runtime), cả hai đều chạy không có vấn đề gì. Tích hợp Vercel của Clerk cũng tự set environment variables khi bạn kết nối project trong Clerk dashboard — ít hơn một bước thủ công so với việc copy key Supabase bằng tay.

Cloudflare Workers

Clerk hỗ trợ Cloudflare Workers qua @clerk/backend. Bạn cần Node.js compatibility mode (flag nodejs_compat trong wrangler.toml). Supabase hỗ trợ Workers qua @supabase/supabase-js natively — client dùng Fetch API, không cần flag Node compatibility.

Với Workers-only deployments không có Postgres database, lợi thế kiến trúc chính của Supabase — auth và data cùng vị trí — biến mất. Bạn sẽ dùng Supabase Auth như một hosted service mà không có lợi ích RLS. Trong trường hợp đó, zero-config middleware của Clerk là lựa chọn phù hợp hơn.

Docker / VPS / tự host

Clerk không có khả năng self-host. Đây là ràng buộc cứng, không phải roadmap item. Nếu chính sách deployment yêu cầu auth data phải nằm trong perimeter của bạn — healthcare (HIPAA), regulated finance (SOC 2 Type II với yêu cầu data residency), chính phủ, hoặc air-gapped infrastructure — Clerk không phải lựa chọn.

Supabase tự host qua docker-compose.yml chính thức. Chạy docker compose up khởi động Postgres, GoTrue (auth service), PostgREST, Storage, và Realtime. Auth sessions, user records, và JWT secrets nằm trên phần cứng của bạn. Setup mất khoảng một tiếng; bảo trì liên tục là chi phí thực sự, nhưng quyền kiểm soát cũng là thực sự.

Khuyến nghị cuối cùng

ProfileChọnLý do
Solo dev, side projectSupabasePostgres-native, tự host được, tích hợp RLS
Team nhỏ, B2C product, < 50K usersClerkUI dựng sẵn, ship nhanh hơn
Growth stage, 50K–500K usersSupabaseLợi thế chi phí $500–$6,900/tháng
Enterprise SaaS, cần SAMLClerkSSO cấu hình từ dashboard, không phải tự xây
OSS project / tự hostSupabaseClerk không có tùy chọn self-hosting
Dự án Supabase sẵn cóSupabase AuthHai session stores và hai hóa đơn gây phức tạp

Câu hỏi cốt lõi là: bạn muốn vendor sở hữu hạ tầng auth, hay bạn muốn tự sở hữu?

Clerk là câu trả lời đúng khi auth cần ship ngay hôm nay, khi team có ít bandwidth cho OAuth configuration, hoặc khi enterprise SSO là blocker doanh số bạn không thể trì hoãn. Sự tiện lợi có giá thực — điểm phân kỳ là 50,001 MAU, và khoảng cách tăng nhanh.

Supabase là câu trả lời đúng khi bạn đang dùng Postgres, khi đường cong giá quan trọng ở quy mô mục tiêu của bạn, hoặc khi self-hosting là yêu cầu không thể thương lượng. Chi phí setup là một buổi chiều cho mỗi developer. Chi phí dài hạn thấp hơn đáng kể.

Nếu bạn đang xây B2B SaaS dự tính tăng trưởng, và không bị ràng buộc bởi Vercel Edge Workers-only, hãy bắt đầu với Supabase. Tích hợp RLS một mình đã loại bỏ một danh mục authorization bugs mà Clerk không giải quyết — authorization logic nằm trong database không thể bị vô tình bypass bởi một middleware call bị thiếu. Nếu sau này bạn cần Organizations API hoặc enterprise SSO của Clerk, migration là dự án đáng kể, không phải việc cuối tuần. Xây multi-tenant data model trong Postgres ngay từ đầu và tránh migration đó hoàn toàn.

Nếu bạn đang xây consumer app và muốn có sign-in xong trước bữa trưa, hãy bắt đầu với Clerk. UI components, social auth, và passkeys đạt chất lượng production ngay từ ngày đầu. Xem lại giá ở mức 40K MAU — bạn có một cửa sổ quyết định trước khi đường cong chi phí bẻ gấp.

Nếu bạn đang ở khoảng 40K–50K users ngay bây giờ, đừng chờ đến khi vượt ngưỡng. Migration auth providers khi đang chịu tải là việc khó chịu. Chạy tính toán giá ở projected 12-month MAU và quyết định khi còn có thời gian.

Tham khảo