Spring Security의 기본 구조와 기본적인 동작 방식을 이해하기 가장 좋은 인증 방식은 '폼 로그인 인증' 방식이다.
Spring Security를 이용한 보안 설정은 HttpSecurity를 파라미터로 가지고, SecurityFilterChain을 리턴하는 Bean을 생성하면 된다.
HttpSecurity 를 통해 Spring Security에서 지원하는 보안 설정을 구성할 수 읶다.
로컬 환경에서 Spring Security를 테스트 하려면 CSRF설정을 비활성화해야한다.
InMemoryUserDetailsManager 를 이용해서 데이터 베이스 연동 없이 테스트만 목적으로 하는 InMemory User를 생성할 수 있다.
(Spring Security에서 지원하는 InMemory User는 말 그대로 메모리에 등록되어 사용되는 User이므로 애플리케이션 실행이 종료되면 InMember User 역시 메모리에서 사라진다.)
Spring Security는 사용자의 크리덴셜을 암호화하기 위한 PasswordEncoder를 제공하며, PasswordEncoder는 다양한 암호화 방식을 제공한다.
Spring Security에서 제공하는 PasswordEncoder의 디폴트 암호화 알고리즘은 bcrypt이다.
사용자의 크리덴셜(Credential)이란 해당 사용자를 증명하기 위한 구체적인 수단을 의미한다. (일반적으로는 사용자의 패스워드가 크리덴셜에 해당)
패스워드같은 민감한 정보는 반드시 암호화되어 저장해야하고, 패스워드는 복호화할 이유가 없으므로 단방향 암호화 방식으로 암호화 되어야한다.
Spring Security에서 관리하는 User정보를 UserDetails로 관리한다.
UserDetails는 UserDetailsService에 의해 로드되는 핵심 User정보를 표현하는 인터페이스이다.
UserDetailsService는 User 정보를 로드(load)하는 핵심 인터페이스
Custom UserDetailsService를 사용해 로그인 인증을 처리하는 방식은 Spring Security가 내부적으로 인증을 대신 처리해 주는 방식이다.
Spring Security의 웹 요청 처리전에 먼저 보안이 적용된 웹 요청의 일반적인 흐름부터 정리하자.

위 이미지는 보안이 적용된 사용자의 웹 요청에 대한 일반적인 처리 흐름을 표현한 것이다.
요청 처리 흐름은 다음과 같다.
(1) 사용자가 보호된 리소스를 요청한다.
(2) 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜을 요청한다.
(3) 사용자는 인증 관리자한테 크리덴셜을 제공한다.
(4) 인증 관리자는 크리덴셜 저장소에서 사용자의 크리덴셜을 조회한다.
(5) 인증 관리자는 사용자가 제공한 크리덴셜과 저장소에 있는 크리덴셜을 비교해서 검증 작업을 수행한다.
(6) 유효한 크리덴셜이 아니면, Exception 을 throw 한다.
(7) 유효하다면, (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증한다.
(9) 적절한 권한을 부여받지 못한 사용자라면, Exception을 throw한다.
(10) 적절한 권한을 부여받은 사용자라면, 보호된 리소스의 접근을 허용한다.
이 과정에서 보면 사용자의 웹 요청이 Controller같은 엔드포인트를 거쳐서 접근하려는 리소스에 가기 전에 인증 관리자나 접근 결정 관리자같은 컴포넌트가 중간에서 웹 요청을 가로챈다음 사용자의 크리덴셜과 접근 권한을 검증하는 것을 알 수 있다.
이렇게 서블릿 기반 애플리케이션의 경우, 애플리케이션의 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로챈 후 어떤 처리를 할 수 있는 적절한 포인트를 제공하는데 그게 서블릿 필터(Servlet Filter)이다.
서블릿 필터는 하나 이상의 필터들을 연결해서 필터 체인을 구성할 수 있다.
Spring Security의 필터는 클라의 요청을 중간에서 가로챈 뒤에 보안에 특화된 작업을 처리하는 역할을 한다.
DelegatingFilterProxy는 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.
Spring Security 의 Filter Chain 은 Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음이며, Spring Security의 필터를 사용하기 위한 진입점이 바로 FilterChainProxy이다.