[스프링] 스프링 시큐리티 (Spring Security)

아키텍쳐

  • Filter
    • 클라이언트의 요청이 오면 서블릿 컨테이너는 요청 URI 경로 기반의 HttpServletRequest를 처리하는 FilterChain을 생성한다.
    • FilterChain은 하나 이상의 FilterServlet 인스턴스를 포함한다.
      • 하나의 Servlet은 하나의 HttpServletRrquestHttpServletResponse를 처리하지만 Filter는 여러 개 사용될 수 있다.
    • Filter 객체의 doFilter 메서드에 Filter 객체를 인자로 전달하고 다시 동일한 형태로 doFilter를 호출하므로 하나의 Filter 객체가 다운스트림 FilterServlet 객체에 영향을 미치며, Filter의 호출 순서가 중요하다.
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        chain.doFilter(request, response);
      }
      
    • 서블릿 컨테이너에 적용하는 필터를 서블릿 필터라고 한다.
  • DelegatingFilterProxy
    • 스프링은 서블릿 컨테이너의 라이프사이클과 ApplicationContext 사이를 연결할 수 있는 DelegatingFilterProxy라는 Filter 인터페이스 구현을 제공한다.
    • 서블릿 컨테이너는 자체 표준을 사용하여 Filter 인스턴스를 등록할 수 있지만, 스프링 정의 빈을 인식하지 못한다. 대신 표준 서블릿 컨테이너 메커니즘을 통해 DelegatingFilterProxy 빈을 스프링 컨테이너에 등록하고 모든 작업을 Filter를 구현하는 스프링 빈(DelegatingFilterProxy)에 위임할 수 있다.
    • DelegatingFilterProxyspringSecurityFilterChain 빈에 웹 요청 처리를 위임한다.

스프링 MVC를 사용하는 경우 자바 구성

  • 자바 구성(스프링 3.1, 스프링 시큐리티 3.2 부터 제공)을 사용할 경우 스프링 시큐리티는 기본적으로 AbstractSecurityWebApplicationInitializer 기본 클래스를 제공하여 springSecurityFilterChain 필터 빈을 스프링 컨테이너에 등록한다. springSecurityFilterChain 빈은 모든 웹 요청 보안을 처리한다.
  • springSecurityFilterChain 빈 등록은 서블릿 3.0+ 환경에서 지원하는 코드 기반 서블릿 초기화 기능링크을 사용한다.
  • 스프링을 사용하는 애플리케이션에서는 이미 스프링 구성을 불러오는 WebApplicationInitializer가 있으므로 이 구성을 사용하면 오류가 발생할 수 있다. 따라서 스프링 시큐리티를 기존 ApplicationContext에 등록해야 한다.
  • 설정
    • 구성 클래스 설정
      • @EnableWebSecurity 설정
    • 시큐리티 필터 등록
      • AbstractSecurityWebApplicationInitializer 상속
      • 구성 클래스를 생성자의 인자로 전달
        public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
          public SecurityInitializer() {
              super(구성클래스.class);
          }
        }
        
        • 하나 이상의 구성 클래스를 인자로 전달 받아 보안 기능 설정

URL 접근 보안

  • 특정 URL에 대한 접근 통제/제어 설정을 통한 보안
  • WebSecurityConfigurerAdapter 클래스에 있는 configure(HttpSecurity http) 메서드를 재정의하여 보안 설정
  • 기본 기능 설정 내용
    • anyRequest().authenticated(): 모든 요청에 대해 인증 요청
    • httpBasic(): HTTP 기본 인증
    • formLogin(): 폼 기반 로그인 활성화
  • 추가 보안 설정
    • http.authorizeRequest() 호출로 설정 시작
    • antMatchers() 메서드로 보안 규칙(특정 유저에 대한 접근 권한 부여) 작성
    • .antMatchers("URL").hasAuthority("유저명"): 특정 유저에 대해 특정 URL 요청 접근 권한 부여
    • .antMatchers(HttpMethod.메서드, "URL").hasAuthority("유저명"): 특정 유저에 대해 특정 HTTP 메서드인 요청 접근 권한 부여

인증 서비스

  • WebSecurityConfigurerAdapter 클래스에 있는 configure(AuthenticationManagerBuilder auth) 메서드를 재정의하여 인증 서비스 설정

로그인 기능

Comments