
서론
회사생활을 하며 겪었던 기술들 중 필수적으로 사용되었지만 개념, 이론적으론 부족했던 기술인 Spring Security의 대해서 알아가 보려고 한다.
Spring Security란?
Spring Security는 고객 데이터를 효율적으로 관리하는 데 도움을 주고
- 인증(Authentication)과
- 인가(Authorization)
- 보안(Protection against Exploit,예: CSRF)
- 권한
기능을 지원하는 프레임워크로써 Spring MVC 기반 애플리케이션에 보안을 적용하기 위한 표준이다.
Spring Security를 사용하면 Interceptor나 Servlet Filter를 이용해서 직접 Security를 구현할 필요가 없다.
Spring Security Architecture

- 사용자가 로그인 정보와 함께 인증 요청을 한다.(Http Request)
- AuthenticationFilter가 요청을 가로채고, 가로챈 정보를 통해 UsernamePasswordAuthenticationToken의 인증용 객체를 생성한다.
- AuthenticationManager의 구현체인 ProviderManager에게 생성한 UsernamePasswordToken 객체를 전달한다.
- AuthenticationManager는 등록된 AuthenticationProvider(들)을 조회하여 인증을 요구한다.
- 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨준다.
- 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다.
- AuthenticationProvider(들)은 UserDetails를 넘겨받고 사용자 정보를 비교한다.
- 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환한다.
- 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환된다.
- Authenticaton 객체를 SecurityContext에 저장한다.
Spring에서의 요청 처리 방법
스프링에서, HTTP Request는 아래의 순서대로 Request가 처리된다.
1. HTTP Request
2. WAS
3. FilterChain (다수의 필터가 doFilter 메서드로 체이닝)
4. DispatcherServlet
5. Interceptor
6. Controller
Spring Security의 동작 원리를 위해선 필터를 이해하는 것이 중요하다.

- 요청사항 필터링
- HttpServletResponse와 HttpServletRequest를 적절히 변형하여 Servlet 까지 전송
- Request가 여러 필터를 거쳐서 인증,인가의 과정을 거치게 된다.
이처럼 클라이언트의 Http 요청을 주고받는 사이에 다양한 필터들이 존재하는데 Spring Security는 그걸 커스텀하여 사용자의 인증,인가에 대한 처리를 연쇄적으로 실행하여 수행한다.
Spring Security가 제공하는 필터

스프링 시큐리티는 다양한 기능을 가진 필터들을 10개 이상 기본적으로 제공한다. 이렇게 제공되는 필터들을 Security Filter Chain(시큐리티 필터 체인)이라고 한다.
이제 예제를 진행하며 Spring Security에 대한 이해도를 높여보려고 한다.