스프링 프로젝트를 하던 중, 로컬 데이터베이스로 인메모리 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: DENY를 X-Frame-Options: SAMEORIGIN 으로 변경해주는 옵션이다.
이 옵션을 사용하면 다른 도메인에서 로드하는 것은 차단하지만, 같은 도메인에서 로드하는 <iframe> 들은 허용하도록 해 준다.

이제 잘 나온다. 좋았쓰-