스프링 시큐리티는 자바 기반의 애플리케이션에서 인증과 권한 부여를 관리하는 프레임워크이다.
여기서 인증은 사용자가 누구인지 확인하는 과정이고, 권한 부여는 인증괸 사용자가 무엇을 할 수 있는지 결정하는 역할로 볼 수 있다.

스프링 시큐리티의 핵심 구성 요소 중 하나는 필터이다.
스프링 시큐리티 필터는 HTTP 요청을 가로채고 요청에 대해 보안 검사를 수행하는 역할로, 서블릿 필터 체인에 추가되어 요청이 서블릿으로 전달되기 전에 보안 검사를 실행한다.

우선, 인증 과정을 보면 UsernamePasswordAuthenticationFilter 와 같은 AuthenticationFilter 부분에서 사용자가 입력한 정보로 Authentication 객체를 생성하고, 이를 AuthenticationManager라는 컴포넌트로 전달한다.
위 이미지에 UsernamePasswordAuthenticationToken은 Authentication 인터페이스의 구현체로, 객체 간의 구조를 뜯어보면 UsernamePasswordAuthenticationToken이 Authentication을 implements하는 구조로 설계되어 있다.
그리고 AuthenticationManager는 인증 제공자인 AuthenticationProvider과 비교하여 사용자의 신원을 확인하고, 자격증명이 유효하다면 인증 성공 뒤, 사용자 정보를 SecurityContext에 저장한다.
추가로 SecurityContextHolder는 SecurityContext 객체를 저장하고 감사는 wrapper 클래스로, 보안 주체의 세부 정보를 포함하여 응용프로그램의 현재 보안 콘텍스트에 대한 세부 정보가 저장되어 있다.
권한 부여 과정에서는 인증이 완료되면, FilterSecurityInterceptor가 사용자의 권한을 확인하고, 요청한 리소스에 접근할 수 있는지를 결정한다.
이때, AccessDecisionManager와 SecurityContext에 저장된 사용자 정보를 참조한다. 그리고 권한 검사가 완료된 후 요청이 처리되고 응답이 반환되는 구조이다.

스프링 빈으로 등록된 필터를 서블릿 필터로 사용할 수 있도록 사용할 수 있도록 DelegatingFilterProxy를 사용한다.
DelegatingFilterProxy는 IOC 컨테이너에서 관리하는 빈이 아닌, 표준 서블릿 필터를 구현하고 있으며 내부적으로 요청을 위임할 FilterChainProxy를 가지고 있다.
DelegatingFilterProxy는 서블릿 컨테이너 기반의 필터 위에서 동작하기 위해 중간 역할만 하고 FilterChainProxy에게 요청 처리를 위임한다.
🌟 추가 질문
📍 필터와 인터셉터의 차이점?
예를 들어, 왜 UsernamePasswordAuthenticationFilter는 필터이고, FilterSecurityInterceptor 등은 인터셉터인지?
필터와 인터셉터는 모두 요청과 응답을 가로채고 처리하는데 사용되지만, 역할과 적용 시점이 다르다.
필터는 서블릿 레벨에서 동작하며, 요청이 서블릿에 도달하기 전에 처리된다. 주로 서블릿 컨테이너에 의해 처리되며, 스프링 디스패처 서블릿 이전에 시랭된다. 주로 인증이나 인코딩, 보안 관련 작업을 처리할 때 사용된다.
인터셉터는 스프링 MVC 레벨에서 동작한다. 스프링의 디스패처 서블릿 이후에 실행되며, 특정 핸들러(Controller)의 실행 전후에 요청을 가로채서 추가적인 작업을 수행한다. 주로 특정 컨트롤러나 경로에 대한 접근 권한 검사, 로그 기록 등에 사용된다.
📍 프록시 패턴과 스프링 시큐리티?
프록시 패턴은 객체에 접근하는 방식을 제어하기 위해 사용된다. 클라이언트는 실제 객체가 아닌 대리 객체(프록시)를 통해 간접적으로 대상 객체에 접근하게 되며, 프록시 객체는 요청을 가로채거나 추가 로직을 적용할 수 있다.
스프링 시큐리티는 AOP와 프록시를 사용해 보안 로직을 투명하게 적용한다.
예를 들어, 애플리케이션의 특정 메서드에 접근할 때 보안 로직이 자동으로 실행 되도록 하고, 개발자는 이러한 로직을 직접 작성하지 않아도 보안 기능이 적용된다.
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void secureMethod() {
// Admin만 접근 가능
}
필터 체인 역시 프록시 패턴과 유사한 구조로 동작하며, 각 필터는 요청을 가로채고 보안 검증 작업을 수행하며, 필요에 따라 요청을 다음 필터로 넘기거나 차단한다.