프로그래밍/Spring

Spring Security Role - 2

기프티콘주세요 2021. 9. 2. 15:01

지난 번에 작성했던 Spring Security를 이용하여, 권한이 없는 사용자가 특정API를 호출할 경우, FORBIDDEN 에러를 발생한 것까지 진행했었다.

 

 

 

Spring Security Role - 1

Spring Security? Spring 기반의 어플리케이션의 보안을 담당하는 스프링의 하위 프레임워크 Spring Security는 인증과 권한에 대한 부분을 Filter의 흐름에 따라 처리하고 있다. Filter는 Dispatcher Servlet으로..

giftcon.tistory.com

 

설정전에 앞서, Spring Security에서 ExceptionHandling에 대한 종류는 아래와 같다.

  • authenticationEntryPoint
  • accessDeniedHandler
  • accessDeniedPage

인증과정에서 실패하거나, 인증헤더를 보내지 않을 경우 401 응답코드를 받게되는데, 이를 처리해주는 로직이 authenticationEntryPoint 이다.

 

인증이 정상적으로 이루진 뒤, 인가되지 않은 즉, 권한을 가지지 않은 사용자가 접근할 때, 403 응답코드를 받게 되고, 이를 처리해주는 로직이 accessDeniedHandler 이다.

 

위와 비슷하게, 권한을 가지지 않은 사용자가 접근 시, 사용자가 지정한 접근거부 페이지를 설정할 때, accessDeniedPage 를 사용한다.

 

그럼, 권한이 없는 사용자가 특정 API를 호출 시, 사용자가 정의한 결과를 리턴해주는 형식으로 변경해보도록 하자.

먼저 AccessDeniedException이 발생했을 때, 이를 처리할 로직이 작성되어 있는 handler를 위와 같이 등록한다.

 

등록한 handler에 content-Type은 application/json 으로 지정하고, AccessDenined의 결과인 CustomAccessDenineException을 JSON으로 받아볼수 있도록 Cast하여 응답객체에 작성하여 준다.

 

위 그림처럼, 사용자가 정의한 결과값을 받아볼 수 있는 것을 확인할 수 있다.

 

추가로, 인증받은 token의 맨 뒷글자를 삭제하여, 인증받지 않은 사용자로 변경한 뒤, API를 호출할 경우

authenticationEntryPoint에 의해 사용자가 정의한 결과값으로 받아보는지 확인해보자.

 

정상적으로, 사용자가 정의한 결과를 받아볼 수 있다.