접기 가능한 세부 정보에 최대 중첩 깊이 추가

내장된 [details] 기능에 대해 최대 중첩 깊이를 추가하거나, 관리자가 이 한도를 설정할 수 있는 사이트 설정을 도입하는 것을 제안합니다.

문제

최근 제 Discourse 포럼에서 한 사용자가 24단계의 중첩된 [details] 섹션을 포함하는 게시물을 작성했습니다.

이로 인해 여러 문제가 발생했습니다:

  1. 브라우저 성능: 여러 단계를 확장하면 Firefox가 매우 느려지거나 반응이 없게 된다는 보고가 있었습니다.
  2. Markdown 엔드포인트 타임아웃: 해당 주제의 .md 엔드포인트에 액세스하는 속도가 극도로 느려졌습니다. 요청 처리에 19.8초와 31.1초가 걸리는 것을 관찰했습니다.
  3. 서버 오류: Markdown 엔드포인트가 간헐적으로 “Oops” 오류 페이지를 반환했습니다. Discourse 로그에도 Markdown 변환 중 Pitchfork 워커 타임아웃 경고가 표시되었습니다.
  4. 자원 고갈 가능성: 검색 엔진과 AI 크롤러가 .md 엔드포인트를 자주 요청하므로, 깊게 중첩된 게시물이 반복적으로 비용이 높은 처리를 트리거하여 서버 자원을 소모할 수 있습니다.

문제가 된 게시물을 제거한 후, Markdown 엔드포인트는 HTTP 200을 반환했으며 약 1.7초 만에 응답했습니다.

영향을 받은 주제는 다음과 같습니다:

https://meta.appinn.net/t/topic/87672

(문제가 된 답변은 이미 제거되었습니다.)

제안된 개선 사항

다음 중 하나를 적용하는 것이 유용할 것이라고 생각합니다:

  • [details] 중첩을 2~3단계와 같은 합리적인 깊이로 제한합니다.
  • details_max_nesting_depth와 같은 사이트 설정을 추가하여 관리자가 최대 중첩 깊이를 구성할 수 있도록 합니다.

하위 호환성을 위해 기본값은 무제한으로 유지하되, 필요할 때 관리자가 한도를 강제할 수 있도록 하는 것이 좋습니다.

사용자가 설정된 한도를 초과할 경우, Discourse는 명확한 검증 메시지와 함께 게시물을 거부할 수 있습니다.

임시 해결책: 플러그인

[details] 중첩을 최대 2단계로 제한하는 작은 플러그인을 만들었습니다:

GitHub - scavin/discourse-details-depth-limit · GitHub

이 플러그인은 서버 측에서 게시물을 검증하며, 2단계 이상의 중첩된 접이식 섹션을 포함하는 게시물을 거부합니다.

로컬 Discourse 개발 환경에서 성공적으로 테스트했습니다.

비슷한 문제를 겪고 있는 관리자를 위해, 공식 솔루션이 제공될 때까지 이 플러그인은 임시 해결책으로 사용될 수 있습니다.

내장된 Details 플러그인에 구성 가능한 한도가 포함된다면, 우발적이거나 과도한 중첩에 대한 유용한 안전장치로 작용할 것이라고 생각합니다.

2개의 좋아요