React

[React] React Router 페이지 접근 권한

JungCw 2024. 11. 21. 09:07

페이지마다 인증이 필요한 경우, 권한이 필요한 경우 등의 구분이 필요하다.

 

이를 쉽게 해결해주기 위한 방법이 리액트에서 라우팅을 해줄때 페이지별로 접근 권한을 설정해주는 방법이다.

 

이 방법을 쉽게 요약하면,

권한이 필요한 페이지를 요청하면 →  Context등을 이용하여 로그인 인증 정보를 전달받는다 → 전달받은 데이터가 조건에 부합하면 하위 페이지를 랜더링 해준다.

의 순으로 진행된다.

 

일단 평범한 라우터 구성 파일의 일부이다.

import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Login from '.pages/Login';
import Home from '.pages/Home';
import MyPage from '.pages/MyPage';

const App = () => {
    return (
    	<BrowserRouter>
        	<Routes>
            	<Route path="/" element={<Home />} />
                <Route path="/login" element={<Login />} />
                <Route path="/mypage" element={<MyPage />} />
            </Routes>
        </BrowserRouter>
    )
}

export default App;

 

이렇게하면 기본적인 기능은 하지만, 앞서 말한 것처럼 <MyPage /> 와 같은 접근 권한이 필요한 페이지에 대한 처리가 불가능하다.

 

먼저, 지금처럼 누구나 접근 가능한 상태가 아닌 접근 제한을 가진 페이지로 수정해준다.

import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Login from '.pages/Login';
import Home from '.pages/Home';
import MyPage from '.pages/MyPage';

const App = () => {
    return (
    	<BrowserRouter>
        	<Routes>
            	<Route path="/" element={<Home />} />
                <Route path="/login" element={<Login />} />
                <Route path="/mypage" element={<ProtextedRoute><MyPage /></ProtextedRoute>} />
            </Routes>
        </BrowserRouter>
    )
}

export default App;

이렇게 바로 랜더링 되지 않고 <ProtextedRoute>를 통해 권한을 확인할 수 있도록 한다.

이제 <ProtextedRoute>가 필요하다.

 

import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { isAuthenticated } from './context/AuthContext';
import Login from '.pages/Login';
import Home from '.pages/Home';
import MyPage from '.pages/MyPage';

const ProtectedRoute = ({children}) => {
  const { isAuthenticated } = useContext(AuthContext);

  if (!isAuthenticated) {
    return <Navigate to="/login" />;
  }

  return children; // 권한이 있다면 해당 컴포넌트를 렌더링
};

const App = () => {
    return (
    	<BrowserRouter>
        	<Routes>
            	<Route path="/" element={<Home />} />
                <Route path="/login" element={<Login />} />
                <Route path="/mypage" element={<ProtextedRoute><MyPage /></ProtextedRoute>} />
            </Routes>
        </BrowserRouter>
    )
}

export default App;

이런 식으로 컴포넌트 안에서 필요한 데이터를 불러와 권한(조건)을 확인하고 부합하면 랜더링하도록 한다.

 

참고로 children을 통해서 하위 컴포넌트(ex. <MyPage />)등을 받는다.

 

물론, 클라이언트 측에서의 접근 제한을 이용한 보안이고 서버 측에서도 보안을 위한 처리가 필요하다.