블로그를 준비하고 있어요
잠시만 기다려주세요...
NextAuth를 이용한 Protected Routes 설정NextAuth를 이용한 Protected Routes 설정
nextjs
오늘은 NextAuth를 이용한 Protected Routes 설정을 알아보자.
정말 여기에 대한 글이 중구 난방이라 애먹었다.
일단 최대한 공식 문서를 이용해서 적어본다.
1. 이 글을 쓰게 된 이유

NextAuth를 이용해 로그인은 이제 구현했다.
문제는 라우트 보호와 리다이렉션을 함께 이용하고 싶을 때였다.
로그인을 하지 않은 유저나, 로그인한 유저나 모두 루트 경로인 "/"로 접속하면 "/category"로 리다이렉션 하고 싶었다.
그리고 로그인한 사람들은 "/profile"이나 "/login" 경로는 막고 싶었던 것.
하지만 이에 대한 글도 별로 없고, chatgpt도 자꾸 헛소리만 해대니 너무 답답했다.
2. NextAuth 공식 문서

해당 링크로 접속하면 NextAuth와 middleware를 어떤식으로 결합하여 사용하는지 나와있다.
import { withAuth } from "next-auth/middleware";
export default withAuth(
function middleware(req) {
console.log(req.nextauth.token);
},
{
callbacks: {
authorized: ({ token }) => token?.role === "admin",
},
}
);
export const config = { matcher: ["/admin"] };
여기서의 핵심은 middleware를 withAuth로 감싸면 요청자의 토큰에 접근할 수 있다는 것.
토큰이 필요 없다면 middleware 내부에서 처리하고, authorized가 필요하면 callbacks로 넘겨서 처리하면 된다.
middleware에서도 처리는 가능하니, 굳이 또 callback으로 넘기지 않아도 상관은 없을듯 하다.
3. 기능 구현하기
withAuth로 middleware를 감싸준다.
그냥 간략하게 하면 withAuth(middleware, callbacks: {}) 형식이다.
요청이 들어오면 미들웨어에서 한번 처리하고, 그 다음으로 넘겨주는 것.
import { withAuth } from "next-auth/middleware";
import { NextResponse } from "next/server";
export default withAuth(
function middleware(req) {
if (req.nextUrl.pathname === "/") {
return NextResponse.redirect(new URL("/category", req.url));
}
if (
req.nextauth.token?.authLevel !== "admin" &&
req.nextUrl.pathname.startsWith("/dashboard")
) {
return NextResponse.redirect(new URL("/category", req.url));
}
return NextResponse.next();
},
{
callbacks: {
authorized: ({ token, req }) => {
if (req.nextUrl.pathname.startsWith("/profile")) {
return !!token;
}
return true;
},
},
}
);
export const config = {
matcher: [
"/((?!api|_next/static|_next/image|.*\\.avif$).*)",
"/",
"/dashboard",
"/profile/:path*",
],
};
이렇게 하면 모든 사용자가 "/"로 접속시 "/category"로 리다렉션 된다.
로그인 한 사용자 중 권한이 "admin"이 아닌 사용자는 "/dashboard" 경로로 접근시 리다이렉션 된다.
그리고 로그인하지 않은 사용자가 "/profile"로 접근시 로그인 화면을 띄워준다.
그 이외의 것들은 토큰을 이리저리 요리하면 가능할 것이다.
4. 후기
최근의 웹개발 트랜드를 따라간다는 것이 일반인으로 쉽지 않음을 다시 한번 느꼈다.
express는 이미 쌓인 데이터가 많기에 인공지능에 입력 한번이면 줄줄 코드를 만들어 주는데, Nextjs는 그렇지 않다.
레딧이나, 스택오버플로우에서도 AI가 최신의 트랜드를 따라가지는 못한다는 후기가 많은 듯 하다.
그래서 개발자가 아직은(?) 필요한지도 모르겠다.
영어 실력을 키워서 공식문서나 열심히 읽어봐야 겠다.
댓글을 불러오는 중...