이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
필터 초기화와 다중 보안 설정
필터 초기화와 다중 설정 클래스
- 설정클래스 별로 보안 기능이 각각 작동한다.
- 설정클래스 별로 RequestMatcher 설정
- http.antMatcher("/admin/**)
- 설정클래스 별로 필터가 생성
- FilterChainProxy가 각 필드들을 가지고 있다.
- 요청에 따라 ReqeustMatcher와 매칭되는 필터가 작동하도록 한다.
- 사용자가 GET 방식으로 /admin 자원에 접근한다.
- FilterChainProxy가 요청을 받아 사용자 요청을 처리할 필터를 선택해야 한다.
- FilterChainProxy는 각 객체에 포함된 RequestMatcher에 포함된 자원과 사용자가 요청한 자원이 동일한 것을 찾는다.
- 찾은 필터가 인증/인가 작업을 수행한다.
실습
@Configuration
@EnableWebSecurity
@Order(0)
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.antMatcher("/admin/**")
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
@Configuration
@Order(1)
class SecurityConfig2 {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().permitAll()
)
.formLogin();
return http.build();
}
}
- SecurityConfig의 경우 특정 URL ("/admin/**")을 지정하였다.
- 기본적으로 보안 기능은 모든 사용자가 인증을 받도록 지정하였다.
- 인증 방식으로 httpBaic 방식을 사용한다.
- SecurityConfig2의 경우 모든 URL에 대해 permitAll()
- 인증 방식으로 formLogin 방식을 사용한다.
- @Order 애노테이션을 사용해 FilterChainProxy의 검사 순서를 지정할 수 있다.
참고
현재 서버를 실행하면 다음과 같이 에러 메시지가 출력될 수 있다.
해결방법은 간단하다.
IntelliJ > Settings > Build, Execution, Deployment > Build Tools > GradleGradle을 IntelliJ로 변경해 준다.
참고
또한 다음과 같은 이유로 서버 실행이 안 될 수도 있다.
다른 곳에서 이미 filterChain bean을 생성해 중복이 발생하기 때문이다.
스프링부트 2.1부터는 overriding 옵션이 false로 default 설정이 된다고 한다.
해결방법은 다음과 같다.
Bean Overriding을 활성화하기 위해 application.yml에 spring.main.allow-bean-definition-overriding: true 옵션을 추가해 준다.
실행
- /admin/** 경로 자원을 요청하면 httpBasic 방식으로 인증을 요구한다.
- /admin/** 경로가 아닌 루트(/) 경로를 요청하면 다음과 같이 출력된다.
참고
현재 SecurityConfig 클래스의 @Order 순서가 0, SecurityConfig2 클래스가 1이다.
즉, SecurityConfig 설정 클래스를 먼저 확인한 뒤 SecurityConfig2 클래스 설정을 확인한다.
만약 두 클래스의 @Order 애노테이션 순서를 바꾸면 다음과 같은 일이 발생한다.
별다른 인증을 거치지 않고 /admin/** 자원에 접근이 가능해진다.
@Order 애노테이션 숫자를 지정할 경우 넓은 범위의 URL의 순서가 더 커야 한다.
즉, 구체적인 경로의 우선순위가 더 높아야 한다.
'스프링 시큐리티 > 스프링 시큐리티 주요 아키텍처 이해' 카테고리의 다른 글
인증 흐름 이해 - AuthenticationFlow (0) | 2023.01.31 |
---|---|
인증 저장소 필터 - SecurityContextPersistenceFilter (0) | 2023.01.31 |
인증 저장소 - SecurityContextHolder, SecurityContext (0) | 2023.01.31 |
인증 개념 이해 - Authentication (0) | 2023.01.30 |
위임 필터 및 필터 빈 초기화 - DelegatingProxyChain, FilterChainProxy (0) | 2023.01.28 |