본문 바로가기

백엔드/스프링(부트)

[스프링 시큐리티] Refused to display 'http://localhost/' in a frame because it set 'X-Frame-Options' to 'deny' 에러 개선

반응형

문제 발단

- 스프링 시큐리티에서는 기본적으로 X-Frame-Optionsdeny(해당 경로에 대한 모든 frame 삽입 차단)로 지정해두기 때문에, 데이터베이스 조작을 위한 인터페이스를 iframe 형식으로 렌더링 시 이를 차단하기 때문입니다. 

- 즉, 해당 문제를 개선하려면 해당 경로에 접속하는 경우에는(동일 경로에 한정하여서는) 렌더링되는 것을 허용하도록 스프링 시큐리티 구성 파일에서 설정해주면 됩니다.

 

코드 적용

- 스프링 시큐리티 6.11 버전이상에서 적용

- SecurityConfig 파일에 

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        
        // 동일 경로에 한하여 h2-console 접속 시 iframe 허용
        http.headers(httpSecurityHeadersConfigurer -> httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin));
        
        // 아니면 아에 x-frame-option 을 꺼둘 수도 있습니다.
        http.headers(AbstractHttpConfigurer::disable);

        return http.build();
    }
}

 

참고 | X-Frame-Options 헤더가 가질 수 있는 값

X-Frame-Options는 다음과 같은 세 가지 값을 가질 수 있습니다.

- DENY: 페이지가 어떤 경우에도 <iframe>에 삽입되지 않도록 합니다.
- SAMEORIGIN: 동일 출처에서만 <iframe>에 삽입될 수 있습니다. 즉, 페이지를 포함하려는 도메인이 페이지와 동일한 도메인일 때만 허용됩니다.
- ALLOW-FROM uri: 특정 도메인에서만 해당 페이지를 포함할 수 있도록 허용합니다. 하지만 이 옵션은 모든 브라우저에서 지원되지는 않습니다.

반응형