Bldev's Blog

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

2022. 11. 9.

아키텍쳐

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

스프링 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) 메서드를 재정의하여 인증 서비스 설정

로그인 기능

-