[Spring Security] Sprint boot 3.XX에서 h2-console 설정 시 기동 실패하는 오류 해결

kyle·2024년 6월 30일
0

Spring Framework

목록 보기
11/16

개요

로컬에서 개발할 때 h2 In-Memory DB를 사용하던 중, h2.console.enabled 설정을 true로 하고 애플리케이션을 기동시켰는데 애플리케이션 기동이 안되고 오류가 발생했다.

📍 오류 내용

This is because there is more than one mappable servlet
in your servlet context: {org.h2.server.web.JakartaWebServlet=[/h2-console/*], org.springframework.web.servlet.DispatcherServlet=[/]}.

This method cannot decide whether these patterns are Spring MVC patterns or not.
If this endpoint is a Spring MVC endpoint, please use requestMatchers(MvcRequestMatcher);

otherwise, please use
requestMatchers(AntPathRequestMatcher). This is because there is more than one mappable servlet in your servlet context: {org.h2.server.web.JakartaWebServlet=[/h2-console/*], org.springframework.web.servlet.DispatcherServlet=[/]}.


원인 파악 및 해결

오류가 발생한 이유를 요약하자면 다음과 같다.

1. Servlet Context에 기본 DispatcherServlet 외에 H2-Console 서블릿이 추가로 등록됨
2. http.requestMatchers 메소드가 URL 매핑 할 때, 어떤 서블릿의 URL인지 알 수 없어서 충돌 발생

SecurityConfig를 수정안하고 해결할 수 있는 방법을 찾아보았지만 결국 찾지 못했고,

에러 로그에서 제공한 가이드인 requestMatchers에 AntPathRequestMatcher로 URL을 한번 감싸서 매핑하는 방법을 선택했다.

📌 AS-IS : 기존 URL 별 보안 설정 코드

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		
        ...
		
        http.authorizeHttpRequests((authorizeRequests) ->
                        authorizeRequests
                                .requestMatchers("/users/**").permitAll()
                                .requestMatchers("/h2-console/**").permitAll()
                                .anyRequest().authenticated()
                )        
        ...
        return http.build();
    }
 

📌 TO-BE : AntPathRequestMatcher로 감싸줌

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		
        ...
		
        http.authorizeHttpRequests((authorizeRequests) ->
                        authorizeRequests
                                .requestMatchers(new AntPathRequestMatcher("/users/login")).permitAll()
                                .requestMatchers(new AntPathRequestMatcher("/users/join")).permitAll()
                                .requestMatchers(new AntPathRequestMatcher("/error")).permitAll()
                                .requestMatchers(new AntPathRequestMatcher("/h2-console/**")).permitAll()
                                .requestMatchers(new AntPathRequestMatcher("/users/admin")).hasRole(RoleType.ADMIN.getType())
                                .anyRequest().authenticated()
                )        
        ...
        return http.build();
    }
profile
서버 개발자의 소소한 개발 일기

0개의 댓글