[Vue] Vue Navigation Guard

Jinga·2023년 5월 10일
0

Vue

목록 보기
8/13
post-thumbnail

Navigation Guard

  • Vue router를 통해 특정 URL에 접근 할 때, 특정 조건을 검사하거나 인증을 수행하여 허용되지 않은 경로로의 접근을 막을 수 있다.
  • 네비게이션 가드는 컴포넌트 내부에서도 정의할 수 있으며, 이를 이용하여 특정 라우터에서의 접근 제어나 다른 동작을 수행할 수 있다.

전역 가드

  • 다른 url주소로 이동할 때(모든 라우팅 전) 항상 실행되며, 네트워크 요청이나 사용자 인증 정보 등을 검사하여 해당 사용자가 액세스할 권한이 있는 페이지로만 이동하게 한다.
  • 애플리케이션의 전역에서 라우팅 네비게이션을 관리하는 방법 중 하나이며, router/index.js에 router.beforeEach() 메서드를 이용하여 전역 가드를 구현할 수 있다.
  • to 객체: 이동하려는 URL 정보를 담고 있는 라우팅 객체
  • from 객체: 이전 URL 정보를 담고 있는 라우팅 객체
  • next 함수: 다음 라우팅 객체를 받아서 반드시 호출해야 한다. 만약 호출하지 않으면 다음 단계로 네비게이션을 진행하지 않는다.

    Global Before Guard 실습

    • /home으로 이동하더라도 라우팅이 되지 않고 아래와 같이 로그만 출력된다.
    • global_before_guard_1 global_before_guard_1-1
    • next()가 호출되어야 화면이 전환된다.
    • global_before_guard_2 global_before_guard_2-1
    • About으로 이동해보기
      • to에는 이동 할 url인 about에 대한 정보가,
      • from에는 현재 url인 home에 대한 정보가 들어있다.
      global_before_guard_3

    Login 여부에 따른 라우팅 처리 실습

    • Login이 되어 있지 않다면 Login 페이지로 이동하는 기능 추가
    • 로그인_초기페이지 로그인_초기페이지2
    • LoginView에 대한 라우터 링크 추가
    • 로그인_라우터링크추가
    • Login해야만 접근할 수 있도로
    • 로그인해야만_1 로그인해야만_2
    • isLoggedIn이 true인 경우 결과
      • /hello/harry에 해당하는 컴포넌트가 정상적으로 렌더링 된다.
      로그인_결과1
    • isLoggedIn이 false인 경우 결과
      • /hello/harry에 해당하는 컴포넌트가 정상적으로 렌더링 되지 않고 Login 페이지로 이동된다.
      • Logindㅡ로 이동했는데 console창에 log가 2개 찍히는 이유
      • 첫번째 출력은 /hello/harry로 접속 시도 후(전역 가드에 막힘)
        전역 가드에서 login으로 이동 요청 할 때 출력
      • 두번째 출력은 /login으로 이동 요청 할 때 출력
      로그인_결과2

라우터 가드

  • 전체 route가 아닌 특정 route에 대해서만 가드를 설정하고 싶을 때 사용한다.
  • beforeEnter()

    • 특정 라우팅에 접근하기 전에 실행되는 함수이다
    • 라우터를 등록한 위치에 추가한다. 단 매개변수, 쿼리, 해시 값이 변경될 때는 실행하지 않고 다른 경로에서 탐색할 때만 실행된다.
    • 콜백함수는 to, from, next를 인자로 받는다.

    라우터 가드 실습

    • 이미 로그인 되어있는 경우 HomeView로 이동하게 하기
    • 로그인 여부에 대한 임시 변수 생성
    • 라우터가드_로그인 임시변수 생성
    • isLoggedIn = true인 경우(로그인 상태인 경우)
      • /login으로 접속을 시도하면 Home으로 이동
      라우터가드_결과
    • Login을 제외한 다른 페이지로 이동하면 라우터 가드를 따로 설정해주지 않았기 때문에 라우터 가드가 동작하지 않는다.
    • 이렇게 특정 라우트만 따로 가드를 하고 싶은 경우에는 라우터 가드를 사용한다.

컴포넌트 가드

  • 특정 컴포넌트 내에서 가드를 지정하고 싶을 때 사용한다.
  • beforeRouteUpdate()
    • 해당 컴포넌트를 렌더링하는 경로가 변경될 때 실행

    Params변화 감지

    • about에서 jun에게 인사하는 페이지로 이동
    • params변화감지1
    • navbar에 있는 Hello를 눌러 harry에게 인사하는 페이지로 이동
      • URL은 변하지만 페이지는 변화하지 않는다.
      params변화감지2
    • 변화하지 않는 이유
      • 컴포넌트가 재사용 되었기 때문이다.
      • 기존 컴포넌트를 지우고 새로 만드는 것보다 효율적이다.
    • Params변화 감지 문제 해결
      • beforeRouteUpdate()를 사용해서 처리 가능
      • userName을 이동할 params에 있는 userName으로 재할당
      paramsq변화감지해결1

404 NOT FOUND

요청한 리소스가 존재하지 않는 경우

  • 사용자가 요청한 리소스가 존재하지 않을 때 응답
  • 모든 경로에 대해서 404page로 redirect 시키기
    • 기존에 명시한 경로가 아닌 모든 경로가 404page로 redirect된다.
    • 이때, routesd에 최하단부에 작성해야 한다.
    404-1 404-2

형식은 유효하지만 특정 리소스를 찾을 수 없는 경우

  • 예를들어, Django에게 articles/1/로 요청을 보냈지만, 1번 게시글이 삭제된 상태
    • 이때는 path: '*'를 만나 404page가 렌더링 되는 것이 아니라 기존에 명시한 articles/:id/에 대한 components가 렌더링된다.
    • 하지만 데이터가 존재하지 않기 때문에 정상적으로 렌더링이 되지 않는다.
    • 이러한 문제를 해결하기 위해서
      1. 데이터가 없음을 명시해야한다.
      2. 404page로 이동해야 한다.

profile
다크모드가 보기 좋아요

0개의 댓글