Summary

삽질정도

나쁘지 않은 삽질이었다. 검색 후 바로 해결 완료.


Problem

const accessToken = localStorage.getItem('token');

export const instance = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
    Authorization: accessToken,
  },
});

 

사용한 axios instance는 위와 같습니다.

 

[오류 발견한 과정]

1. 로그인

2. 질문 상세 페이지로 이동

3. 답변 POST (오류 발생)

 

답변 POST 요청을 보낼 때 401 unAuthorization 오류가 발생했습니다.

그런데 새로고침을 하면 정상적으로 POST가 됩니다. 네트워크를 확인해 보니 새로고침을 안 하고 POST를 누르면 헤더에 Authorization이 없더라고요.

Authorization 어디감
새로고침 기브미 authorization

바로 스택 overflow에 검색해 봤더니 저희와 똑같은 문제를 겪고 있던 사람이 있었습니다.

https://stackoverflow.com/questions/75385429/axios-instance-bearer-token-not-updated-after-login-without-reloading-react

이를 통해 바로 해결할 수 있었습니다.

 

저 링크에서 설명하는 이유는 다음과 같습니다.

 

1. React의 생명 주기 외부에서 axios 인스턴스를 생성한다.

2. 로그인 화면에 들어가면 Axios 인스턴스가 생성된다.

3. axios 생성 코드는 한 번만 실행되고 더 이상 실행되지 않기 때문에 로그인한 후 axios 인스턴스에는 여전히 null 토큰이 있다.

4. 새로고침을 하면 저 코드가 다시 실행되고 이때는 로컬 스토리지에 토큰 값이 있기 때문에 이제 헤더에 authorization값이 포함된다.

 

axios interceptors를 이용하면 이를 해결할 수 있다고 합니다. (실제로 해결됨 굳)인터셉터를 사용해서 요청을 보내기 전에 헤더 Authorization에 토큰 값을 넣을 수 있습니다.

 

axios 인터셉터  동작원리는 아래 블로그에 자세하게 설명되어 있습니다.https://www.timegambit.com/blog/digging/axios/01


Solved

const accessToken = localStorage.getItem('token');

export const instance = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  headers: {
    'Content-Type': 'application/json',
    Authorization: accessToken,
  },
});

instance.interceptors.request.use((config) => {
  const token = localStorage.getItem('token');
  // eslint-disable-next-line no-param-reassign
  config.headers.Authorization = token || '';
  return config;
});