적절한 설정(`X-Frame-Options: SAMEORIGIN`)에도 불구하고 브라우저가 iframe에서 Discourse 렌더링을 차단합니다

안녕하세요,

우리는 애플리케이션 내에서 iframe에 Discourse 인스턴스를 임베드하고 있으며, 현재로서는 정상적으로 작동하고 있습니다. 그러나 인증되지 않은 사용자가 접근할 권한이 없는 페이지(존재하지 않거나 그룹 제한이 적용된 페이지)에 접근을 시도하면, 응답에 갑자기 X-Frame-Options: SAMEORIGIN 헤더가 포함되어 브라우저가 프레임 렌더링을 차단하는 문제가 발생합니다.

3.3.1 stable 버전부터 최근 bleeding edge(지난주 중반까지 테스트)까지 다양한 버전에서 확인해 보았습니다.

이 인스턴스는 부모 애플리케이션과 다른 서브도메인으로 실행되며, allow_embedding_site_in_an_iframe: true 설정으로 임베딩이 구성되어 있습니다. 클린 인스턴스를 디버깅해 보니, 이러한 경우 ApplicationController의 conditionally_allow_site_embedding 메서드가 호출되지 않아 응답에 헤더가 그대로 남아 있는 것을 확인했습니다(GH 링크). 이는 어떤 지점에서 예외가 발생하여 플로우가 중단되기 때문인 것으로 파악되었습니다.

재현 방법:

  1. 클린 Discourse 인스턴스(또는 실제로는 어떤 인스턴스든 – 로컬, 테스트, 프로덕션 환경 모두에서 발생함)를 실행하고 allow_embedding_site_in_an_iframe: true로 설정합니다.
  2. HTTPS로 서빙되는 웹사이트에서 존재하지 않는 경로를 사용하여 404 오류를 트리거하도록 iframe에 임베드합니다.

기대 결과: 브라우저가 Discourse 렌더링을 허용합니다.
실제 결과: 응답에 X-Frame-Options: SAMEORIGIN이 포함되어 있어 브라우저가 Discourse 렌더링을 방지합니다.

부연 설명: 이 시스템은 DNS-only Cloudflare를 통해 실행되고 있으며, 프록시 모드에서 헤더를 삭제하는 것을 시도해 보았습니다. 그러나 커스텀 SSO 구현에 필요한 쿠키가 Cloudflare에 의해 필터링되므로 프록시 모드로 전환할 수 없어, 현재로서는 이 방법이 우리에게 불가능합니다.