PROJECT

프로젝트) 쿠키와 요청 구조화

일태찡 2023. 2. 28. 12:37

 

기본적으로 토큰은 리액트 쿠키를 이용하여 저장했습니다.

 

https://www.npmjs.com/package/react-cookie

 

react-cookie

Universal cookies for React. Latest version: 4.1.1, last published: 2 years ago. Start using react-cookie in your project by running `npm i react-cookie`. There are 554 other projects in the npm registry using react-cookie.

www.npmjs.com

 

import { Cookies } from 'react-cookie';

const ACCESS_TOKEN = 'token';
const REFRESH_TOKEN = 'refreshToken';
const USER_INFORMATION = 'userInformation';

const cookies = new Cookies();

//토큰 및 정보 저장
export const setACCESS_TOKEN = (token, option = {}) =>
  cookies.set(ACCESS_TOKEN, token, option);
export const setREFRESH_TOKEN = (token, option = {}) =>
  cookies.set(REFRESH_TOKEN, token, option);
export const setUSER_INFORMATION = (userInformation, option = {}) =>
  cookies.set(USER_INFORMATION, userInformation, option);

//토큰 및 정보 가져오기
export const getACCESS_TOKEN = () => cookies.get(ACCESS_TOKEN);
export const getREFRESH_TOKEN = () => cookies.get(REFRESH_TOKEN);
export const getUSER_INFORMATION = () => cookies.get(USER_INFORMATION);

//토큰 및 정보 날리기
export const removeACCESS_TOKEN = () => cookies.remove(ACCESS_TOKEN);
export const removeREFRESH_TOKEN = () => cookies.remove(REFRESH_TOKEN);
export const removeUSER_INFORMATION = () => cookies.remove(USER_INFORMATION);

//로그인 상태 검증을 위한 토큰 유무 확인
export const getALIVE = () =>
  getACCESS_TOKEN() && getREFRESH_TOKEN() && getUSER_INFORMATION();


export const setLogout = () => {
  removeACCESS_TOKEN();
  removeREFRESH_TOKEN();
  removeUSER_INFORMATION();
};

 

처음엔 토큰만 쿠키에 저장하고 유저 정보와 로그인 상태는 리덕스를 이용하여 관리하려 했으나 리덕스는 새로고침시 상태가 초기화되는 문제가 있어 개선이 필요했습니다.

 

이는 redux-persist를 이용하여 새로고침시 상태가 초기화하는 걸 방지할 수 도 있습니다.

https://www.npmjs.com/package/redux-persist

 

redux-persist

persist and rehydrate redux stores. Latest version: 6.0.0, last published: 3 years ago. Start using redux-persist in your project by running `npm i redux-persist`. There are 998 other projects in the npm registry using redux-persist.

www.npmjs.com

 

하지만 프로젝트 중 이미 많은 상태를 완료한 부분이 있어 새롭게 배우고 적용하기에 두려움이 생겨 토큰을 저장하던 쿠키에 같이 저장하고 토큰이 쿠키에 담겨있는 것으로 로그인 상태를 확인하게 하였습니다.

 

export const getWITH_TOKEN = () => {
  return {
    headers: {
      Authorization: getACCESS_TOKEN(),
      RefreshToken: getREFRESH_TOKEN(),
    },
    withCredentials: true,
  };
};

 

이렇게 새로운 함수를 설정하여 기본적으로 헤더에 토큰을 담게 기본 틀을 만들어

 

  const logoutHandler = () => {
    axios
      .delete(URL_MEMBER_LOGOUT, getWITH_TOKEN())
      .then(() => {
        setLogout();
        navigate(ROUTE_PATH_BASE);
      })
      .catch((error) => {
        const { message } = error;
      });
  };

 

HTTP  요청 시 담을 많을 정보를 간결하게 구조화할 수 있었습니다.