[Spring Security] 내부 흐름 분석 - 인증 실패

minseok Kim·2025년 1월 15일

Spring Security

목록 보기
4/15

이번 포스트에서는 Spring Security가 실제로 어떤 흐름을 통해 동작하는지 코드를 통해 분석해보았다.

인증을 실패한 케이스, 인증을 성공한 케이스로 나눠서 내부적으로 어떤 동작이 이뤄지는지 파악해보고자 하였다.


1. 인증을 실패한 경우

AuthorizationFilter

AuthorizationFilter는 사용자가 자격 증명 없이, 또는 인증된 세션 없이 보호된 API나 MVC path에 접근하는지를 식별하는 역할을 한다.

AuthorizationFilter.java의 doFilter 메소드를 보면 주어진 request를 계속 진행할지 아니면 AuthorizationDeniedException 예외와 함께 거부할지를 정하는 로직이 존재한다.

인증이 실패한 경우, AuthorizationFilter는 AuthorizationDeniedException 예외를 던지고, 이 때마다 DefaultLoginPageGeneratingFilter라는 Filter가 작동하게 된다.


DefaultLoginPageGeneratingFilter

해당 Filter의 목적은 사용자에게 사용자 이름, 비밀번호를 입력할 수 있는 로그인 페이지로 redirect하는 것이다.

DefaultLoginPageGeneratingFilter의 doFilter 메서드를 보면, 로그인 페이지 폼을 구성하는 로직이 존재한다.

generateLoginPageHtml() 메소드를 통해 정의된 loginPageHtml이라는 필드가 존재하고, 해당 메소드를 확인해보면

위와 같이 실제 로그인 페이지를 구성하는 코드로 이루어져있다.


코드 분석

코드 상에서 위와 같은 필터들이 어떻게 작동하는지 확인해보기 위해 디버그 모드를 통해 확인해보았다.
중단점은 AuthroizationFiter와 DefaultLoginPageGeneratingFilter의 doFilter() 메서드에서 try문의 가장 첫번째 문장에 걸었다.


localhost:8080/welcome으로 API에 접근하니 AuthorzationFilter의 중단점에 걸렸고, 이 때 AuthorizationDecision의 값이 false인 것을 확인할 수 있다.
따라서 이후 AccessDeniedException을 던질 것이고, 이는 DefaultLoginPageGeneratingFilter로 넘어가 사용자에게 로그인 화면을 띄울 것이다.

다음 포스트에서는 인증이 성공했을 때 내부적인 코드 흐름을 분석해보겠다.

0개의 댓글