framework/NextJS
๐ Next.js App Router ์ธ์ฆ ๊ตฌํ ๊ฐ์ด๋
octo54
2025. 4. 30. 11:00
๋ฐ์ํ
๐ Next.js App Router ์ธ์ฆ ๊ตฌํ ๊ฐ์ด๋
Next.js App Router ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์ฆ(Authentication) ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์ต๋๋ค.
NextAuth.js, ๋ฏธ๋ค์จ์ด, ์ธ์
๊ด๋ฆฌ ๋ฑ ์ค์ ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ ๋ต ์์ฃผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
โ 1. ์ธ์ฆ์ ํต์ฌ ๊ฐ๋
- Authentication: ์ฌ์ฉ์์ ์ ์์ ํ์ธ (๋ก๊ทธ์ธ)
- Authorization: ๊ถํ ๋ถ์ฌ (์ ๊ทผ ์ ์ด)
- Session Management: ๋ก๊ทธ์ธ ์ํ ์ ์ง (์ฟ ํค, JWT ๋ฑ)
โ 2. NextAuth.js๋ก ์ธ์ฆ ๊ตฌํํ๊ธฐ
์ค์น
npm install next-auth
ํ๊ฒฝ๋ณ์ ์ค์ (.env)
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=long-random-string
→ secret ๊ฐ์ openssl rand -base64 32 ๋ช ๋ น์ด๋ก ์์ฑ ๊ฐ๋ฅ
API ๋ผ์ฐํธ ์์ฑ
// app/api/auth/[...nextauth]/route.ts
import NextAuth from 'next-auth';
import GitHubProvider from 'next-auth/providers/github';
const handler = NextAuth({
providers: [
GitHubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
}),
],
});
export { handler as GET, handler as POST };
โ 3. ๋ก๊ทธ์ธ/๋ก๊ทธ์์ UI
๋ฐ์ํ
// app/login/page.tsx
'use client';
import { signIn } from 'next-auth/react';
export default function LoginPage() {
return (
<div>
<h2>๋ก๊ทธ์ธ</h2>
<button onClick={() => signIn('github')}>GitHub ๋ก๊ทธ์ธ</button>
</div>
);
}
// app/dashboard/page.tsx
'use client';
import { signOut } from 'next-auth/react';
export default function DashboardPage() {
return (
<div>
<h2>๋์๋ณด๋</h2>
<button onClick={() => signOut()}>๋ก๊ทธ์์</button>
</div>
);
}
โ 4. ์ธ์ ํ์ธ ๋ฐ ๋ฆฌ๋๋ ์
'use client';
import { useSession } from 'next-auth/react';
import { useEffect } from 'react';
import { useRouter } from 'next/navigation';
export default function Dashboard() {
const { data: session, status } = useSession();
const router = useRouter();
useEffect(() => {
if (status === 'unauthenticated') {
router.push('/login');
}
}, [status]);
if (status === 'loading') return <p>๋ก๋ฉ ์ค...</p>;
return <div>ํ์ํฉ๋๋ค, {session?.user?.name}๋!</div>;
}
โ 5. ๋ผ์ฐํธ ๋ณดํธ ๋ฏธ๋ค์จ์ด ์ค์
// middleware.ts
import { NextRequest, NextResponse } from 'next/server';
export function middleware(req: NextRequest) {
const token = req.cookies.get('next-auth.session-token');
const isProtected = req.nextUrl.pathname.startsWith('/dashboard');
if (isProtected && !token) {
return NextResponse.redirect(new URL('/login', req.url));
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*'],
};
์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํน์ ๊ฒฝ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
โ 6. ๊ธฐํ ์ธ์ฆ ์๋ฃจ์ ๋์
์๋ฃจ์ ํน์ง
Auth0 | OAuth, MFA, ๊ท์ ์ค์ |
Clerk | UI/์ธ์ ํตํฉ ์ ๊ณต |
Supabase | Firebase ๋์ฒด, ๋ด์ฅ ์ธ์ฆ |
Firebase | Google ์ํ๊ณ ํตํฉ |
๐ ์ฐธ๊ณ ๋ฌธ์์ด (URL)
https://nextjs.org/docs/app/guides/authentication
Next.js, App Router, ์ธ์ฆ ๊ตฌํ, NextAuth, ๋ก๊ทธ์ธ, OAuth, ์ธ์ ๊ด๋ฆฌ, ๋ฏธ๋ค์จ์ด ๋ณดํธ, ํด๋ผ์ด์ธํธ ์ธ์ฆ, ๋ณด์ ์ ๋ต, SEO ์ต์ ํ 10๊ฐ