스프링 시큐리티(Spring Security
)는 스프링 프레임워크 기반의 애플리케이션에서 보안 기능을 쉽게 구현할 수 있도록 도와주는 보안 프레임워크이다. 보안과 관련된 많은 기능을 제공하기 때문에 스프링 시큐리티를 활용하면 더욱 편리하게 원하는 기능을 설계할 수 있다.
스프링 시큐리티는 서블릿 필터(Servlet Filter
) 기반으로 동작한다. 애플리케이션의 요청이 DispatcherServlet
에 도달하기 전에 스프링 시큐리티의 필터가 먼저 요청을 처리한다.
위 그림의 필터 체인(FilterChain
)은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain
을 의미한다. 스프링 시큐리티는 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 DelegatingFilterProxy
를 사용한다.
보안 필터는 순서대로 실행되며, 대표적인 필터는 다음과 같다:
UsernamePasswordAuthenticationFilter
: 사용자 이름과 비밀번호를 사용해 인증한다.BasicAuthenticationFilter
: HTTP 기본 인증을 처리한다.CsrfFilter
: CSRF 공격을 방지한다.LogoutFilter
: 로그아웃 요청을 처리한다.ExceptionTranslationFilter
: 인증 및 인가 예외를 처리한다.FilterSecurityInterceptor
: 인가(권한 검증)를 처리한다.스프링 시큐리티에서는 WebSecurityConfigurerAdapter
클래스를 상속받은 여러 클래스를 만들어서 보안 필터 체인을 설정할 수 있다. 각 클래스는 충돌 방지를 위해 @Order
어노테이션을 사용하여 우선순위를 지정해야 한다. 기본적으로 스프링 시큐리티는 SecurityFilterChain
에서 UsernamePasswordAuthenticationFilter
를 사용하여 인증을 처리한다.
요청 처리: 클라이언트로부터 요청을 받으면 서블릿 필터가 동작하고, 이때 SecurityFilterChain
으로 작업이 위임된다. 그 중 UsernamePasswordAuthenticationFilter
가 인증을 담당한다.
토큰 생성: UsernamePasswordAuthenticationFilter
는 요청 객체(HttpServletRequest
)에서 사용자 이름과 비밀번호를 추출하여 인증 토큰을 생성한다.
토큰 처리: 생성된 인증 토큰은 AuthenticationManager
에 전달된다. AuthenticationManager
는 인증을 담당하는 인터페이스이며, 일반적으로 ProviderManager
가 사용된다.
토큰 처리 과정:
ProviderManager
는 AuthenticationProvider
에게 토큰을 전달하여 인증을 시도한다.AuthenticationProvider
는 토큰의 정보를 UserDetailsService
에 전달하여 데이터베이스에서 해당 사용자 정보를 조회하고 UserDetails
객체를 생성한다.인증 완료: 생성된 UserDetails
객체는 다시 AuthenticationProvider
로 전달되며, 해당 Provider
에서 인증이 성공하면 권한 정보를 포함한 토큰을 ProviderManager
로 반환한다.
토큰 저장: ProviderManager
는 검증된 토큰을 다시 AuthenticationFilter
로 전달하고, AuthenticationFilter
는 이를 SecurityContextHolder
의 SecurityContext
에 저장한다.
UsernamePasswordAuthenticationFilter
는 인증이 실패할 경우 로그인 폼을 다시 보여주는 역할을 한다.RESTful
애플리케이션에서는 화면이 없기 때문에 다른 방식의 인증 및 인가 처리를 구현할 필요가 있다. 예를 들어, JWT 토큰을 사용하여 인증을 수행하는 방법을 사용할 수 있다.💡 Tip.
스프링 시큐리티에 대한 자세한 내용은 공식 문서를 참고하기 바란다.
https://docs.spring.io/spring-security/site/docs/5.5.3/reference/html5/