본문 바로가기
  • 개발하는 곰돌이
Development/Errors

[Spring Security] Spring Boot 3.0 이상에서 스프링 시큐리티 적용 시 H2 콘솔에 접속되지 않는 문제 해결

by 개발하는 곰돌이 2023. 5. 19.

목차

    문제의 상황

    스프링부트 3.0.X 버전을 공부하면서 스프링 시큐리티와 JWT로 사용자 인증 기능을 설정해보기 위해 H2 DB에 사용자 정보를 저장해서 DB에 저장된 데이터를 토대로 테스트해보려고 했다.

     

    JWT를 사용했기 때문에 SessionCreationPolicy는 STATELESS로 설정했고, 로그인도 로그인 API를 호출해서 사용하기 위해 따로 formlogin() 없이 시큐리티 설정을 했다.

    @Configuration
    class SecurityConfig {
        private val allowedUrls = arrayOf("/", "/swagger-ui/**", "/v3/**", "/sign-up", "/sign-in", "/h2-console/**")
    
        @Bean
        fun filterChain(http: HttpSecurity) = http
            .csrf().disable()
            .headers { it.frameOptions().sameOrigin() }
            .authorizeHttpRequests {
                it.requestMatchers(*allowedUrls).permitAll()
                    .anyRequest().authenticated()
            }
            .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
            .build()!!
    }

    위 설정과 같이 모두에게 허용할 URL 목록에 /h2-console/**을 추가했음에도 불구하고 H2 콘솔에 접속하면 403 에러가 반겨줬다.

    해결 방법

    온라인에서 찾을 수 있는 대부분의 해결법은 스프링부트 3.0 이상부터는 완전히 지원중단되어 삭제된 방법을 사용하고 있어서 굉장히 난감한 상황이었는데 스택오버플로우에서 해답을 찾았다.

     

    SecurityFilterChain을 설정하는 빈에서 다음 코드를 추가한다.

    @Bean
    fun filterChain(http: HttpSecurity, introspector: HandlerMappingIntrospector) = http
        .csrf().disable()
        .headers { it.frameOptions().sameOrigin() }
        .authorizeHttpRequests {
            it.requestMatchers(*allowedUrls).permitAll()
                .requestMatchers(MvcRequestMatcher(introspector, "/**")
                    .apply { setServletPath("/h2-console") }).permitAll()	// 추가
                .anyRequest().authenticated()
        }
        .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
        .build()!!

    빈의 파라미터에 HandlerMappingIntrospector를 추가하고 MvcRequestMatcher 객체를 생성하여 허용 목록에 추가한다.

     

    애플리케이션 설정에서 H2 콘솔을 활성화하면 자동으로 H2 콘솔이 서블릿으로 등록되는데, 서블릿 경로를 requestMatchers()에 추가하기 위해선 MvcRequestMatcher를 사용해야 한다는 것 같다.

     

    단순히 H2 콘솔만 사용하려면 다음과 같이 좀 더 간단한 코드를 사용할 수도 있다.

    @Bean
    fun filterChain(http: HttpSecurity) = http
        .csrf().disable()
        .headers { it.frameOptions().sameOrigin() }
        .authorizeHttpRequests {
            it.requestMatchers(*allowedUrls).permitAll()
                .requestMatchers(PathRequest.toH2Console()).permitAll()	// 추가
                .anyRequest().authenticated()
        }
        .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
        .build()!!

    PathRequest.toH2Console()는 애플리케이션 설정에서 H2 콘솔 경로를 변경하더라도 항상 적절한 경로를 반환한다는 점에서 편리하게 사용할 수 있을 것 같다.

     

    이렇게 설정을 한 뒤에는 allowedUrls에서 /h2-console/**을 제거해도 된다.

    결과

    드디어 H2 콘솔에 별도의 절차 없이 접속할 수 있게 되었다!

    참조 링크

     

    Spring Boot 3 security cannot access H2 console - 403

    I'm in the process of re-learning Spring security in Spring Boot 3. Things changed a little and for some reason the same settings working for WebSecurityConfigurerAdapter's config method will not ...

    stackoverflow.com

     

    Data

    The Spring Framework provides extensive support for working with SQL databases, from direct JDBC access using JdbcTemplate to complete “object relational mapping” technologies such as Hibernate. Spring Data provides an additional level of functionality

    docs.spring.io

     

    댓글