크레센도는 로그인 여부에 따라 접근이 제한된 페이지가 있다.
그러므로 비로그인 상태라면 해당 페이지에 접근하지 못하도록 액션을 취해주어야 한다. (예를 들면, url 직접 접근..)
Next.js는 페이지 라우팅을 사용하기 때문에 useEffect
를 사용해서 클라이언트
상에서 가드를 해야한다. 즉, 일종의 Provider
를 생성해서 감쌀 것이다. 하지만, 클라이언트 단에서 로직이 실행되면
- 껍데기라도 화면 노출이 발생할 수 있다.
- API 콜이 들어갈 수 있으며
ErrorBoundary
를 적용했을 경우FallbackComponent
가 최종적으로 보일 수 있다.
이 문제점을 해결하고자 더 좋은 방법을 알아보던 도중 Next.js에서 제공하는 기능인 middleware를 알게 되었다.
https://nextjs.org/docs/pages/building-your-application/routing/middleware
미들웨어를 사용하면 request가 완료되기 전 실행되며 원하는 response를 rewriting, redirecting, modifying 할 수 있다.
pages 폴더와 동일한 레벨에 middleware.ts 파일을 위치시킨다.
필자는 src dir를 사용하고 있다.
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(req: NextRequest) {
const token = req.cookies.get(TOKEN_KEY);
if (!token) return NextResponse.redirect(new URL('/', req.url));
// 토큰이 없을 경우 리다이렉트
}
export const config = {
matcher: ['/mypage/:path*', '/study/create'],
};
사용자에게 화면을 비춰지지 않고 우선적으로 응답을 수정할 수 있는 것 뿐만 아니라, middleware 파일 내에서 Redirection 로직을 모두 관리할 수 있다는 점이 좋았다.
추후 구현될 기능에서 로그인 권한뿐만 아니라 사용자 권한에 따라 가드를 적용해야 하는데, 클라이언트 상에서 처리할지 미들웨어에서 처리할지 고민이다.