본문 바로가기

H2 콘솔이 렌더링되지 않을때

@정소민fan2025. 10. 28. 12:57

스프링 프로젝트를 하던 중, 로컬 데이터베이스로 인메모리 h2를 사용하기로 했다. application.yml 설정은 다음과 같다

spring:
  h2:
    console:
      enabled: true
      path: /h2-console

  datasource:
    url: jdbc:h2:mem:testdb
    driverClassName: org.h2.Driver
    username: sa
    password:

이렇게 사용하면, /h2-console로 접근하면 인메모리 데이터베이스를 확인할 수 있다.

또한, 스프링 시큐리티를 적용해서 인증/인가 관리를 하기로 했는데, 여기서 문제가 생겼다.

/h2-console 경로는 다음과 같이 권한을 인가해줬는데, 접속하니까 렌더링이 안되는 문제가 생겼다.

http.authorizeHttpRequests(auth -> auth
            .requestMatchers(PathRequest.toH2Console()).permitAll()
        ...

바로 이렇게...

아니 이게 뭐지??? 하고 찾아보니까...

 

이는 스프링 시큐리티가 클릭재킹을 방어하기 때문에 생기는 문제라고 한다.

클릭재킹이 무엇인가?

공격자는 악의적인 사이트를 만드는데, 예를 들면 정상적인 버튼을 사용자에게 노출하여 이를 클릭하도록 유도한다. 그리고 정상적인 버튼 위에 투명한 <iframe>을 겹쳐서, 공격 버튼을 누르도록 하는 것이다.

참고 사이트

 

Click jacking

Clickjacking 사용자가 사이트의 콘텐츠를 클릭할 때 악성 사이트의 콘텐츠를 클릭하게 되는 인터페이스 기반 공격이다. 한 예로 버튼을 클릭하면 돈을 주는 사이트가 있다고 가정해 보자. 사용자

rhenus9911.tistory.com

 

스프링 시큐리티는 이를 막기 위해 기본적으로 X-Frame-Options: DENY 라는 HTTP 헤더를 모든 응답에 포함시킨다. 이는 브라우저에게 이 페이지를 <iframe> 안에서 절대로 렌더링하지 말라는 헤더이다.

위에서 h2의 렌더링이 막힌 이유는, h2의 모든 패널이 <iframe> 으로 로드되도록 설계되어서 그런 것이다.

어떻게 해결할까?

.headers(headers ->
    headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)
);

스프링 시큐리티 설정에 위와 같은 설정을 추가해주면 된다.

이는 X-Frame-Options: DENYX-Frame-Options: SAMEORIGIN 으로 변경해주는 옵션이다.

이 옵션을 사용하면 다른 도메인에서 로드하는 것은 차단하지만, 같은 도메인에서 로드하는 <iframe> 들은 허용하도록 해 준다.

이제 잘 나온다. 좋았쓰-

정소민fan
@정소민fan :: 코딩은 관성이야

코딩은 관성적으로 해야합니다 즐거운 코딩 되세요

목차