-
[react] react-router-dom으로 페이지 접근을 막자!React.js/react 2023. 8. 23. 02:21
개발 시 비로그인 상태의 유저가 들어갈 수 없는 페이지같은,
사용자의 권한에 따라 페이지의 접근을 제한하는 경우를 많이 볼 수 있다.
개인 프로젝트를 진행하면서 이같은 상황에 맞닥뜨리게 되어 해결책을 생각해 보았다.
1) 네비게이션 바 메뉴를 클릭할 때 처리한다?
- 이는 사용자가 직접 주소창을 이용해 접근할 수 있다.
2) 해당 페이지에서 useEffect hook으로 처리한다?
- 로그인을 원할 시 로그인 페이지로 이동시킨다.
- 로그인을 원하지 않을 시 메인페이지로 이동시킨다.
- 이 방법을 사용하려고 했지만, 정상적으로 동작하지 않았다. 처음 페이지 진입 시에는 잘 동작했지만, 두번째부터는 리렌더링이 발생하지 않아서 경고창 자체가 뜨지 않았다. data fetch나 상태 관리를 recoil로 구현했기 때문에 값을 캐싱해서 그런...가?
- 접근을 제한해야 하는 페이지마다 해당 로직을 구현해야 하기 때문에 비효율적이다.
3) react-router-dom으로 처리한다!
import { Navigate } from "react-router-dom"; const PrivateRoute = ({ isSignedIn, component: Component }) => { return isSignedIn ? ( Component ) : ( <Navigate to="/Signin" {...alert("로그인이 필요합니다.")}></Navigate> ); }; export default PrivateRoute;function App() { const isSignedIn = useRecoilValue(IsSignInStateAtom); return ( <Routes> <Route path="/sharing-space" element={ <PrivateRoute component={<SharingSpacePage />} isSignedIn={isSignedIn} /> } /> </Routes> ); }- 페이지가 라우팅되면, PrivateRoute 컴포넌트로 먼저 진입되고, props로 로그인 상태를 넘겨주었다.
- true면 원래 진입하려던 페이지로 들어가고, 아닐 시 경고창과 함께 로그인 페이지로 들어간다.
'React.js > react' 카테고리의 다른 글
[react] fetch된 데이터가 변경된 후, 새로운 데이터를 가져오려면? (0) 2023.10.23 [react-slick] Carousel을 라이브러리로 쉽게 구현해보자! (0) 2023.09.21 [react] 카카오 지도(kakao map) 띄우기 (0) 2023.08.18 [react-scroll] navbar 클릭 시, 해당 컴포넌트로 스크롤을 이동하려면? (0) 2023.07.23 [React] React Color (0) 2023.07.05