Community코딩 & 개발github.com

clerk/clerk-react-router-patterns

React Router v7 패턴과 Clerk — rootAuthLoader, loaders 내 getAuth, clerkMiddleware, 보호된 라우트, SSR 사용자 데이터, 조직 전환. 트리거: react-router 인증, rootAuthLoader, getAuth loader, react-router 보호된 라우트, loader 인증, SSR 인증 react-router.

clerk-react-router-patterns란 무엇인가요?

이 스킬은 Clerk 인증 라이브러리와 React Router v7을 통합하는 표준 패턴을 제공합니다. rootAuthLoader, getAuth와 같은 유틸리티를 loaders에서 사용하여 서버 측 인증을 처리하고, clerkMiddleware로 미들웨어 수준에서 보호된 라우트를 구성합니다. 또한 SSR 환경에서 사용자 데이터를 안전하게 전달하고, 조직(org) 전환 기능을 구현하는 방법을 다룹니다. 이 스킬은 react-router 인증, rootAuthLoader, getAuth loader, react-router 보호된 라우트, loader 인증, SSR auth react-router와 같은 주제에 대한 코드 예제와 문서를 제공하여 개발자가 빠르게 적응할 수 있도록 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
Part ofReact
npx skills add https://github.com/clerk/skills/tree/main/skills/clerk-react-router-patterns

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

clerk-react-router-patterns은(는) 무엇을 하나요?

React Router v7과 Clerk를 함께 사용하는 패턴 — rootAuthLoader, loaders 내 getAuth, clerkMiddleware, 보호된 라우트, SSR 사용자 데이터, 조직 전환. 다음 주제에서 트리거됩니다: react-router 인증, rootAuthLoader, getAuth loader, react-router 보호된 라우트, loader 인증, SSR 인증 react-router.

주요 개념

  • rootAuthLoader: 애플리케이션의 루트에서 인증 상태를 로드하는 함수입니다.
  • getAuth: loader 함수 내에서 현재 사용자의 인증 정보를 가져옵니다.
  • clerkMiddleware: 요청 파이프라인에서 인증을 처리하는 미들웨어입니다.
  • 보호된 라우트: 인증되지 않은 사용자가 접근하지 못하도록 보호하는 라우트입니다.
  • SSR 사용자 데이터: 서버 사이드 렌더링 중에 사용자 데이터를 안전하게 전달합니다.
  • 조직 전환: 사용자가 여러 조직 간 전환할 수 있도록 지원합니다.

사용 예제

rootAuthLoader 사용

import { rootAuthLoader } from "@clerk/react-router";
import { RootAuthLoader } from "@clerk/react-router/rootAuthLoader";

// app/root.tsx
export const loader = rootAuthLoader(({ request, params }) => {
  // 여기서 인증된 사용자 데이터에 접근할 수 있습니다.
  const { userId, sessionId, getToken } = request.auth;
  
  return { userData: { userId } };
});

getAuth in Loaders

import { getAuth } from "@clerk/react-router";

// app/routes/protected.tsx
export async function loader({ request }: { request: Request }) {
  const { userId } = getAuth(request);
  
  if (!userId) {
    throw new Response("Unauthorized", { status: 401 });
  }
  
  return { userId };
}

clerkMiddleware 설정

// app/middleware.ts
import { clerkMiddleware } from "@clerk/react-router";

export const middleware = clerkMiddleware();

// 선택적으로 보호할 라우트 패턴 지정
export const config = {
  matcher: ["/((?!_next|static|favicon.ico).*)"]
};

보호된 라우트 구현

import { getAuth } from "@clerk/react-router";
import { json, redirect } from "react-router";

// app/routes/dashboard.tsx
export async function loader({ request }: { request: Request }) {
  const { userId } = getAuth(request);
  
  if (!userId) {
    return redirect("/sign-in");
  }
  
  const user = await getUser(userId);
  return json({ user });
}

SSR 사용자 데이터 전달

// app/root.tsx
export async function loader() {
  const auth = await rootAuthLoader();
  return { auth };
}

export default function Root({ loaderData }: { loaderData: { auth: AuthState } }) {
  const { auth } = loaderData;
  
  return (
    <html>
      <head>... </head>
      <body>
        <ClerkProvider auth={auth}>
          <Outlet />
        </ClerkProvider>
      </body>
    </html>
  );
}

조직 전환 (Organization Switching)

import { useOrganization, useOrganizationList } from "@clerk/react-router";

function OrganizationSwitcher() {
  const { organization } = useOrganization();
  const { setActive, isLoaded } = useOrganizationList({
    userMemberships: { infinite: true }
  });
  
  if (!isLoaded) return null;
  
  return (
    <select
      value={organization?.id}
      onChange={(e) => {
        const org = e.target.value;
        setActive({ organization: org });
      }}
    >
      {organizationList?.map((orgMember) => (
        <option key={orgMember.organization.id} value={orgMember.organization.id}>
          {orgMember.organization.name}
        </option>
      ))}
    </select>
  );
}

참고 자료

트리거 조건

이 패턴들은 다음 키워드가 감지될 때 제공됩니다:

  • react-router auth
  • rootAuthLoader
  • getAuth loader
  • react-router protected route
  • loader authentication
  • SSR auth react-router

Individual skills in this repo

This repo contains 19 individual skills — each has its own dedicated page.

clerk/clerk

Clerk authentication router. Use when user asks about adding authentication, setting up Clerk, custom sign-in flows, Swift or native iOS auth, native Android auth, Next.js patterns, React patterns, Vue patterns, Nuxt patterns, Astro patterns, TanStack Start patterns, Expo patterns, React Router patterns, Chrome Extension patterns, organizations, billing, subscriptions, payments, pricing, plans, seat-based pricing, feature entitlements, syncing users, or testing. Automatically routes to the specific skill based on their task.

clerk/clerk-android

Implement Clerk authentication for native Android apps using Kotlin and Jetpack Compose with clerk-android source-guided patterns. Use for prebuilt AuthView/UserButton or custom API-driven auth flows. Do not use for Expo or React Native projects.

clerk/clerk-astro-patterns

Astro patterns with Clerk — middleware, SSR pages, island components, API routes, static vs SSR rendering. Triggers on: astro clerk, clerk astro middleware, astro protected page, clerk island component, astro API route auth, clerk astro SSR.

clerk/clerk-backend-api

Clerk Backend REST API explorer and executor. Browse tags, inspect endpoint schemas, and execute authenticated requests. Use when listing users, managing organizations, or calling any Clerk API endpoint.

clerk/clerk-billing

Clerk Billing for subscription management - render Clerk's PricingTable and in-app checkout drawer, configure subscription plans, seat-limit plans for B2B, feature entitlements with has(), and billing webhooks. Use for SaaS monetization, plan gating, checkout flows, trials, invoicing, and subscription lifecycle management.

clerk/clerk-chrome-extension-patterns

Chrome Extension auth with @clerk/chrome-extension -- popup/sidepanel setup, syncHost for OAuth/SAML via web app, createClerkClient for service workers and headless extensions, stable CRX ID. Triggers on: Chrome extension auth, Plasmo clerk, popup sign-in, syncHost, background service worker token, createClerkClient, headless extension.

clerk/clerk-custom-ui

Custom authentication flows and component appearance - hooks (useSignIn, useSignUp), themes, colors, fonts, CSS. Use for custom sign-in/sign-up flows, appearance styling, visual customization, branding.

clerk/clerk-expo

Implement Clerk authentication for Expo and React Native apps using @clerk/expo source-guided patterns. Use for prebuilt AuthView/UserButton or custom hook-driven auth flows. Do not use for native iOS/Swift, native Android/Kotlin, or web framework projects.

clerk/clerk-expo-patterns

Expo / React Native patterns with Clerk — SecureStore token cache, OAuth deep linking, useAuth in native, Expo Router protected routes, push notifications with user context. Triggers on: expo clerk, clerk react native, SecureStore token cache, expo router auth, OAuth deep link clerk, mobile auth clerk.

clerk/clerk-nextjs-patterns

Advanced Next.js patterns - middleware, Server Actions, caching with Clerk.

clerk/clerk-nuxt-patterns

Nuxt 3 auth patterns with @clerk/nuxt - middleware, composables, server API routes, SSR. Triggers on: Nuxt auth, useAuth composable, clerkMiddleware Nuxt, server API Clerk, Nuxt route protection.

clerk/clerk-orgs

Clerk Organizations for B2B SaaS - create multi-tenant apps with org switching, role-based access, verified domains, and enterprise SSO. Use for team workspaces, RBAC, org-based routing, member management.

clerk/clerk-react-patterns

React SPA auth patterns with @clerk/react for Vite/CRA - ClerkProvider setup, useAuth/useUser/useClerk hooks, React Router protected routes, custom sign-in flows. Triggers on: Vite Clerk setup, React Router auth, useAuth hook, protected route, custom sign-in form React.

clerk/clerk-setup

Add Clerk authentication to any project by following the official quickstart guides.

clerk/clerk-swift

Implement Clerk authentication for native Swift and iOS apps using ClerkKit and ClerkKitUI source-guided patterns. Use for prebuilt AuthView or custom native flows. Do not use for Expo or React Native projects.

clerk/clerk-tanstack-patterns

TanStack React Start auth patterns with @clerk/tanstack-react-start - createServerFn, beforeLoad guards, loaders, Vinxi server. Triggers on: TanStack auth, createServerFn clerk, beforeLoad protection, TanStack Start middleware.

clerk/clerk-testing

E2E testing for Clerk apps. Use with Playwright or Cypress for auth flow tests.

clerk/clerk-vue-patterns

Vue 3 patterns with Clerk — composables (useAuth, useUser, useClerk, useOrganization), Vue Router guards, Pinia auth store integration. Triggers on: vue clerk, useAuth vue, clerk composables, vue router clerk guard, pinia auth clerk. For Nuxt, use clerk-nuxt-patterns instead.

clerk/clerk-webhooks

Clerk webhooks for real-time events and data syncing. Verify with verifyWebhook from the framework-specific package. Handle user, session, organization, billing, and payment events. Build event-driven features like database sync, notifications, and integrations.

관련 스킬