자바 · 스프링 · 시큐리티
[스프링] 스프링 시큐리티 (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); }- 서블릿 컨테이너에 적용하는 필터를 서블릿 필터라고 한다.
- 클라이언트의 요청이 오면 서블릿 컨테이너는 요청 URI 경로 기반의
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)메서드를 재정의하여 인증 서비스 설정
로그인 기능
-