結論(おすすめ1つ)
ほとんどのSPAおよびNext.jsプロジェクトには Clerk への移行を勧める。
React/Next.js との統合が最も薄く、<SignIn /> コンポーネントを貼るだけで MFA・ソーシャルログイン・セッション管理が揃う。Auth0 で頭を悩ませがちな「テナント設定の複雑さ」と「ルールの負債」を引き継がずに済む。ただし自前 DB に認証データを持ちたい場合は Supabase Auth、エンタープライズ SSO が主目的なら WorkOS を選ぶこと。
比較表(料金/無料枠/移行コスト/対応言語)
| 項目 | Auth0 | Clerk | Supabase Auth | WorkOS |
|---|---|---|---|---|
| 無料枠 | 公式の料金ページで要確認 | 公式の料金ページで要確認 | 公式の料金ページで要確認 | 公式の料金ページで要確認 |
| 有料プラン開始 | 公式の料金ページで要確認 | 公式の料金ページで要確認 | 公式の料金ページで要確認 | 公式の料金ページで要確認 |
| 移行コスト(感覚値) | 基準 | 低〜中(UI層の差し替えが主) | 中(DB移行が伴う) | 中〜高(SAML/SCIM設定が主) |
| React SDK | あり | ファーストクラス | あり(@supabase/auth-ui-react) |
あり(@workos-inc/authkit-react) |
| Next.js App Router対応 | 部分的 | ネイティブ対応 | 手動実装が必要な箇所あり | あり |
| セルフホスト | 不可 | 不可 | 可(Supabase OSS) | 不可 |
| SAML/SCIM | 高額プランのみ | エンタープライズ向けに提供 | 限定的 | コア機能 |
| ユーザーデータの所在 | Auth0テナント | Clerkテナント | 自前 Postgres | WorkOSテナント |
移行手順
1. Clerk への移行(Next.js App Router の場合)
パッケージのインストール
npm install @clerk/nextjs
環境変数の設定(.env.local)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxxx
CLERK_SECRET_KEY=sk_test_xxxx
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard
ルートレイアウトへの組み込み(app/layout.tsx)
import { ClerkProvider } from '@clerk/nextjs'
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<ClerkProvider>
<html lang="ja">
<body>{children}</body>
</html>
</ClerkProvider>
)
}
ミドルウェアによるルート保護(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|.*\\..*).*)'],
}
既存ユーザーの移行
Auth0 の Management API でユーザーリストを取得し、Clerk の Backend API POST /v1/users でインポートする。パスワードハッシュは Clerk の password_hasher パラメータで bcrypt / argon2 を指定できる。
# Auth0からユーザーエクスポート(Auth0 CLIが必要)
auth0 users export --format json > users.json
# Clerkへの一括インポート(Node.jsスクリプト例)
node scripts/import-to-clerk.mjs
2. Supabase Auth への移行(既存DBがある場合)
npm install @supabase/supabase-js @supabase/auth-ui-react @supabase/auth-ui-shared
// lib/supabase.ts
import { createClient } from '@supabase/supabase-js'
export const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
Auth0 の sub をユーザーIDとして使っていた箇所は、Supabase の user.id(UUID)へ置換する必要がある。外部キーの張り替えが必要になるため、移行前にスキーマの影響範囲を洗い出すこと。
向き不向き
Clerk が向くケース
- Next.js / React を中心とした SPA・SSR プロジェクト
- 少人数チームで認証に工数をかけたくない
- Auth0 のルール・アクションが複雑化して保守が辛くなってきた
- B2C プロダクトで MFA・パスキー・ソーシャルログインを素早く揃えたい
Clerk を避けるべきケース
- データを自社インフラ外に出せない規制業種(医療・金融)
- セルフホストが必須要件
- Next.js 以外のフレームワークが中心で SDK サポートが手薄になる
Supabase Auth が向くケース
- すでに Supabase を DB として使っている、または使う予定がある
- 認証データを自前 Postgres で管理したい
- OSS版でセルフホストして完全にコントロールしたい
Supabase Auth を避けるべきケース
- SAML SSO や SCIM プロビジョニングが必須の B2B SaaS
- 認証だけ切り出して独立させたい(Supabase の他機能とセット前提の設計になる)
WorkOS が向くケース
- エンタープライズ顧客向けの B2B SaaS で SAML・SCIM が契約要件になっている
- Okta / Azure AD / Google Workspace との接続が主目的
- Auth0 Enterprise プランのコストが重くなってきた大規模チーム
WorkOS を避けるべきケース
- ユーザー数が少なく SAML が不要な段階(オーバースペック)
- B2C プロダクト(コア強みが B2B SSO なので恩恵が薄い)
- 認証 UI を自前で細かく作り込みたいチーム
If you found this useful: I packaged 50 copy-paste AI debugging prompts + drop-in Claude Code config templates (CLAUDE.md, settings.json, MCP) into a small kit.
Launch deal: code START50 = 50% off → 50 AI Debugging Prompts + Claude Code Config Pack (about $6, 50% off applied)
New: my 10-chapter ebook Practical Claude Code — automation & unattended operation (about $9, 50% off applied)
Top comments (0)