[스프링시큐리티] exceptionHandling()

Welcome to Seoyun Dev Log·2024년 10월 30일
0

보안

목록 보기
4/18

  • accessDeniedHandler 실패시 보동 403에러 반환
  • accessDeniedHandler 에러가 발생 했지만 발생한 당시에 요청하는 사용자가 인증을 받지 않은 익명 사용지 여부를 먼저 판단하고 익명 사용자인 경우 다시 인증 단계로 되돌린다
    익명사용자는 인증을 받지 못하기 때문에 다시 인증 예외 단계를 거치고도 못받을 경우 인가와 관련된 예외가 발생한다

exceptionHandling() API

AuthenticationEntryPoint

  • UsernamePasswordAuthenticationFilter (Form 인증)시 인증 실패할 때, LoginUrlAuthenticationEntryPoint를 호출해서 작업을 하고있고 기본적으로 설정되고 생성되는 필터이다
  • 대표적으로 두개의 필터가 설정 되어있다.
  • 403코드 : 접근 거부
HttpSecurity.exceptionHandling(exception -> exception
					//인증
                    .authenticationEntryPoint(new AuthenticationEntryPoint() {
                        @Override
                        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
                            System.out.println("exception: " + authException.getMessage());
                            response.sendRedirect("/logout");//사용자 정의로 커스텀하게 만들었을 경우 login, logout 페이지를 직접 만들어줘야한다.
                        }
                    })
                    //인가
                    .accessDeniedHandler(new AccessDeniedHandler() {
                        @Override
                        public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
                            System.out.println("exception: " + accessDeniedException.getMessage());
                            response.sendRedirect("/denied");
                        }
                    })
            );

ExceptionTranslationFilter

예외처리 흐름도

  • AuthorizationFilter 가장 마지막에 위치해 있다
  • AuthorizationFilter는 권한 관련된 처리를 하는 필터이기 때문에 인증관련된 예외를 발생하지 않고 인가 AccessDeniedException 예외를 발생시킨다. 인증 예외를 다루지 않는다
  • exceptionTranslationFilter는 인증, 인가 예외 모두를 처리할 수 있다
  • AuthenticationException -> securityContext(null) -> HttpSessionRequestCache -> AuthenticationEntryPoint -> /login or /user
  • 필터를 관리하는 filterChainProxy에서 AuthorizationFilter(뒤)와 ExceptionTranslationFilter(앞)는 마지막 부분에 서로 연결되어 있다. 예외는 앞단에 있는것은 받지 못하는것 따라서 ExceptionTranslationFilter는 AuthorizationFilter에서 발생한 에러 즉 인가관련 에러만 처리할 수 있다.
    권한 처리에서 발생하는 필터로 생각하면 될 것
  • ExceptionTranslationFilter의 주된 목적은 AuthorizationFilter에서 발생한 인가 처리에서 발생한 인증/인가를 구분하여 예외처리를 한다.
    서블릿 예외 처리를 하지는 않지만 받는 경우 제한적으로 처리한다.

번외

ex) spring MVC에서 @ControllerAdvice 적용하지 않은 상태에서
controller 부분 index에서 예외가 발생한 상황 (예외처리를 했는데도 불구하고 예외를 잡지 못했을 경우)

서블릿에서 해결해야하는데 ExceptionTranslationFilter로 온 경우 해당 필터는 서블릿 예외를 처리하는 목적으로 설계된 것은 아니나 들어왔을 때 SecurityException이 null이 되고 rethrow를 한다

인증 / 인가 예외처리를 강제로 넣어주게되면 인증/인가 처리 로직으로 간다

profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글

관련 채용 정보