반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 총정리
- c++
- qsort
- Pair
- 자료구조
- Articulation_Point
- sort
- sstream
- 알고리즘
- deletion
- data_structure
- function_template
- template
- 13305
- 문법
- STL
- list
- singly Linked List
- red-black tree
- Heap
- 예제
- Algorithm
- connected_component
- Critical_Path_Analysis
- 구현
- 5397
- 백준
- class_template
- Biconnected_Component
- '0'
Archives
- Today
- Total
- Today
- Total
- 방명록
어제의 나보다 성장한 오늘의 나
[Next.js] getServerSideProps 에서 403 인증 에러 캐치 후 로그인 페이지로 리다이렉션 시키기 본문
Next.js
[Next.js] getServerSideProps 에서 403 인증 에러 캐치 후 로그인 페이지로 리다이렉션 시키기
today_me 2024. 1. 28. 17:04반응형
Next JS 프로젝트에서 인증 되지 않은 사용자가 페이지를 사용할 때는 로그인 페이지로 리다이렉션 시키는 로직을 추가하고자 했다.
플로우는 다음과 같다
getServerSideProps를 사용하여 서버 사이드에서 인증 토큰을 헤더에 넣어 GET 요청을 보낸다.
백앤드에서 토큰이 유효 하지 않음을 파악하고 403 에러를 반환한다.
403 에러를 캐치하여 페이지 렌더링 시 리다이렉션 시키는 로직을 추가한다.
getServerSideProps
// 서버 사이드 요청
const getServerSidePropsFunction: GetServerSideProps<{
fetchData: IGetMileageCategory[];
}> = async (context) => {
setServerSideCookie(context); // 요청에 토큰 추가
const res = await axiosInstance.get('/api/mileage/categories');
const fetchData = res.data;
return { props: { fetchData } };
};
// 에러 캐치 템플릿 적용
export const getServerSideProps = withTryCatchForSSR(getServerSidePropsFunction);
// requireLogin , error 전달
export default function MileageCategory({
fetchData,
requireLogin,
error,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
if (requireLogin) {
handleServerAuth403Error(error);
return;
}
return (
<>
...
</>
);
}
403TryCatchTemplate
import { GetServerSideProps } from 'next';
import axios, { AxiosError } from 'axios';
export const withTryCatchForSSR = <P>(
getServerSidePropsFunction: GetServerSideProps<P>
): GetServerSideProps<P> => {
return async (context) => {
try {
return await getServerSidePropsFunction(context);
} catch (error) {
const axiosError = error as AxiosError;
if (axiosError.isAxiosError && axiosError.response?.status === 403) {
return {
props: {
requireLogin: true, // 로그인 필요함을 나타내는 플래그
error: '로그인이 필요합니다',
permanent: false,
} as unknown as P,
};
} else {
console.error('Error:', axiosError.message);
return {
props: {
fetchData: null,
error: axiosError.message || 'An error occurred',
} as unknown as P,
};
}
}
};
};
handle403AuthError
// 쿠키 제거 및 로그인 페이지 리다이렉션
export const handleServerAuth403Error = async (errorMessage) => {
setSession(null); // 쿠키 제거
window.location.href = '/auth/login';
alert(errorMessage);
};
반응형
'Next.js' 카테고리의 다른 글
[NextJS] Next.js 프로젝트에서 CSS 프레임 워크 결정 하기 (0) | 2024.03.25 |
---|---|
[Next.js] Next.js와 호환되는 css와 그렇지 못한 css에 대한 고찰 (0) | 2024.03.21 |
[Apache] 웹서버 리버스 프록시 설정 ( Feat. Next.js 프로젝트 ) (2) | 2024.01.29 |
[Next.js] GetServerSideProps 헤더에 인증 토큰 추가 하는 방법 (쿠키 사용) (0) | 2024.01.28 |
[Next.js] 쉘 스크립트를 통한 배포 자동화 (2) | 2024.01.28 |
Comments