지금 이해한 방법이 정확한 것은 아닙니다!! 프로젝트에 있어서 느낀 편리성에 대해 작성했습니다.
// api/userApis.js
const api = axios.create({
baseURL: "url",
headers: {
"content-type": "application/json;charset=UTF-8",
accept: "application/json,",
},
withCredentials: true,
});
// api/userApis.js
const access_token = getCookie("access_token");
const refresh_token = getCookie("refresh_token");
// api/userApis.js
api.interceptors.request.use(function (config) {
config.headers.common["Authorization"] = access_token;
config.headers.common["Refresh-Token"] = refresh_token;
return config;
});
// api/userApis.js
export const userApis = {
// member
doubleCheck: (data) => {
return api.post("member/email", {
email: data,
});
},
signup: async (data) => {
const response = await api.post("member/signup", data);
return response.data;
},
}
// src/components/register/Register.jsx
const onSubmit = () => {
userApis
.signup(userData)
.then((res) => {
alert("회원가입 완료!");
navigate(`/`);
})
.catch((error) => {
if (error.response.data.msg === "중복된 닉네임이 있습니다.") {
alert("중복된 닉네임입니다!");
}
});
};
refreshAccessToken
)를 실행시킨다.// api/userApi.js
api.interceptors.response.use(
function (response) {
return response;
},
async function (err) {
const originalConfig = err.config;
if (err.response && err.response.data.status === "403 FORBIDDEN") {
try {
const refreshToken = await getCookie("refresh_token");
axios.defaults.headers.common["refresh-token"] = refreshToken;
refreshAccessToken();
return api.request(originalConfig);
} catch (err) {
console.log("error", err.response);
window.location.href = "/";
}
}
return Promise.reject(err);
}
return Promise.reject(err);
}
);
const refreshAccessToken = async () => {
const response = await axios.post("http://localhost:8080/member/reissue");
const access_token = response.headers["authorization"];
setCookie("access_token", access_token);
window.location.reload();
};
let isTokenRefresh = false;
api.interceptors.response.use(
function (response) {
return response;
},
async function (err) {
const originalConfig = err.config;
if (err.response && err.response.data.status === "403 FORBIDDEN") {
if (!isTokenRefresh) {
isTokenRefresh = true;
try {
const refreshToken = await getCookie("refresh_token");
axios.defaults.headers.common["refresh-token"] = refreshToken;
refreshAccessToken();
return api.request(originalConfig);
} catch (err) {
console.log("error", err.response);
window.location.href = "/";
}
}
return Promise.reject(err);
}
return Promise.reject(err);
}
);
api.interceptors.response.use(
function (response) {
return response;
},
async function (err) {
const originalConfig = err.config;
if (err.response && err.response.data.status === "403 FORBIDDEN") {
try {
// 기존에 쿠키에 저장된 refresh token을 가져옴
// refresh token만 가지고 access token 발급을 요청할 수 있도록 백엔드 팀원분들에게 요청 후 api를 설정함
const refreshToken = await getCookie("refresh_token");
axios.defaults.headers.common["refresh-token"] = refreshToken;
// 토큰을 다시 발급 받는 api 호출 함수
refreshAccessToken();
} catch (err) {
console.log("error", err.response);
window.location.href = "/";
}
return Promise.reject(err);
}
return Promise.reject(err);
}
);
const refreshAccessToken = async () => {
const response = await axios.post("http://localhost:8080/member/reissue");
// response를 받고 header부분에 token을 받아서 쿠키에 담기
const access_token = response.headers["authorization"];
setCookie("access_token", access_token);
// 화면에 바로 반영이 안돼서 강제적으로 reload 시킴
window.location.reload();
};