티스토리 뷰
📖 AxiosInstance 리펙토링이 필요한 이유
1. ` basicAxiosInstance `
기본 axiosInstance
2. ` axiosInstance `
accessToken을 헤더에 담고, accessToken이 만료된 경우 refreshToken을 이용해 accessToken 재발급요청을 해주는 axiosInstance
2개의 instance를 만들어 사용하고 있는데 accessToken 재발급 요청해준는 부분만 따로 분리하여 사용해야하는 경우가 생겼다. 코드를 제대로 분리하기로 마음먹었다.
사실 분리만 했기때문에 크게달라진것은 없으나, 리펙토링전 코드와 리펙토링 후 작성하게된 TIL이 있어서 작성이 필요했다..!!
그 경우를 알고 싶은 분은 아래 블로그 경로를 참고해주세요🤣
https://anywhereim.tistory.com/111
❓ 리펙토링 된 부분
getNewAccessToken
1. getNewAccessToken 함수에 별도 axiosInstance 생성.
2. `axios.defaults.withCredentials = true` 옵션으로 전역설정
2. localstorage.remove 코드 삭제.
3. error 발생 시 loacalStorage에 담는 정보 전체 삭제 및 로그인 페이지로 리다이렉션 코드 포함.
axiosInstance
1. error 발생 시 loacalStorage에 담는 정보 전체 삭제 및 로그인 페이지로 리다이렉션 코드 제거
basicAxiosInstance
1. ` axios.defaults.withCredentials = false ` 옵션으로 전역에서 ` withCredentials= true `설정으로 인해 api요청 시 보내는 불필요한 쿠키 보내지 않게하기
💎 리펙토링된 코드
리펙토링 전 코드가 궁금하신 분은 아래 블로그를 참고해주세요.
https://anywhereim.tistory.com/95
< axiosInstance >
import axios from "axios";
import { getNewAccessToken } from "./withCredentials";
const axiosInstance = axios.create({
baseURL: process.env.NEXT_PUBLIC_BASE_URL,
headers: {
"Content-Type": "application/json",
},
responseType: "json",
withCredentials: true,
});
// 요청 인터셉터 설정
axiosInstance.interceptors.request.use(
(config) => {
const token = localStorage.getItem("token");
if (token) {
config.headers["Authorization"] = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error.message);
}
);
// 응답 인터셉터 설정
axiosInstance.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
//중복 요청 방지
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const newAccessToken = await getNewAccessToken();
if (newAccessToken) {
// 원래 요청의 헤더를 새로운 토큰으로 업데이트
originalRequest.headers["Authorization"] = `Bearer ${newAccessToken}`;
return axiosInstance(originalRequest);
}
}
return Promise.reject(error);
}
);
export default axiosInstance;
< getNewAccessToken >
import { decodeTokenOnServer } from "./decode/decodedAxios";
import { requests } from "./request";
import axios from "axios";
axios.defaults.withCredentials = true;
const axiosInstance = axios.create({
baseURL: process.env.NEXT_PUBLIC_BASE_URL,
headers: {
"Content-Type": "application/json",
},
responseType: "json",
withCredentials: true,
});
export const getNewAccessToken = async () => {
try {
console.log(
"withCredentials 설정:",
axiosInstance.defaults.withCredentials
);
const response = await axiosInstance.post(
`${requests.getNewAccessToken}`,
{},
{
withCredentials: true,
}
);
const newAccessToken = response.data.data.accessToken;
await decodeTokenOnServer(newAccessToken);
localStorage.setItem("token", newAccessToken);
return newAccessToken;
} catch (error: any) {
alert("로그인 정보가 만료되어 로그인이 필요합니다.");
localStorage.removeItem("token");
localStorage.removeItem("user");
window.location.href = "/users/login";
return null;
}
};
< basicAxiosInstace >
import axios from "axios";
const basicAxiosInstance = axios.create({
baseURL: process.env.NEXT_PUBLIC_BASE_URL,
headers: {
"Content-Type": "application/json",
},
responseType: "json",
withCredentials: false,
});
export default basicAxiosInstance;
'TIL' 카테고리의 다른 글
Supabase와 Prisma 함께 사용하기 1.셋팅 (0) | 2024.07.16 |
---|---|
access, refresh token의 개념과 관리 방법 요약본 (1) | 2024.07.08 |
토큰 만료처리하기 (0) | 2024.07.06 |
react-hook-form 나홀로 정리하기 (0) | 2024.07.02 |
무한스크롤 쉽게 구현하기 (0) | 2024.06.25 |
- Total
- Today
- Yesterday
- 유효성검사
- axios 사용하기
- Warning: A component is changing an uncontrolled input to be controlled.
- Warning: Each child in a list should have a unique "key" prop.
- readme 이미지 추가 방법
- simple Icon 사용방법
- axios 설치하기
- 별점 색채우기
- styled component 사용방법
- 영화별점만들기
- axios CRUD
- 에러모음집
- git cache
- Fetch와 Axios 의 장단점
- 유효성검사 css
- nextjs 토큰 만료처리하기
- readme 작성해야 하는 이유
- 영화 별점
- axios instance 작성하기
- styled component GlobalStyle 사용방법
- styled component 설치방법
- readme작성해보기
- readme 작성 방법
- 별점만들기
- styled component 조건부 사용방법
- readme 역할
- axiosinstance 사용 시 토큰 사용 법
- Warning: validateDOMNesting(...): <li> cannot appear as a descendant of <li>
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |