const onLogInSuccess = (accessToken: string, refreshToken: string) => {
//accessToken 헤더에 설정
axiosInstance.defaults.headers.common['Authorization'] =
`Bearer ${accessToken}`;
// refreshToken을 쿠키에 저장
document.cookie = `refreshToken=${refreshToken}; path=/; `;
};
const cookie = new Cookies();
const { isLoggedIn, login } = useAuth();
useEffect(() => {
const refreshToken = cookie.get('refreshToken');
if (refreshToken && refreshToken.length > 0) {
onSilentRefresh().then(() => {
login();
});
}
// 의존성 배열을 비워 컴포넌트가 마운트될 때만 실행되도록 설정
}, []);
export const onSilentRefresh = async () => {
const cookies = new Cookies();
const refreshToken = cookies.get('refreshToken');
try {
const res = await Post<refreshData[]>('/api/auth/token/refresh', {
refreshToken: refreshToken,
});
if (res.status == 200) {
const { accessToken } = res.data.data[0];
onLogInSuccess(accessToken, refreshToken); //토큰 갱신
console.log(res);
}
} catch (error) {
console.log(error);
console.log(error);
if (axios.isAxiosError<CommonError>(error) && error.response) {
const errorCode = error.response.data.errorCode;
const message = error.response.data.message;
console.log(`${errorCode}: ${message}`);
}
//로그인 페이지 리다이렉트
alert('로그인이 필요합니다.');
window.location.href = '/login';
}
};
(참고)
https://velog.io/@yaytomato/프론트에서-안전하게-로그인-처리하기#-브라우저-저장소-종류와-보안-이슈