Spring Security는 Spring 기반의 애플리케이션의 보안(인증 및 권한 부여) 기능을 제공하는 프레임워크입니다. Spring Security는 보안 관련 작업을 위한 체계적인 옵션 세트를 제공하므로 개발자가 보안 관련 로직을 수동으로 작성할 필요가 없으며, Spring Security는 Filter 흐름에 따라 인증 및 권한 부여 프로세스를 처리합니다.
Dispatcher Servlet이 URL 요청을 수신하기 전에 Filter가 적용되어 웹 컨테이너에서 요청을 가장 먼저 수신하게 되지만(웹 컨테이너에서 관리), 반대로 인터셉터는 Dispatcher와 Controller 사이에 배치되어 Spring 컨테이너에서 관리하므로 애플리케이션 타이밍이 다릅니다(스프링 컨테이너에서 관리).
Spring Security에서 어플리케이션 보안을 구성하는 두가지 영역이 있다.
Authetication이란 해당 사용자가 본인이 맞는지 확인하는 과정
Authorization은 해당 사용자가 요청하는 자원을 실행할 수 있는 권한이 있는지를 확인하는 과정
Authentication을 거친 후에 Authorization 절차 진행!
Spring Security starter jar가 애플리케이션에 추가되면 요청의 전처리 및 후처리 단계에서 호출할 수 있는 Filter가 자동으로 추가됩니다. 이 Filter에는 여러 하위 Filter가 있으며 그 중 하나는 Authentication Filter(인증 필터)이며, 목적은 인증 프로세스를 시작하는 것입니다.
인증 필터를 통과한 후 사용자의 자격 증명은 Authetication object에 저장됩니다. g하지만 실제 인증은 authenticate() 메서드를 포함하는 인터페이스인 AuthenticationProvider에 의해 처리됩니다. Spring 애플리케이션은 각각 OAuth 또는 LDAP와 같은 다른 방법을 사용하는 여러 AuthenticationProvider를 가질 수 있습니다. 이를 모두 관리하기 위해 AuthenticationManager가 사용됩니다.
AuthenticationManager는 각 공급자의 support() 메서드를 호출하여 적절한 AuthenticationProvider를 식별합니다. 메서드가 true를 반환하면 AuthenticationManager는 해당 공급자의 authenticate() 메서드를 호출합니다.
Credentials가 AuthenticationProvider에 전달되면 UserDetailsService를 사용하여 시스템에서 기존 사용자를 검색합니다. UserDetails 인스턴스가 발견되면 AuthenticationProvider가 이를 확인하고 인증합니다. 인증에 성공하면 Principal 및 Authorities가 포함된 Authentication 개체가 반환됩니다. 그렇지 않으면 AuthenticationException이 발생합니다.