스프링 시큐리티 - 예외 처리 및 요청 캐시 필터

SeungTaek·2022년 2월 16일
0
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!

사용자가 인증이 필요한 자원이나, 특정한 권한(인가)가 필요한 자원에 접근하려 할 때, 인증 또는 인가에 실패하면 ExceptionTranslationFilter가 이를 처리해준다.

크게 하는 일은 2가지 이다.

1. AuthenticationException(인증 예외 처리)

인증에 실패했을 시 인증 예외 처리를 호출한다. 여기서도 2가지 일을 진행한다.
1. AuthenticationEntryPoint 호출: 로그인 페이지 이동, 401 오류 코드 전달 등
2. 인증 예외가 발생하기 전의 요청 정보를 저장 : 세션에 정보를 넣어놨다가, 로그인 성공 시 원래 접속하려던 url로 리다이렉트 등에 쓰인다.

  • SavedRequest : 사용자가 요청했던 request 파라미터 값들, 그 당시의 헤더값들 등이 저장
  • RequestCache : 사용자의 이전 요청 정보를 세션에 저장하고 이를 꺼내 오는 캐시 메커니즘

2. AccessDeniedException(인가 예외 처리)

  • AccessDeniedHandler에서 예외 처리하도록 제공


설정 코드를 보자.

http.exceptionHandling() // 예외 처리 기능 작동
 .authenticationEntryPoint(authenticationEntryPoint()) // 인증 실패시 처리
 .accessDeniedHandler(accessDeniedHandler()) // 인가 실패시 처리

authenticationEntryPoint(), accessDeniedHandler()에는 구현체를 넣으면 된다.


익명 구현체를 사용하면 다음과 같다. 이때 http.successHandler와 함께 사용한다면 로그인 후 원래 가려던 페이지로 이동할 수 있다. (원래 가려던 페이지 등의 정보는 RequestCache에 저장되어 있다.)

http.formLogin()
    .successHandler(new AuthenticationSuccessHandler() {
        @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            RequestCache requestCache = new HttpSessionRequestCache();
            SavedRequest savedRequest = requestCache.getRequest(request, response);
            String redirectUrl = savedRequest.getRedirectUrl();
            response.sendRedirect(redirectUrl);
        }
    });

http.exceptionHandling() // 예외 처리 기능 작동
    .authenticationEntryPoint(new AuthenticationEntryPoint() {
        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
            response.sendRedirect("/login");
        }
    })
    .accessDeniedHandler(new AccessDeniedHandler() {

        @Override
        public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
            response.sendRedirect("/denied");
        }
    });


Reference

인프런 '스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security' (정수원)

profile
I Think So!

0개의 댓글