[DEV] J-Jay

스프링 시큐리티(Security) 본문

Back-end/Spring

스프링 시큐리티(Security)

J-Jay 2023. 9. 9. 21:57
728x90

스프링 시큐리티(Spring Security)

스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크이다.

보안 관련 옵션을 제공하며, 어노테이션으로 설정하무로 매우 쉽게 사용할 수 있다.

CSRF(Cross Site Request Forgery 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격)이나,

세션 공격(Session Fixation 사용자의 인증 정보를 탈취하거나 변조하는 공격)을 방어해 주고 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개발을 해야하는 부담을 크게 줄여준다.

 

필터 기반으로 동작하는 스프링 시큐리티

스프링 시큐리티는 필터 기반으로 동작한다.

 

스프링 시큐리티 필터 구조

스프링 시큐리티는 위와 같이 다양한 필터들로 나누어져 있으며, 각 필터에서 인증,. 인가와 관련된 작업을 처리한다.

SercurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거친다.

1:UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 하며, 2:FilterSecurityInterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.

Filter 내용
SecurityContextPersistenceFilter SecurityContext Repository에서 SecurityContext(접근 주체와 인증 정보 객체)를 가져오거나 저장하는 역할
Logout Filter 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리
UsernamePasswordAuthenticationFIlter 인증 관리자이며 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임한다.
인증이 성공하면 AuthenticationSuccessHandler를, 인증이 실패하면 AuthenticationFailureHandler를 실행한다
DefaultLoginPageGeneratingFilter 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터이다
BasicAuthenticationFilter 요청 헤더가 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임한다. 인증이 성공하면  AuthenticationSuccessHandler를, 인증이 실패하면 AuthenticationFailureHandler를 실행한다
RequestCacheAwareFilter 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해준다. 예를 들어 로그인 하지 않은 상태로 방문했던 페이지를 기억해 두었다가 로그인 이휑 그 페이지로 이동 시켜준다.

SecurityContextHolderAwareRequestFilter httpServletRequest정보를 감싼다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공되기 위해 사용한다.
AnonymousAuthenticationFilter 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 AnonymousAuthentication을 만들어 SecurityContext에 저장한다.
ExceptionTranslationFilter 요청을 처리하는 중에 발생할수 있는 예외를 위임하거나 전달한다.
FilterSecurityInterceptor 접근 결정 관리자이다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유요한 사용자인지도 확인 가능하다. (인가 관련 설정)

 

 

스프링 시큐리티 로그인 인증 흐름

로그인 인증 흐름

사용자가 폼에 ID와 PW를 입력하면, HTTPServletRequest에 ID와 PW를 전달한다.

이때 AuthenticationFilter가 넘어온 ID와 PW의 유효성 검사를 하며 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 전달한다.

 

전달받은 내용을 AuthenticationManger → AuthenticationProvider → UserDetailServcie에 전달하며

사용자 ID로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다. 

DB에 있는 사용자 정보를 가져오며, 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 진행한다.

인증이 완료되면, SecurityContextHolder에서에 Authentication을 저장하고 인증 성공 여부에 따라 

성공은 AuthenticaitonSuccessHandler, 실패는 AuthenticationFailureHandler 를 실행한다.