기존에 AuthForm
이라는 컴포넌트에서 fetch API를 활용해서 초기 로직을 구현했었는데,
일단 작동만 하게 코드를 짰더니, 너무 코드가 길어져서 리팩토링을 해야겠다고 생각했습니다.
store
폴더에는 authStore라는 파일을 만들었고, 그 안에서 인증에 관한 상태관리를 하도록 만들었습니다.
기존 fetch로 작성된 코드는, api
폴더에 auth.ts
라는 파일을 생성해서, firebase 인증 API만 불러오는 파일을 만들었고, 브라우저에 내장된 fatch함수에서 HTTP 비동기 통신 라이브러리인 axios로 바꿔주었습니다.
로그아웃시 바뀌어야 할 값은 하나,
우리의 상태
즉, 토근을 비우면 됩니다.
그리고 authStore
에서 만들어둔 isLoggedIn이라는 boolean 타입 변수을,
false
로 업데이트해주면 끝!
profile 페이지는 로그인 사용자만 보여야 하는 페이지이기 때문에,
로그인하지 않은 사용자는 접근이 불가능하게 만들어야 합니다.
방법은? 라우터를 사용합니다.
1.사용자의 현재 인증 상태를 특정 라우트의 조건으로 삼고!
2.사용자 미인증 시에는 profile 라우트 설정을 아예 렌더링 하지 않게 합니다.
3.그러면 미인증 사용자는 프로필 페이지에 방문할 수 없게된다.
App
컴포넌트에서, AuthStore
를 불러옵니다.
AuthStore안에 있는 isLoggedIn 변수를 이용해서,
// App.tsx
const AuthStroe = useContext(AuthStore);
{!AuthStroe.isLoggedIn && (
<Route path="/auth" element={<AuthPage />} />
)}
{AuthStroe.isLoggedIn && (
<Route path="/profile" element={<Profile />} />
)}
</Route>
<Route path="/*" element={<NotFound />} />
export default observer(App);
이렇게 해주면 끝!
사용자가 '접근 하지 말아야 할' 페이지에 '접근' 했다면,
NotFound 페이지를 보여주게끔 추가도 해봤습니다.