도입배경
로그인 여부에 따라 Route별 권한을 주기 위해 당시 개발했던 서비스는 로그인한 유저만 서비스를 이용 할 수 있게 기획하였다.
도입한 프로젝트에서 HOC는 auth를 구별하는 부분에 적용하였다.
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
export default function (SpecificComponent, option) {
function AuthenticationCheck(props) {
let user = useSelector(state => state.user);
let isAuth = localStorage.getItem('token');
console.log(isAuth === null);
//Not Loggined in Status
if (isAuth === null) {
if (option) {
props.history.push('/login');
}
//Loggined in Status
} else {
if (option === false) {
props.history.push('/main');
}
}
return <SpecificComponent {...props} user={user} />;
}
return AuthenticationCheck;
}
만약 localstorage에 있는 값이 null
이면 로그인 하지 않았다고 판단하고 /login
route로 이동한다.
...
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<div style={{ paddingTop: '0', minHeight: 'calc(98vh - 45px)' }}>
<NavBarPage />
<Switch>
<Route exact path="/" component={Auth(MainPage, true)} />
<Route exact path="/login" component={Auth(LoginPage, false)} />
<Route exact path="/register" component={Auth(RegisterPage, false)} />
<Route
exact
path="/register/taste"
component={Auth(RegisterTastePage, false)}
/>
...
App.js에 속한 코드 일부분이다.
Auth()
에서 원하는 페이지를 import하고 null -> 누구나 출입이 가능한 페이지
true -> 로그인한 유저만 출입이 가능한 페이지
false -> 로그인한 유저가 account 페이지 가려고 하면 막아준다
Auth(MainPage,null)
을 작성하면 된다.