스프링 시큐리티의 모듈 구성
스프링 시큐리티는 컴포넌트 역할에 따라 모듈이 분리되어 있으며 일반적인 웹 애플리케이션에 보안 기능을 갖출 때
필요한 모듈은 다음 4가지이다.
모듈명 |
설명 |
spring-security-core |
인증과 인가 기능을 구현하기 위한 핵심적인 컴포넌트로 구성 |
spring-security-web |
웹 애플리케이션의 보안 기능을 구현하기 위한 컴포넌트로 구성 |
spring-security-config |
각 모듈에서 제공하는 컴포넌트의 설정을 지원하기 위한 컴포넌트로 구성됨(자바 기반 설정 방식을 지원하는 클래스나 XML 네임스페이스를 해석하는 클래스 등) |
spring-security-taglibs |
인증 정보나 인가 정보를 사용하기 위한 JSP 태그 라이브러리로 구성됨 |
프레임워크 아키텍처
서블릿 필터의 메커니즘을 활용해 웹 애플리케이션의 보안 기능을 지원하는 아키텍처를 채택하고 있으며,
다음과 같은 흐름으로 동작한다.
1. 클라이언트는 웹 애플리케이션에 요청을 보낸다
2. 스프링 시큐리티의 FilterChainProxy 클래스(서블릿필터)가 요청을 받은 다음, HttpFirewall 인터페이스의 메소드를
호출해서 HttpServletRequest와 HttpServletResponse에 대한 방화벽 기능을 수행한다.
3. FilterChainProxy 클래스는 SecurityFilterChain에 설정되어 있는 보안 필터 클래스에 처리를 위임한다.
이 필터는 실제로 서블릿 필터 형태로 만들어져 있다.
4. SecurityFilterChain에는 여러 보안 필터가 연쇄적으로 연결된 형태로 설정 되어 있으며, 앞의 보안 필터가
정상적으로 처리되면 뒤이은 보안 필터가 뒤이어 호출되는 방식으로 동작한다.
5. 마지막 보안 필터의 처리가 정상적으로 종료되면 뒤이어 남은 서블릿 필터나 서블릿이 실행되어 웹 애플리케이션의
리소스에 접근할 수 있게 된다.
6. FilterChainProxy 클래스는 웹 애플리케이션에서 반환한 리소스를 클라이언트에 전달한다.
프레임워크에서 주요 기능을 처리하는 컴포넌트는 다음과 같다.
FilterChainProxy
FilterChainProxy 클래스는 프레임워크의 진입점 역할을 하는 서블릿 필터 클래스다.
이 클래스는 프레임워크에서 처리되는 전체 흐름을 제어하고 보안 기능과 같은 추가 기능을 필터에 위임하는
방식으로 동작한다.
HttpFirewall
HttpFirewall 인터페이스는 HttpServletRequest와 HttpServletResponse에 대한 방화벽 기능을 추가하기 위한
인터페이스이다. 기본적으로 DefaultHttpFirewall 클래스가 사용되고, 디렉터리 탐색 공격이나 인가되지 않은
요청을 차단하는 역할을 한다.
SecurityFilterChain
SecurityFilterChain 인터페이스는 FilterChainProxy가 받은 요청에 적용할 보안 필터 목록을 관리하기 위한
인터페이스다. 기본적으로 DefaultSecurityFilterChain 클래스가 사용되고 요청 패턴 별로 보안 필터 목록을
관리한다.
예를들어, 다음과 같이 빈을 정의하면 지정한 경로 패턴마다 다른 보안기능을 적용할 수 있다.
자바 기반 설정 방식을 이용한 빈 정의
@EnableWebSecurity
public class WebSecurityConfig{
@Configuration
@Order(1)
public ststic class UiWebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
proteted void configure(HttpSecurity http) throws Exception{
http.antMatcher(*/ui/**");
//생략
}
}
@Configuration
@Order(2)
public static class ApiWebSecurityConfig extends WebSecurity ConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{
http.antMatcher("/api/**");
//생략
}
}
}
xml 기반 설정 방식을 이용한 빈 정의
<sec:http pattern="/ui/**">
<!-- 생략 -->
</sec:http>
<sec:http pattern="/api/**">
<!-- 생략 -->
</sec:http>
보안 필터
보안필터는 보안 기능을 제공하는 서블릿 필터 클래스이다. 스프링 시큐리티는 이러한 보안 필터를 체인형태로
연결해서 웹 애플리케이션에 필요한 보안 기능을 하도록 만들어져 있다.
클래스명 |
설명 |
SecurityContextPersistenceFilter |
인증 정보를 요청 처리 과정 전반에서 공유할 수 있게 만든다. 기본 구현에서는 HttpSession에 인증 정보를 저장해서 공유하는 방식을 쓴다. |
UsernamePasswordAuthenticationFilter |
요청 파라미터에서 지정한 사용자명과 패스워드를 사용해 인증을 처리한다. 폼 인증을 수행할 때 사용한다. |
LogoutFilter |
로그아웃 처리를 한다. |
FilterSecurityInterceptor |
HTTP요청(HttpServletRequest)의 인가를 처리한다. |
ExceptionTranslationFilter |
FilterSecurityInterceptor에서 발생한 예외를 처리하고 클라이언트에 반환할 응답을 만든다. 기본적인 구현 방식에서는 인증되지 않은 사용자는 인증을 하도록 유도하고, 이미 인증된 사용자라면 인가 오류가 발생했다는 것을 알려준다. |
(참고 : 스프링 철저 입문)
'Spring' 카테고리의 다른 글
getRealPath("") 경로 wtpwebapps에서 변경하기 (0) | 2020.10.29 |
---|---|
The prefix "mvc" for element "mvc:interceptors" is not bound. (0) | 2020.10.21 |
Spring Security (0) | 2020.07.28 |
스프링 시큐리티, 설정 (0) | 2020.06.07 |
DI & AOP (1) | 2020.05.11 |