리다이렉트란?
리다이렉트(Redirect)는 사용자가 처음 요청한 URL이 아닌, 다른 URL로 보내는 것을 뜻한다. 예를 들어, 로그인 하지 않은 유저가 로그인이 필요한 페이지에 접속하려고 했을 때, 로그인 페이지로 리다이렉트를 걸어줄 수 있는 것이다.
리다이렉션 URL 생성하기
사용자를 로그인 페이지로 리다이렉션할 때, 로그인 후에 다시 원래 위치로 돌아갈 수 있도록 현재 페이지 URL 또는 주어진 URL을 쿼리 매개변수로 포함시킨다.
//getDynamicPath 내의 login 함수
login: (redirect?: string) => {
const currentRedirect = redirect ?? window.location.href;
return `${RouterPath.login}?redirect=${encodeURIComponent(currentRedirect)}`;
},
redirect
매개변수가 전달되면 그 값을 사용하고, 그렇지 않으면window.location.href
값을 사용한다.RouterPath.login
을 기반으로 로그인 페이지 URL을 생성한다.?redirect=
뒤에currentRedirect
값을 URL 인코딩하여 붙인다.encodeURIComponent()
는 다음 문자를 제외한 문자를 이스케이프 한다.URL에 포함될 수 없는 문자를 이스케이프 처리하여 안전한 URL을 만든다. 참고Not Escaped: A-Z a-z 0-9 - _ . ! ~ * ' ( )
dynamic Path와 기본 Path를 사용할 때의 차이점
❗리다이렉션 URL에 현재 위치 정보 포함 여부가 달라진다.
getDynamicPath.login()
을 사용하는 경우:- 로그인 페이지로 이동할 때 현재 페이지의 URL을
redirect
쿼리 매개변수로 포함시킨다. - 예를 들어, 현재 페이지가
https://example.com/abc
라면,navigate(getDynamicPath.login())
는'/login?redirect=인코딩된경로'
로 이동한다. - 로그인 후 사용자를 원래 위치로 되돌리기 위해 유용하다.
- 로그인 페이지로 이동할 때 현재 페이지의 URL을
- 단순히
'/login'
을 사용하는 경우:- 로그인 페이지로 이동할 때 현재 페이지의 URL 정보를 포함시키지 않는다.
navigate('/login')
은 그냥'/login'
으로 이동한다. - 로그인 후 사용자가 원래 위치로 돌아올 필요가 없는 경우나 현재 위치 정보가 필요 없는 경우에 적합하다.
- 로그인 페이지로 이동할 때 현재 페이지의 URL 정보를 포함시키지 않는다.
인증 정보에 따라 로그인 페이지로 리다이렉션 하기
우선, useAuth에서 인증 정보를 가져오고 인증 여부에 따라 true/false를 반환하는 함수를 작성했다.
const authInfo = useAuth();
const navigate = useNavigate();
const isAuthenticated = (): boolean => {
return !!authInfo; // 인증된 경우 true, 그렇지 않은 경우 false 반환
};
그리고 로그인 페이지로 리다이렉트 하는 함수까지 작성해주자.
const redirectToLoginPage = (): void => {
navigate(getDynamicPath.login());
};
useAuthUtils
는 인증 여부와 로그인 페이지로 리다이렉트 하는 함수를 반환한다.
export const useAuthUtils = () => {
const authInfo = useAuth();
const navigate = useNavigate();
const isAuthenticated = (): boolean => {
return !!authInfo; // 인증된 경우 true, 그렇지 않은 경우 false 반환
};
const redirectToLoginPage = (): void => {
navigate(getDynamicPath.login());
};
return { isAuthenticated, redirectToLoginPage };
};
이제 useAuthUtils에서 반환하는 값들을 사용해서 사용자가 로그인이 되었으면 true를 반환하고, 그렇지 않은 경우에는 로그인 페이지로 리다이렉션 하는 함수를 작성해보자.
함수를 사용할 때 함수에서 반환되는 값이 존재하고, 해당 값을 사용할 때만 return
을 사용하는 것이 좋다는 것을 유의하면서 작성해보자!
checkAuthAndRedirect
는 인증된 경우 true를, 그렇지 않은 경우에는 false를 반환한다.
인증이 되지 않으면 window.confirm
으로 alert해주고, 사용자가 ‘확인’을 누르면 로그인페이지로 리다이렉트 하도록 했다.
if (!isAuthenticated()) {
const isConfirm = window.confirm(
'로그인이 필요한 메뉴입니다.\n로그인 페이지로 이동하시겠습니까?',
);
if (isConfirm) {
redirectToLoginPage();
return false;
}
}
전체 코드
export const useRedirectToLoginByAuth = () => {
const { isAuthenticated, redirectToLoginPage } = useAuthUtils();
const checkAuthAndRedirect = (): boolean => {
if (!isAuthenticated()) {
const isConfirm = window.confirm(
'로그인이 필요한 메뉴입니다.\n로그인 페이지로 이동하시겠습니까?',
);
if (isConfirm) {
redirectToLoginPage();
return false;
}
}
return true; //인증된 경우 true
};
return checkAuthAndRedirect;
};
사용 예시
const handleWishItem = () => {
if (!checkAuthAndRedirect()) return;
const currentWishList: WishList = wishListSessionStorage.get() || [];
if (isProductInWishList(currentWishList)) {
alert('이미 위시리스트에 등록된 상품입니다.');
} else {
addProductToWishList(currentWishList);
}
};
'FE' 카테고리의 다른 글
[Test] CRA 프로젝트의 Testing Library (1) | 2024.07.24 |
---|---|
[Test] 단위 테스트와 통합 테스트, MSW (0) | 2024.07.23 |