Spring Security - 인증, 인가 예외 ExceptionTranslationFilter, AuthenticationException, AccessDeniedException

2021. 4. 16. 14:01SPRING/SPRING SECURITY

ExceptionTranslationFilter

Spring Security는 두 가지 예외를 다룬다.

AuthenticationException - 인증 예외, 인증에 실패할 경우 발생

AccessDeniedException - 인가 예외, 인가에 실패할 경우 발생

사용 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected void configure(HttpSecurity http) throws Exception {
     http.exceptionHandling()
         .authenticationEntryPoint(new AuthenticationEntryPoint() {
             @Override
            public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
                httpServletResponse.sendRedirect("/login");
            }
         })
         .accessDeniedHandler(new AccessDeniedHandler() {
             @Override
            public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
                httpServletResponse.sendRedirect("/denied");
            }
         })
         ;
}
 
cs

ExceptionTranslationFilter 플로우

예외 처리 과정

AuthenticationException

  • 두 가지 일을 한다.
  • 1. 사용자가 인증시도 전에 접근하려했던 자원(URL)을 SavedRequest에 저장해둔다. SavedRequest는 RequestCache에 의해 관리된다.
  • 2. 인증 실패 후, AuthenticationEntryPoint(핸들러) 호출.
  • 보통 인증 실패 후, 로그인 페이지를 보여주고 로그인에 성공하면 원래 접근하려 했던 자원에 다시 접근할 수 있도록 RequestCashe에서 요청 정보를 가져와 리다이렉트하는 작업을 해준다.
  • 예제)
1
2
3
4
5
6
7
8
9
10
11
12
13
protected void configure(HttpSecurity http) throws Exception {
     http.formLogin()
         .successHandler(new AuthenticationSuccessHandler() {
             @Override
            public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
                RequestCache requestCache = new HttpSessionRequestCache();
                SavedRequest savedRequest = requestCache.getRequest(httpServletRequest, httpServletResponse);
                String redirectUrl = savedRequest.getRedirectUrl();
                httpServletResponse.sendRedirect(redirectUrl);
            }
         });
}
 
cs

AccessDeniedException

  • 인가 예외는 특별히 추가되는 작업 없이 AccessDeniedHandler를 호출한다.
  • 보통 인가처리 페이지로 리다이렉트하는 작업을 한다.