Next.js에서 로그인 여부에 따라 특정 URL로 리디렉션을 처리하는 방법을 공유합니다. 이번 포스팅에서는 Middleware를 사용해 로그인 여부를 확인하고, HTTP-only 쿠키에서 JWT를 추출해 유저의 접근 권한을 관리하는 방법을 설명합니다.
■ 요구사항
- 로그인한 유저는 /, /login, /signup 경로로 접근 시 /share로 리디렉션합니다.
- 로그인하지 않은 유저는 /, /login, /signup 경로 외의 다른 경로에 접근하면 /로 리디렉션됩니다.
- JWT는 HTTP-only 쿠키에 저장되어 있으며, 브라우저는 이 쿠키의 내용을 직접 읽을 수 없지만, Next.js는 서버 측에서 동작하므로 이를 추출하여 사용할 수 있습니다.
■ 코드 구현
아래는 middleware.ts 파일에 작성한 코드입니다. 이 파일은 Next.js 프로젝트의 app/ 디렉토리 바로 아래에 위치해야 합니다.(공식문서에 아래와 같이 기술되어 있음. 공식문서 바로가기)

## middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(req: NextRequest) {
const token = req.cookies.get('jwt-token'); // HttpOnly 쿠키에서 JWT 가져오기
const excludedPaths = ['/', '/login', '/signup']; // 제외할 경로
// 제외할 경로는 리디렉션을 건너뜀
if (excludedPaths.includes(req.nextUrl.pathname)) {
return token
? NextResponse.redirect(new URL('/share', req.url)) // 쿠키가 있으면 '/share'로 리디렉션
: NextResponse.next(); // 쿠키가 없으면 진행
}
return token
? NextResponse.next() // 쿠키가 있으면 진행
: NextResponse.redirect(new URL('/', req.url)); // 쿠키가 없으면 '/'로 리디렉션
}
export const config = {
matcher: ['/((?!_next|favicon.ico).*)'], // 모든 경로를 포함하지만, Next.js 내부 경로는 제외
};
■ 주요 구현 내용
1. HttpOnly 쿠키에서 JWT 추출
req.cookies.get('jwt-token')를 사용하여 HTTP-only 쿠키에서 JWT를 추출합니다.
HTTP-only 쿠키는 보안상 브라우저에서 JavaScript로 접근할 수 없지만, Next.js의 middleware는 서버 측에서 실행되기 때문에 쿠키를 안전하게 읽을 수 있습니다.
2. 리디렉션 조건 설정
- excludedPaths: 리디렉션에서 제외할 경로 목록입니다. 이 경우 /, /login, /signup이 포함됩니다.
- 로그인 여부(token 존재 여부)에 따라 조건을 처리합니다.
- 로그인한 유저는 excludedPaths에 포함된 경로로 접근할 경우 /share로 리디렉션됩니다.
- 비로그인 유저는 excludedPaths에 포함되지 않은 경로로 접근할 경우 /로 리디렉션됩니다.
3. config.matcher
matcher 설정을 사용하여 Middleware가 실행될 경로를 지정합니다.
- matcher: ['/((?!_next|favicon.ico).*)']는 _next, favicon.ico와 같은 내부 경로를 제외한 모든 사용자 요청 경로에 대해 Middleware가 동작하도록 설정합니다.
'React' 카테고리의 다른 글
[Next.js vs React] 요청 흐름 차이 (0) | 2025.02.17 |
---|---|
[React Query] queryKey란? (0) | 2025.02.10 |
[WebSocket] React로 WebSocket 구현하기(feat.Typescript) (0) | 2025.01.27 |
[useMutation] 매개변수 타입 처리: 한 개와 여러 개의 차이점 (0) | 2025.01.17 |
[TypeScript] 매개변수 처리 방식 (직접 받기 vs 객체로 받기) (0) | 2025.01.14 |