Spring Security ‐ 초기화 설정 - woojin-playground/Backend-PlayGround GitHub Wiki
- 서버가 기동되면 스프링 시큐리티 초기화 작업 및 보안 설정이 이루어진다.
- 별도의 설정이 코드를 작성하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동되어 작동한다.
- 기본적으로 모든 요청에 대해 인증 여부를 검증하고 인증이 승인되어야 자원에 접근이 가능하다.
- 인증 방식은 폼 로그인 방식과
httpBasic로그인 방식을 지원한다. - 인증을 시도할 수 있는 로그인 페이지가 자동적으로 생성되어 렌더링이 된다.
- 인증 승인이 이루어질 수 있도록 한 개의 계정이 기본적으로 제공된다.
❗허나, 기본적으로 작동하는 웹 보안으로는 실제 서비스에서 제공되기엔 한계가 있다.
-
SecurityBuilder클래스는 빌더 클래스로서 웹 보안을 구성하는 빈 객체와 설정 클래스들을 생성하는 역할을 하며 대표적으로WebSecurity,HttpSecurity가 있다. -
SecurityConfigurer클래스는 Http 요청과 관련된 보안 처리를 담당하는 필터들을 생성하고 여러 초기화 설정에 관여한다. -
SecurityBuilder클래스는SecurityConfigurer를 참조하고 있으며, 인증 및 인가 초기화 작업은SecurityConfigurer에 의해서 진행된다.
-
HttpSecurityConfiguration에서HttpSecurity를 생성하고 초기화를 진행한다. -
HttpSecurity는 보안에 필요한 각 설정 클래스와 필터들을 생성하고 최종적으로SecurityFilterChain스프링 빈을 생성한다.
-
WebSecurityConfiguration에서WebSecurity를 생성하고 초기화를 진행한다. -
WebSecurity는HttpSecurity에서 생성된SecurityFilterChain스프링 빈을SecurityBuilder에 저장한다. -
WebSecurity가build()를 실행하면SecurityBuilder에서SecurityFilterChain을 꺼내어FilterChainProxy생성자에 전달한다.
-
boolean matches(HttpServletRequest request)- 해당 메서드는 현재 요청이 처리될 수 있는지 여부를 결정한다.
-
true인 경우FilterChain에 의해 처리될 수 있음을 의미하며false인 경우 현재FilterChain으로 처리할 수 없음을 의미한다. - 특정 요청에 특화된 Filter에 의한 필터링 로직이 적용될 수 있도록 하는
boolean메서드이다.
-
List<Filter> getFilters()- 해당 메서드는
SecurityFilterChain을 구성하는 여러 필터 컬렉션을 반환한다. - 각 필터는 요청 처리 과정에서 필요한 특정 작업들을 수행한다.
- 스프링 시큐리티는 여러 필터에 의해서 동작하는 메커니즘을 가지고 있다.
- 해당 메서드는
- 서블릿 필터는 웹 애플리케이션에서 클라이언트 요청과 서버 응답을 가공하거나 검사하는데 사용되는 구성 요소이다.
- 서블릿 필터는 클라이언트 요청이 서블릿에 도달하기 전이나 서블릿이 응답을 클라이언트에게 보내기 전에 특정 작업을 수행할 수 있다.
- 서블릿 필터는 Tomcat(WAS)에서 생성되고 실행되며 종료된다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {} // 실행 시
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public default void destroy() {} // 종료 시
}-
DelegatingFilterProxy는 스프링에서 사용되는 특별한 서블릿 필터로, 서블릿 컨테이너와 스프링 애플리케이션 컨텍스트 간 연결고리 역할을 하는 필터이다. -
DelegatingFilterProxy는 서블릿 필터 기능을 수행하는 동시에 스프링 의존성 주입 및 빈 관리 기능과 연동되도록 설계된 필터이다. -
DelegatingFilterProxy는 "springSecurityFilterChain" 이름으로 생성된 빈을 ApplicationContext에서 찾아 요청을 위임한다. - 실제 보안 처리를 수행하지 않는다.
- 앞서
DelegatingFilterProxy가 "springSecurityFilterChain"라는 이름을 가지는 스프링 빈을 ApplicationContext(=IOC Container)에서 찾아 요청을 위임한다. - 이 요청을 위임받아 보안 처리 역할을 하는 것이 바로
FilterChainProxy이다. - 내부적으로 하나 이상의
SecurityFilterChain을 가지고 있으며 요청 URL 정보를 기준으로 적절한 필터를 호출하게 된다. -
HttpSecurity를 통해 API 추가 시 관련 필터들이 추가된다. - 사용자 요청들을 필터 순서대로 호출함으로 보안 기능을 동작시키고 필요 시 커스텀으로 필터를 개발 및 등록해 기존의 필터 전후로 순서까지 지정해 추가할 수 있다.
❗실제 springSecurityFilterChain 빈을 찾아 요청을 위임하는 부분
-
SecurityFilterChain클래스 빈을 등록한 후 인증 API 및 인가 API를 설정한다.
-
@EnableWebSecurity: 어노테이션 필수 - 모든 설정 코드는 반드시 람다 형식으로 작성해야 한다.