안녕하세요,
이것은 상당히 구체적인 버그이지만, 그 영향은 이 특정 사례를 훨씬 넘어설 수 있을 것 같아 관련해서 질문이 있습니다.
(또한, 제 영어가 어색한 점 양해 부탁드립니다. 저는 프랑스인이라 영어를 모국어로 사용하지 않습니다…)
하지만 먼저, 맥락을 설명드리겠습니다.
저는 라즈베리 파이(Raspberry Pi)에 관한 프랑스어 포럼(forum.raspberry-pi.fr)을 위해 꽤 오랫동안 Discourse를 사용해 왔습니다. 이 포럼은 광고 관리(Themoneytizer)를 사용합니다. 아마 아시다시피, 유럽에서는 사용자 개인정보 보호를 위해 RGPD(일반 데이터 보호 규정)를 이행하도록 의무화하고 있습니다. RGPD 동의 관리의 주요 플레이어(최소 프랑스에서는)는 Quantcast와 그들의 “Choice” 솔루션입니다.
그래서 저는 꽤 오랫동안 Quantcast 솔루션을 사용해 왔는데, 최근에 “모두 허용” 버튼이 더 이상 제대로 작동하지 않는 것을 발견했습니다. 클릭해도 아무 반응이 없으며, 개발자 콘솔을 확인해 보니 "Uncaught TypeError: can’t define property “status”: Function is not extensible"라는 오류가 발생했습니다.
무슨 일이 일어나고 있는지(적어도 제 이해 범위 내에서):
이 문제의 원인을 찾는 데 정말로 아주 오랜 시간이 걸렸다는 점을 믿어 주십시오. apparently Ember.js(저는 이 기술에 매우 익숙하지 않습니다)는 Array, String, Function과 같은 자바스크립트 네이티브 객체를 확장합니다. 그리고 어떤 이유에서인지, Ember.js는 이러한 객체의 확장을 어떤 방식으로든 방지하는 것처럼 보입니다(이 부분은 아직 완전히 이해하지 못했습니다).
Quantcast의 솔루션은 그 자체로, 아마도 FunctionAcceptAll 함수에서(이것이 버그가 ‘모두 허용’ 버튼과 ‘모두 거부’ 버튼을 클릭할 때만 발생하는 이유를 설명합니다), Ember.js에 의해 정상 동작이 수정된 객체(아마도 배열)를 확장하려고 시도하는 것 같습니다.
이 버그를 이해하기 위해 많은 연구를 한 끝에, Ember.js의 동작을 수정하여 자바스크립트 프로토타입 확장을 비활성화할 수 있다는 것도 발견했습니다. 자세한 내용은 이 페이지 https://guides.emberjs.com/release/configuring-ember/disabling-prototype-extensions/ 에서 설명되어 있습니다.
몇 가지 테스트를 해 보았는데, window.EmberENV.FORCE_JQUERY = true; 줄 뒤에 window.EmberENV.EXTEND_PROTOTYPES = {String: true, Array: false}; 줄을 _ember_jquery-189e46ebcb33594b835e782fd1ce916ec750bc0cf980ebc4fb7796649161a18d.js 파일에 추가하면 버그가 사라지는 것을 확인했습니다.
시도해 보고자 하시는 분들을 위해, 포럼의 /tst/index.html 페이지를 확인해 보실 수 있습니다(스크립트가 시작되려면 유럽 IP가 필요할 수 있으며, 정확히는 알 수 없습니다).
이제 제가 드릴 수 있는 모든 정보를 드린 것 같습니다.
자, 이제 제 질문입니다.
이것이 상당히 구체적인 버그이긴 하지만, 현재 유럽에서는 RGPD가 점점 더 중요해지고 있으며, 이 추세는 더 쉬워지지 않을 것입니다.
Quantcast는 RGPD를 구현하는 데 수백 달러를 지불할 여유가 없는 플레이어들에게는 상당한 독점적 지위에 있습니다. 이 버그는 Quantcast의 사용을, 그리고 유럽에서 Discourse의 광고 사용을 완전히 불가능하게 만듭니다. 이것은 저에게 큰 문제로 보입니다.
또한, 제가 Quantcast를 통해만 버그를 발견했지만, 광고나 기타 목적으로 임베드해야 하지만 우리가 전혀 제어할 수 없으며, Array, String, Function 객체의 자바스크립트 “정상” 동작에 의존하는 많은 서드파티 스크립트에서 이러한 유형의 버그가 실제로 발생할 수 있습니다.
저는 Discourse 코드를 충분히 알지 못하므로 질문드립니다. Ember.js가 Array, String, Function 객체에 추가하는 속성들(앞서 링크한 페이지 참고)이 Discourse에서 사용되고 있지 않나요? 만약 그렇지 않다면, 이러한 부작용을 방지하기 위해 Ember.js의 프로토타입 확장을 비활성화하는 것을 고려해야 하지 않을까요?
누군가 이 문제에 대해 정보를 주실 수 있기를 바랍니다.
감사합니다