1. 전체 흐름 개요
Next.js에서 로그인 인증은 보통 다음과 같은 흐름으로 구성됩니다:
1. 사용자가 로그인 → 서버에서 JWT 발급
2. JWT를 쿠키에 저장 (`HttpOnly`)
3. 요청마다 쿠키 확인 → 인증 상태 유지
4. middleware에서 인증 여부 확인 → 리디렉션
5. 인증된 사용자만 접근 가능한 레이아웃 구성
2. 로그인 요청 처리(API)
// app/api/login/route.ts
import { cookies } from 'next/headers';
export async function POST(request: Request) {
const body = await request.json();
const token = await loginAndGetToken(body); // 인증 처리 로직
cookies().set('accessToken', token, {
httpOnly: true,
path: '/',
secure: true,
});
return new Response(JSON.stringify({ success: true }));
}
✅ cookies().set()으로 서버 쿠키 설정
✅ httpOnly 옵션으로 XSS 방지
3. middleware.ts로 보호
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('accessToken');
// 인증 안 된 사용자는 로그인 페이지로 리디렉션
if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
// 로그인 사용자가 로그인 페이지 접근 시 홈으로
if (token && request.nextUrl.pathname === '/login') {
return NextResponse.redirect(new URL('/dashboard', request.url));
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*', '/login'],
};
4. 인증된 사용자 전용 레이아웃
// app/dashboard/layout.tsx
import { cookies } from 'next/headers';
import { redirect } from 'next/navigation';
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
const token = cookies().get('accessToken');
if (!token) redirect('/login');
return (
<div>
<Sidebar />
<main>{children}</main>
</div>
);
}
✅ 서버 컴포넌트 안에서 redirect() 사용 가능
✅ middleware와 중복되더라도 보안 이중 방어로 추천
5. 로그아웃 처리
// app/api/logout/route.ts
import { cookies } from 'next/headers';
export async function POST() {
cookies().delete('accessToken');
return new Response(null, { status: 204 });
}
클라이언트에서는 버튼 클릭 시 /api/logout 호출 후 /login으로 이동하면 됨
💡 요약
Next.js의 App Router 환경에서는 `middleware`와 `cookies`를 활용한 인증 흐름이 매우 강력하고 깔끔합니다.
- 로그인 시 JWT를 쿠키로 저장
- middleware로 보호 라우팅 설정
- layout.tsx 안에서 서버 렌더링 기준 인증 검사
정적인 페이지와 다르게, 접근 제어를 서버단에서 확실하게 할 수 있어 보안에 유리합니다.
'FE > React' 카테고리의 다른 글
| Next.js + React Query + Zustand 실무 패턴 정리 (0) | 2025.05.11 |
|---|---|
| [Next.js 라우팅] 페이지 이동하는 4가지 방법 (App Router 실무 기준) (0) | 2025.05.10 |
| [Next.js Middleware 완전 정복] 로그인 인증, 리디렉션, 권한 제어까지 실무 예제로! (0) | 2025.05.09 |
| [Next.js] 서버 컴포넌트 vs 클라이언트 컴포넌트 – 개념, 차이, 예시까지! (0) | 2025.05.09 |
| [React Hook Form + Zod] 실무에서 쓰는 폼 검증 완전 정리 (yup과의 차이까지!) (0) | 2025.05.08 |