「Error Embedding」 댓글

요약: 임베딩 설정에서 어떤 호스트를 허용하든 Discourse가 “Error Embedding” 오류를 반환합니다.

foo.com에 게시된 사이트가 forum.foo.com의 Discourse 포럼에서 댓글을 임베딩하고 있으며, 이는 정상적으로 작동하고 있습니다. 예를 들어 https://foo.com/blog/2019-11-22/foo-0.9.6-released 로 이동하면 임베딩된 댓글이 정상적으로 표시됩니다. 이 경우 페이지 소스에서 임베딩을 위한 스크립트 코드는 다음과 같습니다:

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

또한 로컬 머신에서 localhost로 실행 중인 사이트의 개발 버전이 있으며, 여기서 임베딩에 문제가 발생합니다 - 포럼이 생성하고 반환하는 HTML 내부의 댓글 대신 “Error Embedding” 메시지가 계속 표시됩니다. 즉, 임베딩 영역의 오른쪽 상단에 포럼 로고와 링크는 보이지만, 댓글 목록 대신 해당 오류 메시지만 표시됩니다.

예를 들어 프로덕션 사이트와 동일한 페이지인 http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/ 로 이동하면, 페이지 소스에서 임베딩을 위한 스크립트 코드는 다음과 같습니다:

<div id='discourse-comments'></div>
<script type="text/javascript">
  DiscourseEmbed = { discourseUrl: 'https://forum.foo.com/', discourseEmbedUrl: 'http://localhost:1313/blog/2019-11-22-foo-0.9.6-released/' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

discourseEmbedUrl 설정의 끝에 슬래시(/)가 있는 경우와 없는 경우 모두 시도해 보았지만, 차이는 없습니다.

포럼이 실행되는 서버에 직접 접근할 수는 없지만, 포럼의 관리 패널에 들어가서 임베딩 설정에 여러 호스트 허용 항목을 추가해 보았습니다. 임베딩이 정상적으로 작동하는 프로덕션 사이트의 현재 설정은 다음과 같습니다:

"Allowed Hosts", "Class Name", "Path Whitelist", "Post to Category"

foo.com, <빈 값>, /blog/.*, blog

localhost 개발 버전 사이트에서 작동하도록 하기 위해 추가한 내용은 다음과 같습니다:

"Allowed Hosts", "Class Name", "Path Whitelist", "Post to Category"

localhost, <빈 값>, /blog/.*, blog
localhost:1313, <빈 값>, /blog/.*, blog
<포럼 서버가 인식하는 내 외부/공개 IP>, <빈 값>, /blog/.*, blog
<포럼 서버가 인식하는 내 외부/공개 IP>:1313, <빈 값>, /blog/.*, blog

그러나 이 중 어느 것도 작동하지 않으며, 계속 동일한 “Error Embedding” 메시지만 표시됩니다.

소스 코드를 파고들어서 디버깅을 시도하는 것보다, Discourse가 해당 오류 메시지를 생성해야 한다고 판단할 때 무엇을 확인하는지에 대한 정보를 얻고 싶습니다. 누군가 그 내용을 알려주고, 어떻게 수정해야 하는지 알려줄 수 있을까요? 꽤 직관적이어야 할 것 같은데, 여기서는 Discourse가 블랙박스처럼 작동하고 있습니다.

Embed Discourse comments on another website via Javascript 의 모든 내용을 읽었지만, 더 유용한 정보를 제공하지는 않습니다.

Embed Discourse comments on another website via Javascript 에서 언급된 대로 topicID를 사용하는 것이 좋습니다.

"localhost"가 다양한 이유로 금지되어 있을 수 있으니 놀라지 마세요. 이렇게 하면 포럼 서버가 자신에게 임베드하도록 지시하게 됩니다. :dizzy_face:

Hugo를 사용하고 있다면, 조건부 로드 템플릿을 사용하거나 템플릿에서 baseURL을 명시적으로 전달하여 개발 중에도 discourseEmbedUrl: 'https://foo.com/blog/2019-11-22/foo-0.9.6-released'가 로드되도록 할 수 있습니다.

@maiki 답변해 주셔서 정말 감사합니다.

가이드에 설명된 대로 topicId를 사용해도 동작하지 않고, 증상도 전혀 바뀌지 않습니다. 요청되는 URL은 당연히 https://forum.foo.com/embed/comments?topic_id=2279로 변경되지만, 동일한 오류 메시지가 표시됩니다.

또한 discourseEmbedUrl을 https://foo.com/blog/2019-11-22/foo-0.9.6-released로 변경해 보았지만, 불행히도 이것도 문제가 해결되지 않았습니다.

이것이 의도된 동작이라고 하더라도, 반드시 문서화되어야 합니다. 예를 들어, 로컬호스트 사이트에서 발생하는 요청은 차단됩니까? 허용된 호스트 목록에 명시적으로 포함되어 있음에도 불구하고요? Discourse가 이 오류를 트리거하기 위해 HTTP 요청의 리퍼러(referer) 필드를 확인하는지, 아니면 정확히 어떤 것을 사용하는지 명확히 해 주셨으면 합니다. 현재까지 제가 찾은 내용 중 왜 작동하지 않는지 설명하는 것이 없어서, 이 부분은 꼭 정리해 주셔야 합니다 :slight_smile:

오류 메시지는 무엇인가요? 개발자 콘솔에 표시되는 내용이 있나요?

localhost는 유효한 도메인이 아니라 호스트명입니다.

임베드 가이드에서 이를 설명하는 것이 의미가 있는지 확신은 없지만, 그래도 참고할 수 있는 이 토픽이 있으니 다행입니다! :slight_smile:

아니요, 로컬호스트 클라이언트/브라우저의 개발자 콘솔에는 아무 문제가 없습니다. 포럼 서버에서 HTML이 성공적으로 반환되며, 개발자 도구에서 정상적으로 확인할 수 있습니다.

정상적으로 작동할 때의 모습은 다음과 같습니다(일부 텍스트는 검열됨):

하지만 현재 보이는 모습은 다음과 같습니다(일부 텍스트는 검열됨):

즉, 포럼 서버가 올바른 콘텐츠 대신 400과 "Error Embedding"을 반환하는 것뿐입니다.

물론이죠. 하지만 말씀하신 대로, Discourse가 localhost에서 오는 리퍼러의 이러한 유형의 요청을 차단하고 있을 수 있습니다. "localhost"가 도메인 이름이 아니라 호스트명이라는 점은 알고 있습니다. 이는 포럼의 임베드 설정에서 "허용된 호스트(Allowed Hosts)"로 구성하는 것이 실제로 호스트라는 사실과 일치합니다.

저는 localhost가 무엇인지 잘 알고 있으며, 그것이 문제가 되는 것은 아닙니다.

localhost가 무엇인지 설명하라는 말씀이신가요? 아니요, 그것은 필요 없습니다. 제가 제게는 작동하지 않는 이유에 대한 결론을 내리고, 그것이 문서화되어야 한다고 말한 것은, 만약 그것이 사실이라면 일반적으로 이것이 작동하지 않는 것이 예상되는 이유를 말하는 것입니다. 다시 말하지만, 현재 상태로는 이것이 예상되는 동작이라는 것을 시사하는 것이 아무것도 없습니다.

Discourse 사이트가 로그인 필수로 설정되어 있나요?

“로그인” 섹션의 “로그인 필수” 설정이 체크되어 있지 않으므로, 아니요, 설정되어 있지 않습니다.

생각을 소리 내어 말해보자면; 로컬 개발 사이트에서 요청이 올 때와 프로덕션 사이트에서 올 때의 차이는 크지 않다. HTTP 리퍼러와 물론 HTTP 요청의 출처 정도만 다를 것이다. 그 외에는 두 사이트 모두 동일한 브라우저를 사용하고 있다.

다른 활성 도메인(예: 보유 중인 도메인의 서브도메인)에 임베드하여 테스트해 보면 호스트 문제인지 확인할 수 있습니다.

생각을 말로 정리해 보면: Discourse에 "localhost"를 허용하도록 설정하면, Discourse 서버 자체인 localhost에서 이를 찾으려 할 것입니다.

행운을 빕니다! 무슨 일이 일어나고 있는지 정확히 알지 못합니다. :slight_smile:

말씀하신 논리를 이해합니다. 접근 권한을 결정하고 이 오류 메시지를 출력해야 하는지 판단할 때 실제로 무엇을 보고 있는지 파악하는 것이 흥미로워지는 순간이 바로 이때입니다.

관련해서, (임베디드 요청에 응답할 때) Discourse가 400 HTTP 응답 코드를 반환하는데, 이는 단순히 "잘못된 요청(Bad Request)"을 의미합니다. 허용되지 않는 호스트와 같은 문제라면 401(“권한 없음(Unauthorized)”) 또는 유사한 코드가 반환될 것으로 예상했지만, 실제로는 그렇지 않습니다. 따라서 이는 인증이나 허용된 호스트와 무관하다는 것을 시사합니다. 하지만 백엔드 코드가 적절한 HTTP 응답 코드를 반환하지 못하는 것일 수도 있습니다.

domain forum.foo.com의 댓글을 localhost 개발 웹사이트에 임베드할 수 있는지 여부에 대해 누군가는 알고 있을 것 같은데, 어떻게 생각하시나요? 허용된 호스트를 설정하면 작동해야 한다는 내용이 어디에도 보이지 않는데, 실제로는 작동하지 않아서 상황이 좀 불분명합니다.

더 큰 문제가 있는 것 같습니다.
X-Frame-Options 헤더가 ALLOWALL로 설정되어 있습니다.
하지만 ALLOWALL은 유효한 옵션이 아닙니다. 자세한 내용은 X-Frame-Options header - HTTP | MDN 를 참조하세요.
댓글을 임베드하려고 하면 다음 오류가 발생합니다: An invalid X-Frame-Options header was found when loading ... 'ALLOWALL' is not a valid guideline
topicId를 사용할 때만 댓글이 로드됩니다. 하지만 이는 댓글만 임베드할 경우 전체 권한이 필요하지 않기 때문이라고 생각합니다.

리포트해 주셔서 감사합니다. 어떤 브라우저에서 오류가 발생하나요? 브라우저가 최신 버전으로 업데이트되어 있나요?

파이어폭스에서 사용 중이고 최신 버전으로 업데이트되어 있습니다. 크롬도 확인해 봤는데 에러 메시지는 뜨지 않았지만, 그냥 작동하지 않았습니다.

관심 있는 분들을 위해, 저는 이전에 이 문제의 인스턴스를 자세히 설명한 바 있습니다. 그리고 어떤 이유에서인지, 사이트를 최종적으로 게시했을 때 댓글 임베딩이 정상적으로 작동했습니다.

즉, 제가 이전에 설명한 문제와 증상은 forum.domain.com의 댓글을 임베드하는 웹사이트를 localhost와 같은 자체 시스템에서 실행할 때 발생했습니다. 하지만 웹사이트를 domain.com에 게시하자마자 바로 정상 작동했습니다.

이전에 언급했듯이, domain.com 이외의 출처에서 댓글 접근 또는 임베딩을 금지하는 포럼 설정을 찾을 수 없습니다. 따라서 이 문제가 왜 발생했는지는 여전히 저에게 미스터리입니다. Discourse 코드 내에 이를 방지하는 무언가가 반드시 존재할 텐데, 그것이 무엇인지는 알지 못합니다.

이 문제를 재현해 보려고 했지만, 아직까지 재현하지 못했습니다. 기본 임베드 스크립트를 사용했을 때 최신 Chrome과 Firefox 브라우저( Ubuntu에서 실행) 모두에서 오류 없이 댓글이 정상적으로 표시됩니다.

확인해 보시면 좋을 다른 한 가지 사항은 사이트의 관리자 / 사용자 정의 / 임베딩 섹션에서 호스트 레코드를 생성했는지 확인하는 것입니다. 이 부분은 테스트 중 오류가 발생했는데, 원인은 “토픽 생성용 사용자 이름” 설정을 입력하고 임베딩 설정을 저장하지 않았기 때문이었습니다.

나도 비슷한 문제를 겪었던 것 같은데, 관리자 > 사용자 지정 > 임베딩 설정에서 허용된 호스트를 example.com에서 www.example.com으로 변경하니 해결되었습니다. 제 포럼이 subdomain.example.com에 설치되어 있어서 그 때문에 문제가 생긴 것 같습니다.

어쨌든 이 정보가 도움이 될지는 모르겠지만, 꼭 해결되길 바랍니다!