結論(おすすめ1つ)
乗り換え先の推薦:Clerk
Auth0 からの移行先として、大半の SPA/Next.js プロジェクトには Clerk が最もコストパフォーマンスが高い。理由は三点:① UI コンポーネントが同梱されており認証フローをほぼゼロ実装で置き換えられる、② JWT/Session Token の切り替えが設定一つで完結する、③ Auth0 の「Organizations」に相当するマルチテナント機能が標準搭載されている。WorkOS は SSO/SAML が最優先の B2B 向け、Supabase Auth は Supabase の DB を既に使っている場合に限り有利な選択肢だ。
比較表(料金/無料枠/移行コスト/対応言語)
| 項目 | Auth0 | Clerk | Supabase Auth | WorkOS |
|---|---|---|---|---|
| 無料枠 MAU | 公式料金ページで要確認 | 公式料金ページで要確認 | 公式料金ページで要確認 | 公式料金ページで要確認 |
| 有料開始価格 | 公式料金ページで要確認 | 公式料金ページで要確認 | 公式料金ページで要確認 | 公式料金ページで要確認 |
| 移行コスト | ― | 低〜中(SDK入替+JWT検証変更) | 中(GoTrue API の理解が必要) | 中〜高(SSO設定が前提) |
| SDK の充実度 | ◎ | ◎(React/Next.js/Remix 中心) | ○(Supabase JS 中心) | ○(Node/Go 中心) |
| 対応言語 | Node/Python/Go/Java 等 | JS/TS(他は REST API) | JS/TS/Dart/Python 等 | Node/Python/Go/Ruby 等 |
| マルチテナント | 有(Organizations) | 有(Organizations) | 要自前実装 | 有(Enterprise SSO 中心) |
| エンタープライズ SSO | 有(上位プランのみ) | 有 | 限定的 | ◎(中心機能) |
| セルフホスト | 不可 | 不可 | 可(OSS) | 不可 |
料金は変動が激しいため、各サービスの公式料金ページで必ず最新値を確認すること。
移行手順
Auth0 → Clerk への移行を例に、実際に動くコマンドと設定を示す。
Step 1:Clerk アプリを作成して API キーを取得
Clerk ダッシュボード(clerk.com)でアプリを新規作成し、Publishable Key と Secret Key を取得する。
Step 2:SDK を入れ替える
# Next.js の場合
npm install @clerk/nextjs
# 既存の Auth0 パッケージを削除
npm uninstall @auth0/nextjs-auth0
Step 3:環境変数を差し替える
.env.local を以下のように更新する。
# 削除する Auth0 変数
# AUTH0_SECRET=...
# AUTH0_ISSUER_BASE_URL=...
# AUTH0_CLIENT_ID=...
# AUTH0_CLIENT_SECRET=...
# 追加する Clerk 変数
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_xxxxxxxxxx
CLERK_SECRET_KEY=sk_live_xxxxxxxxxx
Step 4:ミドルウェアを置き換える
// middleware.ts
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
const isPublicRoute = createRouteMatcher(['/sign-in(.*)', '/sign-up(.*)']);
export default clerkMiddleware((auth, req) => {
if (!isPublicRoute(req)) auth().protect();
});
export const config = {
matcher: [
'/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico)).*)',
'/(api|trpc)(.*)',
],
};
Step 5:UI コンポーネントを差し替える
// Before(Auth0)
import { useUser } from '@auth0/nextjs-auth0/client';
// After(Clerk)
import { useUser, UserButton, SignInButton } from '@clerk/nextjs';
export function Header() {
const { isSignedIn } = useUser();
return (
<header>
{isSignedIn ? <UserButton afterSignOutUrl="/" /> : <SignInButton />}
</header>
);
}
Step 6:既存ユーザーをインポートする
Auth0 の Management API でユーザーリストをエクスポートし、Clerk の Backend API でインポートする。Auth0 はパスワードハッシュをエクスポートできないため、初回ログイン時にパスワードリセットを促すフローを実装するのが現実的だ。
# Auth0 Management API でユーザーをエクスポート(要 Management API トークン)
curl -X GET "https://YOUR_DOMAIN.auth0.com/api/v2/users" \
-H "Authorization: Bearer $AUTH0_MGMT_TOKEN" \
-o users_export.json
# Clerk Backend API でユーザーをインポート(Node スクリプト例)
node scripts/import_users_to_clerk.js
向き不向き
Clerk が向くケース
- Next.js/React 中心のチーム:公式コンポーネントをそのまま使えるため実装工数が最小で済む。
- 1〜20 名規模のスタートアップ:Auth0 の設定複雑さに疲れており、すぐに動かしたい場合。
- マルチテナント SaaS を構築している:Organizations が標準搭載されており追加実装が少ない。
Supabase Auth が向くケース
- Supabase の PostgreSQL を既に使っている:Row Level Security と Auth を一体化できるため二重管理が不要になる。
- セルフホストが必要なプロジェクト:Auth0・Clerk・WorkOS はすべてクラウド専用だが、Supabase はセルフホスト可能。
WorkOS が向くケース
- エンタープライズ顧客への SAML/OIDC SSO が必須の B2B SaaS:この用途に特化しており、管理 UI が最も整っている。
- Active Directory 連携(SCIM)が要件:ディレクトリ同期の実装コストが他と比べて大幅に低い。
避けるべきケース
- Clerk:iOS/Android ネイティブアプリが主体のプロジェクトには SDK の厚みが不足することがある。REST API 経由での実装は可能だが、Auth0 のモバイル SDK と比べると薄い。
- Supabase Auth:Supabase の DB や Storage を使わず Auth 単体だけを採用するのはオーバーヘッドが大きい。認証専用なら Clerk の方が素直に使える。
- WorkOS:B2C のソーシャルログインが主体で大量 MAU を想定するプロジェクトには過剰設計になりやすい。料金体系もエンタープライズ前提のため、採用前に必ず公式料金ページで確認すること。
Top comments (0)