Referer 없음, 임베딩 불가

안녕하세요,

저희는 New ROOT Web Site! - ROOT 에서 Jekyll용 Discourse 임베딩을 사용하고 있으며, 잘 작동하고 있습니다! 다만, 브라우저가 Referer: 헤더를 차단하는 경우를 제외하면요. 이 경우 400 Bad Request 오류가 발생합니다. 직접 테스트해 보세요. Firefox의 사생활 보호 창(리퍼러를 차단하는 창)으로 전환하면 임베딩이 작동하지 않습니다. 리퍼러를 좀 더 엄격하게 처리하는 Safari에서도 마찬가지입니다.

Firefox 사생활 보호 창에서 New ROOT Web Site! - Blog - ROOT Forum 를 확인해 보니 HTTP 400 오류가 발생했습니다. 이후 요청을 편집하여 Referer: https://root.cern/blog/new-web-site/ 헤더를 추가했더니 400 오류가 200으로 바뀌어 정상적으로 작동했습니다.

저희는 “모든 출처 임베딩 허용(embed any origin)” 옵션을 활성화해 두었습니다. 그리고 정확히 하나의 임베딩 사이트에만 댓글 기능이 있습니다. 이 문제를 해결할 방법이 있을까요?

감사합니다, Axel.

네, 재현할 수 있습니다.

흥미로운 점은 https://blog.codinghorror.com/the-cloud-is-just-someone-elses-computer/ 의 임베드된 댓글은 Firefox 개인 창에서도 문제없이 동작한다는 것입니다. 문제가 도메인과 관련이 있을까요? 님의 블로그는 root.cern에 있고, 폼은 root-forum.cern.ch에 있습니다.

Simon님,

확인해 주셔서 감사합니다! 도메인 이름의 차이와 관련이 있을 수 있습니다. 브라우저가 같은 도메인에 대한 요청에는 referrer를 제공하지만, 다른 도메인에 대해서는 제공하지 않을 수 있다고 생각합니다. 흥미로운 점이지만, 이 문제를 해결하기 위해 우리가 할 수 있는 일이 아직 명확하지 않습니다. 포럼 도메인으로 root.cern을 사용할 수 없으며, 크로스 도메인 임베딩은 핵심적이고 매우 유용한 기능이었는데… 최근 프라이버시 강화로 인해 이러한 기능이 위험에 처한 것인지, 아니면 해결책을 생각하실 수 있을까요?

역시 시도해 볼 수 있는 방법은 root.cern/forum에서 root-forum.cern.ch로 리버스 프록시를 설정하는 것입니다. 이렇게 하면 임베딩이 같은 호스트에서 이루어지는 것처럼 처리되어 referrer를 유지할 수 있을지 모릅니다. 다시 연락드리겠습니다 :slight_smile:

감사합니다, Axel

안녕하세요,

이제 훨씬 더 간단한 해결책을 찾았습니다. Embed Discourse comments on another website via Javascript 에서 언급되었어야 할 내용입니다:

사이트 간 임베딩의 경우, 임베딩 페이지에 다음 중 하나를 추가하세요.

  • 경로가 제공되지 않으므로 Path Allowlist를 /.*로 설정하고 <meta name="referrer" content="strict-origin">를 추가하거나,
  • 실제 Path Allowlist를 설정하고 <meta name="referrer" content="no-referrer-when-downgrade">를 추가하세요.

Referrer-Policy header - HTTP | MDN 에 언급된 대로 “브라우저들은 더 엄격한 기본값으로 전환하기 위해 노력하고 있으며”, Discourse 임베딩은 크로스 호스트 임베딩에 대해 구식 기본값에 의존하고 있습니다.

Axel 드림.

Chrome 85부터 이것이 기본 브라우저 표준이 될 예정인 점(A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin  |  Blog  |  Chrome for Developers)을 고려할 때, 대안을 살펴볼까요?

다음 세 가지 조건을 모두 충족하는 요청을 허용할 수 있을까요?

  • 요청에 discourseEmbedUrl과 Referer가 모두 포함되어야 함
  • Referer가 discourseEmbedUrl의 origin으로 설정되어 있어야 함
  • discourseEmbedUrl이 임베딩 규칙 중 하나와 일치해야 함

대부분의 사용자에게는 discourseEmbedUrl을 전달하는 것이 간단할 것이라고 생각합니다.

경고 하나만 드릴게요, Tejas - AFAIK meta 태그가 없으면 Safari와 Firefox / Private 모드에서는 Referer 헤더가 완전히 억제됩니다. 제안하신 방법은 Chrome >= 85에서 작동할 수 있지만, meta 태그를 추가하는 것이 더 견고하고 일반적이며 대부분의 임베딩 환경에서 충분히 간단하다고 생각합니다.