React API 전용

axios / intercept option / token

Posted by ETHAN KIM on June 07, 2023 · 6 mins read
React

기본 프로세스

  • 매 요청마다 자동으로 토큰체크
    1. 로컬에서 토큰 확인
    2. 토큰만료 시 리프레시 토큰 체크
    3. 리프레시 토큰 사용하여 토큰 갱신
    4. 리프레시 토큰 만료 케이스 및 에러 처리


./src/lib/apiCall.js

import axios from "axios";
import { msgData } from "static";

axios.defaults.withCredentials = true;

const apiCall = axios.create({
    baseURL: `${process.env.REACT_APP_SERVER_URL}/api_f`,
    headers: {
        "Content-Type": "application/json",
    },
    timeout: 5000,
    withCredentials: true,
});

apiCall.interceptors.request.use(
    function (config) {
        delete apiCall.defaults.headers.common.Authorization;
        delete apiCall.defaults.headers.common.RefreshToken; 
               
        const token = localStorage.getItem("token");
        if (config.headers && token) {
            const { access, refresh } = JSON.parse(token);
            config.headers["Authorization"] = `${access}`;
            return config;
        }
        return config;
    },
    function (error) {
        return Promise.reject(error);
    }    
);

apiCall.interceptors.response.use(
    (response) => {
        return response;
    },
    async (error) => {
        console.log(error);
        const { config, response: { status } } = error;
        const originalRequest = config;
        console.log(status);
        if (status === 401) {            
            const token = localStorage.getItem("token");
            const { refresh } = JSON.parse(token);

            const params = { data : refresh };
            const result = await apiCall.get(`/refresh`, {params});            
            if(result.data['res'] == "SUCCESS"){
                localStorage.setItem('token', JSON.stringify(result.data.token));
                apiCall.defaults.headers.common.Authorization = `Bearer ${result.data.token.access}`;
                originalRequest.headers.Authorization = `Bearer ${result.data.token.access}`;
            }else{
                localStorage.clear();
                delete apiCall.defaults.headers.common.Authorization;
                delete originalRequest.headers.Authorization;
                delete apiCall.defaults.headers.common.RefreshToken;
                delete originalRequest.headers.RefreshToken;

                if(window.location.href.includes('MyPage')||window.location.href.includes('Order')){ //----CASE REALTIME TOKEN CHECK----//
                    if(!alert(msgData['loginExpired'])) window.location.replace(`${process.env.REACT_APP_HOST}/Login`);
                } 
            }
            return apiCall(originalRequest);
        }else if(status === 410){
            localStorage.clear();
            delete apiCall.defaults.headers.common.Authorization;
            delete originalRequest.headers.Authorization;
            delete apiCall.defaults.headers.common.RefreshToken;
            delete originalRequest.headers.RefreshToken;                
            if(window.location.href.includes('MyPage')||window.location.href.includes('Order')){ //----CASE REALTIME TOKEN CHECK----//
                if(!alert(msgData['loginExpired'])) window.location.replace(`${process.env.REACT_APP_HOST}/Login`);
            }
            return apiCall(originalRequest);
        }else if(status === 403){
            localStorage.clear();
            delete apiCall.defaults.headers.common.Authorization;
            delete originalRequest.headers.Authorization;
            delete apiCall.defaults.headers.common.RefreshToken;
            delete originalRequest.headers.RefreshToken;                
            return apiCall(originalRequest);
        }
        return Promise.reject(error);
    }
);

export default apiCall;