h2 console 삽질이야기 AntPathRequestMatcher / MvcRequestMatcher 충돌

Jake·2024년 3월 20일

개요

iframe 접근, sameOrigin()
AntPathRequestMatcher 와 MvcRequestMatcher 충돌

스프링에서 가볍고 빠르게 디비를 사용하기 위해 인메모리 db인 h2 를 사용하기로 했습니다.

그런데 왠걸? .yml에 설정값만 넣어주면 잘 동작할 줄 알았던것이 에러가 연속적으로 발생하기 시작하였습니다.

에러 흐름

h2 console 세팅시 화면이 보이지 않는 현상

-> error : Refused to display 'http://localhost:8080/' in a frame because it set 'X-Frame-Options' to 'deny'.

f12로 개발자도구 console을 살펴보니 'X-Frame-Options' to 'deny' 로 세팅이 되어있어 그렇다고 합니다.

해석해보면 X-Frame-Options 설정이 deny로 설정되어있어서 iframe을 통해 접근시 화면이 보이지 않고 있던 것 입니다.

이유는 Spring Security에서 기본적으로 클릭제킹 공격을 막기위해 설정이 되어있다고 합니다.

클릭 제킹이란 ?
웹 사용자가 클릭하는 것이 아닌 다른것들을 클릭한다고 속여 비밀정보를 유칠시키는 등의 해킹기법

그래서 동일 도메인에 대해서는 iframe이 접근 가능하도록 sameOrigin을 허용하도록 아래와 같이 설정해주었습니다.

AntPathRequestMatcher 와 MvcRequestMatcher 충돌

그리고 실행을 해보니 이번에는 Unsatisfied dependency expressed through method 'setFilterChains' 가 발생하더니 그 이유를

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

라고 합니다 이를 해석해보면

JakartaWebServlet과 DispatcherServlet 2개의 Servlet이 Servlet Context에 등록되고 어떤 servlet을 사용해야할지 명확하게 알려주지 않아 에러가 발생된 것입니다.

저의 코드를 다시 살펴보니 ..

파란색 네모칸 부분에서 어떤 requestMathcer을 할지 명시해주지 않아 충돌이 발생한 것입니다.

아래와 같이 명시해주니 잘 동작하였고 화면도 정상적으로 표시가 되었습니다.

참고 사이트

0개의 댓글