오늘은 react-router-dom을 사용하여 보호된 라우트(Protected Route) 기능을 추가했습니다.
인증되지 않은 사용자가 특정 페이지에 접근하면 알림을 띄우고, 리디렉션하는 기능을 제작하였습니다.
이번 프로젝트는 createBrowserRouter()를 사용하여 라우팅을 설정했습니다.
평소에는 BrowserRoute를 감싸 사용했는데 이번 프로젝트는 저번에 배웠던 내용을 살려 createBrowserRouter()를 사용하여 라우팅을 설정했습니다.
인증이 필요한 페이지는 ProtectedRouter라는 컴포넌트를 새로 만들어 Outlet태그를 이용해 보호했습니다.
const router = createBrowserRouter([
{
path: "/",
element: <SiteLayout />,
children: [
{ path: "", element: <Home /> },
{ path: "/signup", element: <SignUp /> },
{ path: "/login", element: <Login /> },
{ path: "/board", element: <Board /> },
{
path: "",
element: <ProtectedRouter />, // ✅ 인증이 필요한 페이지 보호
children: [
{ path: "/mbti", element: <Test /> },
{ path: "/result", element: <Result /> },
{ path: "/profile", element: <Profile /> },
{ path: "/stats", element: <Stats /> },
],
},
],
},
]);
ProtectedRouter로 인증이 필요한 페이지를 감싸 관리하여 보호ProtectedRouter는 로그인 상태를 확인한 후, 인증되지 않은 경우 경고를하여 로그인 페이지로 리디렉션하는 로직이 있는 컴포넌트입니다.
useEffect(() => {
if (!isAuthenticated) {
Swal.fire({
title: "로그인이 필요합니다!",
text: "로그인 후 이용해주세요.",
icon: "warning",
confirmButtonText: "확인",
}).then(() => {
setTimeout(() => {
navigate("/login", { state: { from: location }, replace: true });
}, ONE_SECOND_BEFORE_GO_LOGIN_PAGE);
});
}
}, [isAuthenticated, navigate, location]);
sweetalert2를 사용해 경고창 띄우기navigate로 로그인 페이지로 이동하도록 .then 체이닝사용자 경험(UX)을 고려하여 원래 가려던 페이지로 이동할 수 있도록 location.state.from을 활용하여 가려던 페이지의 경로를 저장하여 로그인 성공 후 불러왔습니다.
const handleLogin = () => {
login(); // ✅ Zustand에서 로그인 상태 업데이트
const redirectTo = location.state?.from?.pathname || "/";
navigate(redirectTo, { replace: true });
};
location.state?.from?.pathname을 확인이번 개인 과제의 시작으로 라우팅을 먼저 구성하였는데 이 과정에서 평소에 쓰던 BrowserRouter를 사용하는 것이 다른 방법을 사용하였습니다. 이 과정에서 라우팅의 개념을 더욱 깊숙히 이해 할 수 있었으며 Outlet, RouterProvider등 여러 태그를 사용해보아 좋았습니다.
또, 인증/인가를 통한 사이트 보호는 어떤 로직을 통해 이루어지는지 알았으며 UX적으로 완성도가 높은 페이지를 이해하는 시간이 되었습니다.