🔐로그인하면 문서 작성, 프로젝트 게시, ZIP 기반 버전 업로드, 브랜치 생성 기능을 사용할 수 있습니다. 로그인하러 가기

T2Editor 9.1.2-alpha1.0.2 CHATGPT 감사 보고서

T2Editor 9.1.2-alpha1.0.2 CHATGPT 감사 보고서

Answer Summary

T2Editor 9.1.2-alpha1.0.2 CHATGPT 감사 보고서

소유자 👤 Tak2
브랜치 ⎇ main
리비전 r2
작성자 Tak2
수정 3일 전
요약 내용 수정
core.js모바일file감사collabalpha1.0.2보안대비

T2Editor 9.1.2-alpha1.0.2 감사 보고서 (비교군: 9.1.1)

목차
  1. T2Editor 9.1.2-alpha1.0.2 감사 보고서 (비교군: 9.1.1)
  2. 1.판정
  3. 2. 감사 대상 및 방법
  4. 2.1 이번 감사에서 특별히 본 항목
  5. 3. 9.1.1 대비 보안 해결 수준
  6. 3.1 고위험 8건 기준 해결률 판정
  7. 3.2 실질 해결로 볼 수 있는 항목
  8. 1) hidden textarea raw 출력 문제 해결
  9. 2) 업로드 엔드포인트의 extension-only 신뢰 문제 해결
  10. 3) PDF 뷰어 부트스트랩/경로 문제 해결
  11. 4) uid가 거의 raw로 받아들여지고 저장 이름에 결합되던 문제 해소
  12. 3.3 상당 부분 완화되었으나 완결은 아닌 항목
  13. 1) paste 처리와 sanitize 경계
  14. 2) hostile HTML sanitizer의 얕음
  15. 3.4 미해결로 남은 항목
  16. 1) collab JSON 파일 권한 및 접근모델
  17. 2) 협업 delete 엔드포인트의 파일 규약 불일치
  18. 4. 보안 문제 해결이 실제로 얼마나 되었는가
  19. 5. 유저 불편함(사용성) 개선 수준
  20. 5.1 업로드 실패·오탐·환경차 문제 감소
  21. 5.2 자동복원과 재편집 안정성 개선
  22. 5.3 브라우저 예외와 선택 영역 오류 감소
  23. 5.4 불편이 아직 남은 부분
  24. 6. 디자인이 더 세련되었는가
  25. 6.1 컬러 피커 UI는 사실상 재설계 수준이다
  26. 6.2 세련도 관점 평가
  27. 7. 모바일 친화성은 얼마나 개선되었는가
  28. 7.1 모바일에서 직접 좋아진 점
  29. 컬러 피커
  30. PDF 뷰어
  31. 이미지/드로잉/기타 플러그인
  32. 7.2 모바일 친화성의 실질 평가
  33. 8. 코드 완성도 평가
  34. 8.1 9.1.1 대비 크게 나아진 점
  35. 8.2 여전히 아쉬운 점
  36. 9. 기관·전문업체 기준 비교 판정
  37. 9.1 국가기관·공공 대민서비스 기준
  38. 9.2 전문기관·내부 행정망·연구기관 기준
  39. 9.3 상용 사설 유명 업체급 기준
  40. 10. 최종 결론
  41. 11. 최종 승인 조건
  42. 12. 한 줄 요약

#감사 #보안 #품질검증 #T2Editor

문서 성격

본 문서는 T2Editor 9.1.2-alpha1.0.2를 기준으로 9.1.1 대비 보안 문제 해결 수준, 코드 완성도, 사용성, 디자인 완성도, 모바일 친화성을 종합 평가한 감사 문서이다. 본 문서는 내부 의사결정용 기술감사 문서이며, 배포 승인 판단과 추가 하드닝 우선순위 수립을 목적으로 한다.

1.판정

주의

최종 판정은 조건부 승인 전 단계이다. 9.1.1과 비교하면 제품은 실질적으로 다른 수준까지 올라왔다. 그러나 공개 인터넷을 대상으로 한 무제한 개방형 서비스, 특히 국가기관 대민서비스급 또는 대형 상용 SaaS급 최종판으로 보기는 아직 이르다. 최종 승인 저지선은 여전히 협업(collab) 백엔드저장된 HTML을 신뢰하는 코어 구조이다.

본 감사의 결론은 다음과 같다.

  • 보안 해결 수준은 9.1.1 대비 뚜렷하게 상승하였다.
  • 사용성은 9.1.1 대비 체감 개선이 분명하다.
  • 디자인 세련도와 인터랙션 품질 역시 향상되었다.
  • 모바일 친화성은 과거보다 확실히 좋아졌고, 일부 UI는 모바일 우선 관점에서 재설계되었다.
  • 다만 협업 기능을 켠 채 공개 배포하는 것은 여전히 권고하기 어렵다.

2. 감사 대상 및 방법

항목내용
기준 버전9.1.1
감사 버전9.1.2-alpha1.0.2
변경 파일 수20개
변경 규모대략 +3,406행 / -1,505행
감사 방식정적 보안감사, 버전 비교, 엔드포인트 검토, 렌더링 경계 검토, UX/모바일/UI 검토

2.1 이번 감사에서 특별히 본 항목

  • 9.1.1 기준 고위험 이슈가 실제로 얼마나 해소되었는가
  • 업로드, 뷰어, 부트스트랩, 렌더링, 저장/복원 경계가 얼마나 개선되었는가
  • 코드가 단순히 “동작”하는 수준을 넘어 운영 가능한 완성도로 올라왔는가
  • 유저가 실제로 덜 불편해졌는가
  • UI가 더 세련되고 모바일 환경에서 쓰기 쉬워졌는가

3. 9.1.1 대비 보안 해결 수준

3.1 고위험 8건 기준 해결률 판정

과거 기준 데이터셋의 고위험 이슈 8건을 기준으로 재판정하면 다음과 같다.

구분건수판정
실질 해결4건해결 완료로 판단 가능
상당 부분 완화2건직접적 공격면은 크게 줄었으나 구조적 완결은 미흡
미해결2건공개 배포 저지선 유지

3.2 실질 해결로 볼 수 있는 항목

1) hidden textarea raw 출력 문제 해결

9.1.1의 치명점 중 하나는 hidden <textarea> 내부에 콘텐츠 본문을 raw 출력하던 구조였다. 이 문제는 브라우저 파서 레벨에서 </textarea>를 실제 종료 태그로 해석하여 DOM 구조를 깨뜨릴 수 있었고, 저장형 XSS의 경계가 되었다.

9.1.2-alpha1.0.2에서는 다음과 같이 escape가 적용된다.

  • editor.lib.php:534-538
  • 비-dhtml 브랜치도 escape 적용: editor.lib.php:851-854

이 항목은 9.1.1 대비 실질 해결로 판단한다.

2) 업로드 엔드포인트의 extension-only 신뢰 문제 해결

9.1.1의 파일 업로드는 확장자 정책 의존성이 강했다. 9.1.2-alpha1.0.2에서는 공통 검증 로직이 정비되었다.

  • Origin 검증: config/upload_config.php:168-194
  • 파일명 정제: config/upload_config.php:199-210
  • 매직바이트 검증: config/upload_config.php:223-277
  • MIME 및 카테고리 검증: config/upload_config.php:371-443
  • 파일 엔드포인트 적용: plugin/file/file_upload.php:39-42, 104-119

이 항목은 9.1.1 대비 실질 해결로 본다.

3) PDF 뷰어 부트스트랩/경로 문제 해결

9.1.1의 PDF 뷰어는 include 경로와 자산 로딩, 입력 처리 일관성이 약했다. 현재 버전은 경로 검증과 리소스 이스케이프가 정리되었다.

  • 입력 형식 검증 및 크기 제한: plugin/file/pdf_view.php:22-49
  • URL 속성 이스케이프: plugin/file/pdf_view.php:57-60, 86

이 항목은 실질 해결 판정이 가능하다.

4) uid가 거의 raw로 받아들여지고 저장 이름에 결합되던 문제 해소

9.1.1에서 지적되던 문제는 uid가 지나치게 신뢰되고, 일부 로직에서 저장 흐름과 밀접하게 엮여 있었다는 점이다. 현재 버전은 uid를 정제하고, 저장 파일명은 난수 기반으로 별도 생성한다.

  • uid 정제: plugin/file/file_upload.php:57-65
  • 저장 파일명 랜덤화: plugin/file/file_upload.php:121-123

다만 file 업로드와 image 업로드의 uid 정책이 아직 완전히 일관되지는 않다. 그럼에도 9.1.1의 고위험 지적사항 자체는 실질 해결로 판단한다.

3.3 상당 부분 완화되었으나 완결은 아닌 항목

1) paste 처리와 sanitize 경계

9.1.1의 paste 처리와 HTML sanitize는 과도하게 얕았고, 텍스트/HTML 혼합 시 재해석 리스크가 있었다. 현재 버전은 분명히 강화되었다.

  • paste 전 selection 가드: js/core.js:510
  • paste 후 sanitize 결과 사용: js/core.js:543
  • sanitize에서 style 제거: js/core.js:2034-2037
  • href/srcjavascript:·vbscript:·data: 차단: js/core.js:2038-2043, 2058-2064

또한 autosave 복원도 강화되었다.

  • localStorage 복원 시 <script>on* 제거: js/core.js:995-1008

이것은 9.1.1보다 매우 큰 진전이다. 다만 최종적으로는 setContent()_doSetContent()를 거쳐 innerHTML로 들어간다.

  • setContent(): js/core.js:1932-1948
  • _doSetContent(): js/core.js:1954-1956

따라서 이 항목은 상당 부분 완화되었으나, 구조적으로 완전 종결되었다고 보기는 어렵다.

2) hostile HTML sanitizer의 얕음

현재 sanitizer는 9.1.1보다 훨씬 강해졌지만, battle-tested sanitizer 수준은 아니다.

  • 허용 태그 제한: js/core.js:2034
  • 허용 속성 최소화: js/core.js:2035-2036
  • 위험 속성 제거 및 노드 정리: js/core.js:2057-2087

그러나 다음은 여전히 남는다.

  • 저장된 전체 HTML을 시스템이 본질적으로 신뢰하는 경향
  • iframe에 대한 allowlist/sandbox 부재
  • AI 재배열 플러그인의 direct DOM rewrite 관성

따라서 이 항목도 상당 부분 완화로 판정한다.

3.4 미해결로 남은 항목

1) collab JSON 파일 권한 및 접근모델

협업 백엔드는 여전히 최종 승인 저지선이다.

  • 파일 권한 0666: plugin/collab/collab_number.php:59, 71
  • 디렉터리 707 요구: plugin/collab/collab_verification.php:34, 64
  • 삭제 엔드포인트 CORS *: plugin/collab/collab_number_delete.php:17-19
  • room existence 확인: plugin/collab/collab_number.php:290-297
  • code만 알면 get/join 가능: plugin/collab/collab_number.php:299-343, 345-443

이 항목은 9.1.1 대비 본질적으로 미해결이다.

2) 협업 delete 엔드포인트의 파일 규약 불일치

운영 경로는 client_ops를 사용하지만, delete 엔드포인트는 여전히 ops/ops_lock 삭제 흐름을 갖는다.

  • client_ops 사용: plugin/collab/collab_number.php:174, 250, 400, 583, 757
  • delete 규약: plugin/collab/collab_number_delete.php:57-66, 101-126

이는 직접적인 원격 코드 실행급 취약점은 아니지만, 협업 기능의 설계 완결성 자체가 아직 낮다는 의미다. 이 역시 미해결이다.

4. 보안 문제 해결이 실제로 얼마나 되었는가

가장 보수적으로 평가하면 다음과 같다.

  • 9.1.1 기준 고위험 항목의 약 50%는 해결, 25%는 의미 있게 완화, 25%는 핵심적으로 남아 있음
  • 반대로 운영자 체감 관점에서는, 9.1.1이 갖고 있던 “즉시 사고로 이어질 수 있는 노골적 경계”는 상당수 줄었다고 평가 가능

즉, 한 문장으로 요약하면 다음과 같다.

요약

9.1.2-alpha1.0.2는 9.1.1의 보안 문제를 “부분적으로 손본 버전”이 아니라, 주요 프런트/업로드/부트스트랩 리스크를 실제로 상당 부분 해결한 버전이다. 다만 협업 계층 때문에 최종적인 공개 배포 승인선은 아직 넘지 못했다.

5. 유저 불편함(사용성) 개선 수준

9.1.2-alpha1.0.2는 9.1.1 대비 사용자 불편을 분명히 줄였다. 이 변화는 단순한 느낌이 아니라 코드와 UI 흐름에 직접 반영되어 있다.

5.1 업로드 실패·오탐·환경차 문제 감소

9.1.1은 업로드가 “왜 실패했는지”가 불명확하고, 브라우저/OS별 MIME 차이에 취약했다. 현재 버전은 다음 점에서 사용자 불편을 줄인다.

  • Origin 오작동 방지: plugin/file/file_upload.php:39-42, plugin/image/image_upload.php:38-40
  • 파일명 정제 후 일관 응답: plugin/file/file_upload.php:100-101
  • iOS 촬영 비디오 MIME 대응 확대: plugin/file/file_upload.php:111-112
  • 실제 이미지 여부 검증과 구체적 실패 사유 분리: plugin/image/image_upload.php:157-175, 243-249

즉, “올려도 왜 안 되는지 모르는 상태”가 줄었다.

5.2 자동복원과 재편집 안정성 개선

9.1.1의 사용성 문제는 단순히 버튼 불편이 아니라, 저장 후 다시 수정할 때 구조가 깨지는 일이 잦았다는 데 있었다. 현재 버전은 이 부분이 좋아졌다.

  • autosave 복원 시 오염 제거: js/core.js:995-1008
  • essential plugin 대기 후 content initialization: js/core.js:1957-1975
  • 코드 블록/파일 블록 복구 로직 보강: editor.lib.php:765-826, plugin/file/file.js:737-804
  • 비디오 블록 재편집 시 data-* 소실 복원: plugin/video/video.js:824-871, editor.lib.php:906-926
  • 에디터 전용 컨트롤 제거 후 저장: editor.lib.php:929-934

이 항목은 실제 사용성에 큰 영향을 미친다. “저장 후 다시 열면 깨지는가”는 에디터의 신뢰도와 직결되기 때문이다.

5.3 브라우저 예외와 선택 영역 오류 감소

  • saveSelection() 가드: js/core.js:906-911
  • rangeCount 없는 상태 방어: js/core.js:883-885
  • TreeWalker fallback 버그 수정이 누적 반영됨
  • iOS Safari 코드 블록 입력 대응 누적 반영: plugin/code/code.js:288-372
  • iOS/Safari addRange 보호: plugin/file/file.js:512-514

이는 9.1.1 대비 사용 중 “갑자기 안 된다”, “커서가 날아간다”, “붙여넣기 후 이상해진다”는 유형의 불편을 줄인다.

5.4 불편이 아직 남은 부분

  • file 업로드와 image 업로드의 uid 정책이 완전히 동일하지 않다.
  • 협업 기능은 UX보다 보안/운영 경계가 먼저 해결되어야 한다.
  • 저장된 HTML을 신뢰하는 구조 때문에, 상위 CMS가 오염된 저장물을 넣으면 UX 문제와 보안 문제가 동시에 되살아날 수 있다.

결론적으로, 9.1.1 대비 사용성은 분명히 좋아졌고, 특히 “실패 빈도”와 “재편집 파손”이 줄었다고 평가한다.

6. 디자인이 더 세련되었는가

디자인 완성도는 “큰 리브랜딩” 수준은 아니지만, 분명히 세련되었다. 특히 9.1.2-alpha1.0.2에서 바로 확인되는 개선은 컬러 피커 재설계이다.

6.1 컬러 피커 UI는 사실상 재설계 수준이다

과거 컬러 피커는 툴바/에디터 컨테이너 기준의 절대 배치와 인라인 스타일 의존이 강했다. 현재 버전은 다음처럼 바뀌었다.

  • viewport-safe position: fixed 배치: js/core.js:1154-1179
  • 화면 밖으로 나가지 않도록 좌우 clamp: js/core.js:1168-1170
  • 아래 공간이 부족할 때 위로 flip: js/core.js:1172-1173
  • DOM 구조를 CSS 클래스 중심으로 재편: js/core.js:1175-1265
  • Core CSS에 전용 컴포넌트 스타일 도입: css/core.css:28-177
  • Dark mode 대응 정리: css/dark.css:52-73

이 변화는 단순 “예뻐졌다” 수준을 넘는다. 클리핑 방지, 시인성, 테마 일관성, 터치 친화성이 모두 개선되었다.

6.2 세련도 관점 평가

구체적으로 좋아진 점은 다음과 같다.

  • 인라인 스타일 덩어리보다 컴포넌트 클래스 기반으로 정리되어 일관성이 좋아졌다.
  • 색상 선택 UI가 더 현대적이고 목적 지향적인 구조가 되었다.
  • 다크모드에서 별도 대응이 더 자연스럽다.
  • 버튼, 핸들, 스와치, hex input, 적용 버튼이 하나의 시스템으로 묶였다.

즉, 9.1.1 대비 분명 더 세련되고 덜 임시방편처럼 보인다고 평가할 수 있다.

7. 모바일 친화성은 얼마나 개선되었는가

이 항목은 9.1.2-alpha1.0.2에서 강점으로 평가할 수 있다.

7.1 모바일에서 직접 좋아진 점

컬러 피커

  • 모바일에서도 body 기준 fixed 배치: js/core.js:1154-1179
  • touch-action: none 적용: css/core.css:70-77, 90-107
  • 모바일 전용 크기 조정: css/core.css:169-177
  • 버튼 최소 높이 44px 확보: css/core.css:177

이는 모바일 터치 UI의 기본 원칙에 부합한다.

PDF 뷰어

  • safe-area inset 고려: plugin/file/pdf_view.php:60 내 CSS
  • 모바일 폭 축소 시 툴바/버튼 조정: plugin/file/pdf_view.php:60@media (max-width:428px)
  • floating theme button 도입 및 모바일 화면 고려

이미지/드로잉/기타 플러그인

  • plugin/image/image.css는 다수의 모바일 미디어쿼리, coarse pointer, reduce motion, high contrast 대응을 가진다.
  • plugin/draw/draw.css, plugin/draw/draw.js는 모바일 툴바 구조를 별도로 가진다.
  • plugin/code/code.js는 iOS Safari beforeinput 경로를 상세하게 대응한다.

7.2 모바일 친화성의 실질 평가

9.1.1은 모바일에서 “보이기는 하지만 자연스럽지 않은” 부분이 많았다. 현재 버전은 다음 단계로 올라갔다.

  • 보이는 수준 → 쓰는 수준
  • 터치 가능 수준 → 덜 답답한 수준
  • 모바일 호환 수준 → 모바일 최적화 요소를 갖춘 수준

특히 컬러 피커와 PDF 툴바, iOS 입력 예외 대응은 모바일 친화성의 체감 품질을 직접 높인다.

다만 한계도 있다.

  • core.js가 여전히 거대 단일 파일이라 모바일 관련 회귀 가능성이 있다.
  • 협업 기능은 모바일 친화성보다 보안 구조가 더 시급하다.
  • 일부 플러그인 UI는 여전히 데스크톱 우선 흔적이 남는다.

8. 코드 완성도 평가

8.1 9.1.1 대비 크게 나아진 점

  • 공통 업로드 검증 로직이 집중화되었다.
  • 부트스트랩과 직렬화 컨텍스트 이스케이프가 훨씬 명확해졌다.
  • 특정 문제를 임시 우회가 아니라 경계 정리 방식으로 수정한 흔적이 많다.
  • 비디오 블록 재편집, 파일 블록 복원, 코드 블록 재복구처럼 “운영 중 실제 터지는 문제”에 대한 대응력이 높아졌다.

8.2 여전히 아쉬운 점

  • js/core.js는 여전히 2천 줄이 넘는 거대 파일이다.
  • editor.lib.php도 책임이 과도하게 집중되어 있다.
  • AI 관련 플러그인(plugin/ai_rearrange/ai_rearrange.js)은 direct DOM write 성향이 남아 있다.
  • 협업 기능은 코드 완성도보다 아키텍처 재설계가 더 필요한 상태다.

결론적으로, 코드 완성도는 9.1.1보다 확실히 상승했지만, 아키텍처 성숙도까지 최종판 수준으로 올라온 것은 아니다.

9. 기관·전문업체 기준 비교 판정

9.1 국가기관·공공 대민서비스 기준

아직 불합격이다.

사유는 다음과 같다.

  • collab 접근통제 모델이 약하다.
  • 파일 권한과 CORS 최소화 원칙이 지켜지지 않는다.
  • 저장된 HTML을 신뢰하는 전제가 남아 있다.
  • iframe 정책이 기술적 정화 수준이지 운영 정책 수준은 아니다.

9.2 전문기관·내부 행정망·연구기관 기준

조건부 적합이다.

전제는 다음과 같다.

  • 협업 기능 비활성화 또는 내부망 한정
  • 관리자/신뢰 사용자 중심 운영
  • 상위 시스템에서 저장물 정제 또는 입력 제한
  • 외부 폰트 의존 환경 검증

9.3 상용 사설 유명 업체급 기준

부분 적합이나, self-service 대규모 공개형 기준으로는 아직 미달이다.

이유는 다음과 같다.

  • 업로드·미디어·기본 XSS 방어는 많이 좋아졌다.
  • 그러나 대형 상용 서비스가 요구하는 협업 권한모델, 임베드 정책, 저장물 신뢰 경계, 감사 로그 수준까지는 아직 가지 못했다.

10. 최종 결론

최종 결론

9.1.2-alpha1.0.2는 9.1.1 대비 보안 문제를 상당 부분 해결했고, 유저 불편을 확실히 줄였으며, 디자인과 모바일 친화성도 눈에 띄게 향상된 버전이다. 특히 업로드, 부트스트랩, 직렬화, 자동복원, 파일/비디오 블록 재편집, 모바일 컬러 피커는 9.1.1과 비교하면 질적으로 다른 수준이다. 다만 협업 백엔드와 저장 HTML 신뢰 구조가 여전히 남아 있어, 이를 해결하기 전까지는 “공개 인터넷 대상 최종 승인판”으로 보기는 어렵다.

11. 최종 승인 조건

승인 전 필수 과제
  1. collab CORS * 제거 및 초대/세션 기반 권한 모델 도입
  2. collab 파일 권한 0666 / 707 모델 재설계
  3. client_ops / delete 엔드포인트 규약 일치화
  4. setContent() 신뢰 경계 재설계 또는 상위 저장물 정제 강제
  5. iframe allowlist + sandbox 정책 도입

12. 한 줄 요약

최종 요약

9.1.2-alpha1.0.2는 9.1.1보다 확실히 안전하고, 덜 깨지며, 더 세련되고, 모바일에서도 훨씬 쓸 만하다. 그러나 최종 승인선을 막는 마지막 벽은 아직 협업 백엔드와 저장 HTML 신뢰 구조다.

이 문서가 링크하는 문서 · 0
아직 내부 링크가 없습니다. 본문에 [[다른-문서]]를 넣으면 연결이 생깁니다.
백링크 · 0
아직 이 문서를 가리키는 다른 문서가 없습니다.
관련 문서
직접 연결된 관련 문서가 아직 없습니다.
문서 연결 지도

이 문서를 중심으로 들어오는 링크와 나가는 링크를 한 번에 볼 수 있습니다.

전체 보기
현재 문서 백링크 나가는 링크 양방향 연결
이 브랜치의 리비전
T2WIKI · 기술 통합 위키 & 프로젝트 허브 · 나무위키 + Markdown 완벽 지원 · SQLite · PHP 8.2 · 소개 · 문법 안내