T2Editor 9.1.2 → 9.1.3-alpha1.1.0 업데이트 감사서
#소프트웨어 감사 #버전 비교 #패치 리뷰 #T2Editor
요약
9.1.2에서 9.1.3-alpha1.1.0으로의 변경은 단순 소규모 패치가 아니라 보안 경계 강화, 미디어 블록 저장/복구 안정화, AI/ClipURL/Meme UI 확장, 플러그인 DOM 쓰기 제어 기반 도입이 결합된 중대 업데이트입니다. 파일 수는 69개로 동일하며 신규/삭제 파일은 없지만, 실제 변경 파일은 21개입니다. git diff --numstat 기준 9,778 additions / 2,899 deletions, 총 12,677 line-ops가 발생했습니다. 사용성 개선은 명확히 있습니다. 특히 블록 주변 커서 착지, 자동 저장 복구, 비디오 저장 후 재편집, AI 재정렬 검토, ClipURL 패널, Meme 삽입 흐름에서 개선 효과를 기대할 수 있습니다. 다만 T2_NSFW_ALLOW_SUSPICIOUS 기본값 변경, 직접 업로드 비디오 iframe sandbox 제거, 외부 Meme API 의존성, 남아 있는 직접 innerHTML 쓰기 등은 배포 전 검토가 필요합니다.
수정 요약
| 항목 | 내용 |
|---|
| 비교 대상 | 9.1.2.zip → 9.1.3-alpha1.1.0.zip |
| 기준 버전 | 9.1.2 |
| 대상 버전 | 9.1.3-alpha1.1.0 ZIP 폴더명 기준. 단, readme.txt 내부 표기는 ver_9.1.3, date_2026.04.27 |
| 감사 범위 | ZIP 내부 t2editor/ 전체 파일 구조, 변경 파일, diff 통계, 주요 PHP/JS/CSS 변경 의미, 사용성·보안·호환성 영향 |
| 검증 범위 | 파일 구조 비교, diff/numstat/stat, PHP syntax lint, JS syntax check, CSS UTF-8/brace balance, 변경 파일 의미 검토 |
| 미검증 범위 | 실제 브라우저 런타임, 서버 업로드 API, 외부 Meme API 응답, DB 저장/재편집, iOS/Safari 실기기, 시각 스크린샷, 성능 벤치마크 |
Assumptions / Constraints / Success criteria
| 항목 | 내용 |
|---|
| Assumptions | 사용자가 말한 91.2는 업로드 파일명 기준 9.1.2로 해석했다. |
| Constraints | 실제 서버, DB, 브라우저 세션, API 키, CMS 필터 환경은 제공되지 않았다. 따라서 정적 감사와 syntax 검증 중심이다. |
| Success criteria | 무엇이 어디서 얼마나 바뀌었는지, 패치의 중심 전략이 무엇인지, 사용성 개선 지점과 기대 효과, 배포 전 리스크를 구체적으로 식별한다. |
Audit rubric
| 평가 축 | 확인 항목 | 판정 기준 |
|---|
| 변경 범위 | 파일/모듈/API/UX surface | 변경 파일 수, line-op, 영향 모듈로 판단 |
| 패치 전략 | bug fix/refactor/UI/UX/security/compatibility | 코드 주석, 구조 변경, diff 분포, 함수 추가 기준 |
| 사용성 | task success/time/error/cognitive load | 사용자 작업 흐름의 실패 가능성·단계 수·복구 가능성 기준 |
| 품질 | functional suitability, reliability, maintainability, compatibility | ISO/IEC 25010형 제품 품질 관점으로 평가 |
| 운영/릴리즈 | release reproducibility, rollback, config traceability | alpha 명명, 설정 변경, API 의존성, 롤백 영향 기준 |
| 보안/공급망 | XSS, iframe, URL, dependency, external API | NIST SSDF식 보안 개발 관점으로 평가 |
Executive finding
| 구분 | 판정 |
|---|
| 업데이트 성격 | 대형 alpha 패치. 단순 bugfix가 아니라 보안·호환성·UX·플러그인 구조 개편이 혼재됨. |
| 변경 강도 | 높음. 21개 파일 변경, 12,677 line-ops. |
| 사용자 체감 개선 | 있음. 비디오/이미지/드로잉/테이블/AI/ClipURL/Meme 흐름에서 체감 가능. |
| 안정성 신뢰도 | 정적 검증 기준 중상. 실제 런타임 검증 전 production 배포는 보류 권장. |
| 핵심 리스크 | NSFW 정책 완화, same-origin video iframe sandbox 제거, 외부 Meme API 의존, 일부 DOM write 경계 미완성. |
| 배포 권고 | alpha 또는 제한 배포/canary 적합. 일반 사용자 전체 배포 전 smoke test 필요. |
Change inventory
전체 변경량
| 항목 | 9.1.2 | 9.1.3-alpha1.1.0 | 변화 |
|---|
| ZIP 크기 | 약 6.11 MB | 약 6.16 MB | +50.7 KB 수준 |
t2editor/ 파일 수 | 69 | 69 | 신규/삭제 없음 |
| 변경 파일 수 | - | 21 | 전체 69개 중 약 30.4% |
| 동일 파일 수 | - | 48 | 구조 유지 |
| 전체 텍스트 LOC | 50,705 | 57,590 | +6,885 LOC, 약 +13.6% |
| diff numstat | - | 9,778 additions / 2,899 deletions | 총 12,677 line-ops |
변경 파일별 계량
| 파일 | 9.1.2 LOC | 9.1.3 LOC | LOC 증감 | diff additions | diff deletions | 판단 |
|---|
config/t2_config.php | 198 | 254 | +56 | 56 | 0 | iframe 허용 도메인 설정 중앙화 |
css/core.css | 220 | 221 | +1 | 3 | 2 | 모달 overlay padding/overflow/box sizing 보정 |
editor.lib.php | 1,119 | 1,370 | +251 | 319 | 68 | 플러그인 등록, CSS URL escape, iframe 도메인 통합, 저장 복구 |
js/core.js | 2,361 | 2,810 | +449 | 560 | 111 | 블록 경계, autosave JSON, 플러그인 DOM 보안 API |
js/utils.js | 452 | 588 | +136 | 157 | 21 | 비디오 URL parser, sanitizeURL, escapeAttr 추가 |
plugin/ai/ai.js | 1,042 | 1,267 | +225 | 319 | 94 | AI 출력/링크/이미지/테이블 렌더 보안 강화 |
plugin/ai_rearrange/ai_rearrange.css | 277 | 1,760 | +1,483 | 1,670 | 188 | AI 재정렬 UI 대개편 |
plugin/ai_rearrange/ai_rearrange.js | 2,016 | 2,805 | +789 | 1,378 | 589 | 부분 편집, split diff review, 모바일/보안 강화 |
plugin/clipurl/clipurl.css | 270 | 1,035 | +765 | 934 | 170 | ClipURL 패널 UI 대개편 |
plugin/clipurl/clipurl.js | 582 | 726 | +144 | 474 | 330 | URL 선택/검증/결과 패널 구조 변경 |
plugin/draw/draw.js | 756 | 983 | +227 | 494 | 267 | 드로잉 블록 지속성, undo/redo, 모바일 툴바 보강 |
plugin/export/export.js | 580 | 855 | +275 | 459 | 185 | export sanitize, template, media/table/code 정규화 |
plugin/file/file.js | 1,022 | 1,045 | +23 | 41 | 18 | 파일 블록 보안 경계 일부 적용 |
plugin/image/image.css | 1,295 | 1,330 | +35 | 35 | 1 | 이미지/NSFW/SafeAI UI 보강 |
plugin/image/image.js | 2,125 | 2,415 | +290 | 443 | 153 | 업로드 검증, retry, sanitize, block 복구 강화 |
plugin/meme/meme.css | 538 | 1,271 | +733 | 973 | 241 | Meme UI 전면 보강 |
plugin/meme/meme.js | 325 | 375 | +50 | 64 | 14 | Meme 삽입 selection 복원 등 개선 |
plugin/table/table.js | 878 | 1,141 | +263 | 420 | 157 | 테이블 sanitize, paste normalization, cell editing 강화 |
plugin/video/video.css | 38 | 157 | +119 | 126 | 8 | 비디오 모달 반응형/dark mode 보강 |
plugin/video/video.js | 1,082 | 1,653 | +571 | 851 | 280 | 비디오 URL/iframe/저장 복구/해상도/업로드 안정화 |
readme.txt | 72 | 72 | 0 | 2 | 2 | 버전/date 표기 변경 |
Patch strategy analysis
1. 보안 강화 중심 패치
주요 보안 패치가 core.js, utils.js, video.js, image.js, ai.js, table.js, export.js에 분산되어 있다.
확인된 보안성 개선:
- 플러그인 이름을
^[a-zA-Z0-9_-]+$로 제한하여 경로 탈출·임의 스크립트 로드 가능성을 줄임. T2Utils.sanitizeURL() 추가로 href, src, iframe-src 컨텍스트별 위험 URL을 분리 차단.T2Utils.escapeAttr() 추가로 속성 컨텍스트 이스케이프를 명확히 분리.core.js에 sanitizePluginHTML() / setPluginHTML() 중앙 API를 추가하여 플러그인의 직접 innerHTML 쓰기를 통제할 기반을 마련.- iframe allowlist를
t2_config.php로 분리하여 설정 추적성과 유지보수성을 높임. - YouTube ID와 비디오 URL을 2차 검증하여 URL injection 가능성을 줄임.
- export HTML 생성 시 script/event/srcdoc/위험 URL/style 정리를 강화.
판정: 보안 hardening 성격이 강하다. 단, 모든 플러그인이 중앙 DOM 쓰기 API로 완전히 이전된 것은 아니므로 완성형 hardening이 아니라 기반 구축 + 부분 적용 상태다.
2. 저장/복구 안정성 패치
가장 중요한 기능 안정성 패치는 미디어 블록 저장 후 재편집 복구에 집중되어 있다.
주요 변경:
- 비디오 블록에
data-t2-block, data-video-type, data-video-url, data-video-id를 wrapper/container에 중복 기록. .t2-video-source[href] fallback anchor를 숨겨 저장하여 iframe/data-*가 제거된 경우에도 URL 복구 가능.- 드로잉 블록도
.t2-drawing-source[href]와 data-drawing-url을 사용하여 동일한 persistence 전략 적용. editor.lib.php 저장 전처리에서 video/drawing block의 data/fallback anchor를 재기록.:has() selector 의존성을 제거하고 순회 기반으로 변경하여 구형 브라우저 호환성 개선.- autosave 저장 포맷을 raw HTML에서
{ content, savedAt } JSON으로 변경하고, 48시간 초과 autosave는 사용자 확인 후 복원.
판정: CMS sanitizer 또는 Gnuboard 계열 저장 필터에 의해 iframe/data/class가 손실되는 문제를 정면으로 다룬 패치다. 사용자 관점에서 “저장 후 다시 수정하면 비디오/그림이 깨진다” 유형의 치명적 불편을 줄이는 효과가 가장 크다.
3. UI/UX 개선 중심 패치
가장 큰 UX 작업량은 ai_rearrange, clipurl, meme, video, image에 집중되어 있다.
| 모듈 | UX 개선 방향 | 기대 효과 |
|---|
| AI 재정렬 | prompt hints, 세부 편집, split diff review, mobile layout, rate limit display | AI 적용 전 변경 내용을 비교하고 통제 가능. 잘못 적용할 위험 감소. |
| ClipURL | floating panel, URL 입력, short link/QR/both 결과 카드, dark mode, mobile 대응 | URL 도구 사용 흐름이 기능별로 명확해짐. |
| Meme | 검색, lazy loading, infinite scroll, keyboard tile, selection restore | 밈 삽입이 별도 이미지 업로드보다 빠르고 명확해짐. |
| Video | URL parser 개선, 업로드 파일 해상도 감지, 저장 후 복구, 직접 업로드 iframe 호환 | 비디오 삽입 성공률과 재편집 안정성 향상. |
| Image | upload retry/backoff, NSFW/SafeAI UI, block sanitize, resize observer | 이미지 업로드 실패·재시도·안내 흐름 개선. |
| Table | paste normalization, cell editing, resizing, CSV export 경로 보강 | 외부 표 붙여넣기와 편집 안정성 향상. |
판정: 사용자 이용성 개선은 분명히 있음. 단, 실제 “몇 초 단축” 같은 정량 UX 수치는 telemetry나 사용성 테스트가 없어 산정 불가다. 정적 분석상으로는 실패율·복구 실패·인지 부하를 낮추는 구조 개선이다.
4. 기능 추가 / 활성화
meme 플러그인은 기존 파일이 있었지만 9.1.2의 $T2EDITOR_PLUGINS에 등록되지 않았고, 9.1.3에서 등록 및 툴바 버튼이 추가되었다.
확인 사항:
editor.lib.php 플러그인 목록에 'meme' 추가.- 툴바에
data-command="insertMeme" 버튼 추가. plugin/meme/meme.js는 https://dsclub.kr/api/meme/index.php를 호출.- 검색, 무한 스크롤, lazy image loading, keyboard insertion, selection restore 지원.
판정: 신규 기능 활성화에 해당한다. 기존 코드가 있었더라도 사용자-facing 기능으로는 9.1.3에서 노출된다.
Usability impact analysis
사용성 개선 총평
| 항목 | 개선 여부 | 근거 | 기대 효과 |
|---|
| task success | 개선 | 비디오/드로잉/이미지/테이블 블록 저장·복구 경로 강화 | 저장 후 재편집 실패 감소 |
| time on task | 개선 추정 | Meme 검색 삽입, ClipURL 패널, AI prompt hints 추가 | 반복 입력·수동 삽입 시간 감소 |
| error rate | 개선 | URL sanitize, YouTube parser, autosave stale 확인, block boundary line 추가 | 잘못된 URL·깨진 블록·커서 오류 감소 |
| cognitive load | 개선 | AI split diff review, rate limit badge, result card UI | 적용 전 판단 비용 감소 |
| discoverability | 개선 | Meme 툴바 버튼, ClipURL 선택형 UI, AI hint 버튼 | 기능 발견성 증가 |
| feedback clarity | 개선 | upload progress, warning/error modal, autosave confirm, result cards | 상태 이해 용이 |
| accessibility | 부분 개선 | role/button, tabindex, keyboard insert, dark mode 일부 강화 | 키보드 사용성 개선. 단 전체 ARIA 검증은 미수행 |
| mobile responsiveness | 개선 | AI/ClipURL/Meme/Image/Video CSS에 반응형 규칙 증가 | 작은 화면 모달 사용성 개선 |
개선 지점별 상세
| 위치 | 기존 문제 가능성 | 9.1.3 개선 | 개선 규모/기대 |
|---|
core.js block boundary | 미디어/테이블/코드 블록 앞뒤에서 커서 착지 불안정, 빈 줄 중복/소실 가능 | ensureBlockBoundaryLines(), insertBlockWithBoundaryLines() 추가 | 블록 전후 타이핑 실패율 감소. 특히 iOS/Safari에서 효과 기대 |
core.js autosave | 오래된 autosave가 무조건 복원되거나 플러그인 컨트롤이 복구되지 않을 수 있음 | JSON {content,savedAt} 저장, 48h 초과 확인, _doSetContent() 경유 복원 | 의도치 않은 오래된 내용 복원 감소. autosave 후 media block 이벤트 복구 기대 |
utils.js video parser | 정규식 기반 YouTube 파싱은 shorts/live/nocookie/protocol-relative/쿼리 URL에 취약 | URL parser 기반으로 watch/embed/shorts/live/youtu.be/nocookie 지원 | 비디오 삽입 성공 케이스 증가 |
video.js persistence | CMS 저장 필터가 iframe/data-* 제거 시 비디오 손실 가능 | wrapper/container data 중복 + fallback anchor + iframe 재생성 | 저장 후 재편집 안정성 대폭 개선 기대 |
draw.js persistence | drawing class/data 손실 시 복구 실패 가능 | data-drawing-url, fallback anchor, class 보존 전략 | 드로잉 재편집/재초기화 실패 감소 |
ai_rearrange | AI 수정 결과가 불투명하고 적용 전 비교 부담 큼 | split diff review, detail edit mode, prompt hint, mobile layout | 잘못된 AI 변경 적용 위험 감소. 검토 가능성 증가 |
clipurl | URL 단축/QR 생성 결과 흐름이 단순하거나 분산될 수 있음 | 입력 패널, 선택 카드, 결과 카드, dark/mobile UI | 작업 흐름 명확화. short/QR/both 선택 시간 감소 |
meme | 별도 이미지 검색/업로드 필요 | 검색→선택→현재 커서 삽입 | 콘텐츠 삽입 단계 단축. 커서 위치 복원으로 삽입 오류 감소 |
table.js | 외부 HTML 표 paste 시 구조 오염/XSS/편집 불안정 가능 | table sanitize, normalizeExternalTable, paste handling | 표 붙여넣기 성공률과 안전성 개선 |
export.js | export HTML에 editor-only UI/위험 속성 잔류 가능 | sanitizeExportDocument, sanitizeNodeTree, media/table/code normalization | 공유/export 문서 품질과 안전성 향상 |
사용성 개선의 한계
주의
실제 클릭 수, 완료 시간, 오류율은 계측 데이터가 없어 정량 확정할 수 없다. 이 감사서는 코드 변경 구조 기준의 사용성 개선 추정이다. 실제 수치화를 위해서는 최소 smoke scenario와 사용자 플로우별 타임 측정이 필요하다.
Quality impact analysis
| 품질 특성 | 영향 | 판단 |
|---|
| Functional suitability | 증가 | Meme 기능 활성화, 비디오 URL 지원 범위 확대, AI/ClipURL/Table 기능 보강 |
| Reliability | 증가 | autosave stale 처리, block 복구, video/drawing fallback, upload retry 개선 |
| Security | 대체로 증가 | sanitizeURL, escapeAttr, plugin HTML sanitizer, plugin name 검증 추가 |
| Security exception | 주의 | NSFW suspicious 기본 허용, 직접 업로드 video iframe sandbox 제거 |
| Compatibility | 증가 | :has() 제거, Safari/iOS boundary 처리, URL parser 확장, CMS sanitizer 대응 |
| Usability | 증가 | AI diff review, modal UX, dark/mobile CSS, cursor restoration |
| Maintainability | 혼재 | 보안 API 중앙화는 좋으나 CSS/JS LOC가 크게 증가해 유지보수 부담도 증가 |
| Portability | 부분 증가 | 브라우저 호환성은 개선. 단 외부 Meme API 하드코딩은 환경 이식성 저하 |
| Performance efficiency | 혼재 | lazy loading/observer는 긍정적이나 AI/Meme/ClipURL CSS·JS 증가로 초기 로드 부담 가능 |
Security / privacy review
긍정적 보안 변경
- 플러그인 이름 검증으로 script path injection 가능성을 줄였다.
- URL 처리 계층이
href, src, iframe-src로 분리되었다. data: URI는 href에서 차단하고, src에서는 이미지/미디어 사용성을 고려해 허용하는 식으로 컨텍스트 분리했다.- plugin HTML sanitizer 기반이 생겼다.
- export 결과물에 남는 script/event/srcdoc 위험 요소 제거가 강화되었다.
- iframe allowlist가 설정 파일로 이동하여 추적성과 운영 통제가 좋아졌다.
주의할 보안 변경
| 항목 | 내용 | 위험 | 권고 |
|---|
| NSFW suspicious 기본값 | T2_NSFW_ALLOW_SUSPICIOUS가 false에서 true로 변경됨 | 의심 이미지가 경고 후 업로드 허용됨. 서비스 정책이 “차단 우선”이라면 보안/법무 리스크 증가 | 기본값을 정책 기준으로 재확정. 릴리즈 노트에 명시 |
| 직접 업로드 비디오 iframe sandbox 제거 | video_view.php iframe에 sandbox를 제거하는 호환성 패치 존재 | CMS 호환성은 좋아지나 same-origin iframe 격리는 약화됨 | video_view.php의 URL 검증, MIME, CSP, X-Content-Type-Options 검토 |
| 외부 Meme API | https://dsclub.kr/api/meme/index.php 하드코딩 | API 장애, CORS, privacy, 외부 콘텐츠 신뢰성 리스크 | API allowlist, timeout, 실패 UI, privacy 안내 검토 |
남은 직접 innerHTML | 전체 JS/PHP에서 innerHTML = 패턴이 여전히 다수 존재 | 중앙 sanitizer가 완전 적용된 상태는 아님 | P1으로 플러그인별 DOM write migration 완료 |
| Meme URL 처리 | Meme API가 반환한 URL을 lazy img와 temp Image에 직접 사용 | 악성/비정상 URL 방어가 image plugin에 일부 의존 | Meme 단계에서도 T2Utils.sanitizeURL(url,'src') 적용 권장 |
Regression / compatibility / security risk matrix
| 리스크 | 영향 | 가능성 | 근거 | 대응 |
|---|
| NSFW 의심 이미지 허용 정책 변화 | 높음 | 중간 | 기본값 false → true | 제품 정책 기준으로 기본값 재검토 |
| 직접 업로드 비디오 iframe sandbox 제거 | 높음 | 중간 | video_view.php iframe은 sandbox 제거 경로 존재 | video_view.php 서버 검증/CSP 점검 |
| Meme 플러그인 외부 API 장애 | 중간 | 중간 | 외부 dsclub.kr API 하드코딩 | timeout/error UI, fallback, 운영 모니터링 추가 |
| Meme 플러그인 priority 누락 | 낮음~중간 | 중간 | $T2EDITOR_PLUGIN_PRIORITY에 meme 없음. fallback 999로 로드됨 | 명시 priority 추가 권장 |
| central sanitizer 부분 적용 | 중간 | 중간 | setPluginHTML API는 있으나 모든 DOM write 전환은 미완료 | 직접 innerHTML 쓰기 잔여 목록 추적 |
| 대규모 CSS 증가로 UI 충돌 | 중간 | 중간 | AI/ClipURL/Meme CSS 대폭 증가 | visual regression test 필요 |
| Autosave 포맷 변경 | 중간 | 낮음 | raw HTML fallback 존재 | 구버전 autosave 복원 테스트 필요 |
| Video persistence fallback anchor 노출 가능성 | 낮음~중간 | 낮음 | 숨김 anchor가 저장 HTML에 남음 | screen reader/SEO/HTML sanitizer 영향 확인 |
| Alpha 버전명과 readme 표기 불일치 | 낮음 | 높음 | ZIP은 9.1.3-alpha1.1.0, readme는 ver_9.1.3 | 릴리즈 식별자 통일 |
| CSS focus glow/shadow 일부 잔존 | 낮음 | 중간 | video modal 등 box-shadow/focus shadow 존재 | 디자인 시스템 기준이면 정리 필요 |
Verification evidence and confidence
수행한 검증
| 검증 항목 | 결과 |
|---|
| ZIP 압축 해제 | 정상 |
| 파일 구조 비교 | t2editor/ 기준 양쪽 69개 파일, 신규/삭제 없음 |
| 변경 파일 식별 | 21개 파일 변경 |
| diff stat | 21 files changed, 9,778 insertions, 2,899 deletions |
| PHP syntax lint | 대상 PHP 9개 파일 No syntax errors detected |
| JS syntax check | 변경/주요 JS 14개 파일 node --check 통과 |
| CSS UTF-8 확인 | 주요 CSS 파일 iconv UTF-8 통과 |
| CSS brace balance | 주요 변경 CSS {} 개수 일치 |
| Korean encoding spot check | 주요 파일에서 UTF-8 깨짐은 발견하지 못함 |
실행한 대표 검증 명령
검증 명령 로그
bash
unzip -q /mnt/data/9.1.2.zip -d /mnt/data/audit_912
unzip -q /mnt/data/9.1.3-alpha1.1.0.zip -d /mnt/data/audit_913
diff -qr \
/mnt/data/audit_912/9.1.2/t2editor \
/mnt/data/audit_913/9.1.3-alpha1.1.0/t2editor
git diff --no-index --stat -- \
/mnt/data/audit_912/9.1.2/t2editor \
/mnt/data/audit_913/9.1.3-alpha1.1.0/t2editor
git diff --no-index --numstat -- \
/mnt/data/audit_912/9.1.2/t2editor \
/mnt/data/audit_913/9.1.3-alpha1.1.0/t2editor
php -l editor.lib.php
php -l config/t2_config.php
php -l config/upload_config.php
php -l config/get_upload_config.php
php -l plugin/video/video_view.php
php -l plugin/file/file_upload.php
php -l plugin/file/pdf_view.php
php -l plugin/image/image_upload.php
php -l plugin/collab/collab_verification.php
node --check js/core.js
node --check js/utils.js
node --check plugin/ai/ai.js
node --check plugin/ai_rearrange/ai_rearrange.js
node --check plugin/clipurl/clipurl.js
node --check plugin/draw/draw.js
node --check plugin/export/export.js
node --check plugin/file/file.js
node --check plugin/image/image.js
node --check plugin/meme/meme.js
node --check plugin/table/table.js
node --check plugin/video/video.js
node --check config/nsfw_api_browser.js
node --check js/toolbar.js
Confidence
| 판단 영역 | 신뢰도 | 이유 |
|---|
| 변경량/파일 범위 | 높음 | 실제 ZIP diff 기반 |
| PHP/JS 문법 안정성 | 높음 | lint/check 통과 |
| 보안 개선 방향성 | 중상 | 코드 구조상 sanitizer/allowlist/escape 경계 확인 |
| 사용성 개선 방향성 | 중상 | UI/flow 구조상 개선 명확. 단 사용자 테스트 없음 |
| 실제 런타임 안정성 | 중간 이하 | 브라우저·서버·CMS·외부 API 미검증 |
| production 배포 적합성 | 중간 이하 | alpha 명명과 보안 예외 리스크 존재 |
Recommendations / next actions
P0: 배포 전 필수 확인
| 항목 | 조치 |
|---|
| NSFW 정책 결정 | T2_NSFW_ALLOW_SUSPICIOUS=true가 의도된 정책인지 확정. 차단 우선이면 false로 복구 |
video_view.php 보안 검토 | sandbox 제거 전제이므로 video 파라미터 검증, MIME 제한, CSP, same-origin 정책 확인 |
| 브라우저 smoke test | Chrome, Safari, iOS Safari에서 이미지/비디오/파일/테이블/드로잉/AI/ClipURL/Meme 삽입 테스트 |
| 저장→보기→재편집 회귀 테스트 | CMS/Gnuboard 저장 필터 환경에서 iframe/data/class/fallback anchor 복구 확인 |
| 외부 Meme API 장애 테스트 | API 4xx/5xx/timeout/CORS 실패 시 UI가 멈추지 않는지 확인 |
P1: 안정화 권장
| 항목 | 조치 |
|---|
meme priority 명시 | $T2EDITOR_PLUGIN_PRIORITY['meme'] 추가. 예: image 이후 또는 image와 동일 계열 |
| DOM write migration 완료 | 잔여 직접 innerHTML = 중 사용자 입력/외부 API/AI 결과 경로를 setPluginHTML 또는 안전 DOM 생성으로 이전 |
| visual regression | AI/ClipURL/Meme/Video/Image 모달 light/dark/mobile 캡처 비교 |
| accessibility pass | dialog focus trap, ESC, tab order, aria-label, keyboard tile, screen reader 숨김 anchor 검토 |
| release note 작성 | 보안 변경, NSFW 기본값, video iframe 저장 정책, autosave 포맷 변경 명시 |
P2: 품질 고도화
| 항목 | 조치 |
|---|
| 단위 테스트 도입 | T2Utils.getVideoType, sanitizeURL, table paste sanitizer, autosave parser 테스트 |
| fixture 기반 저장 복구 테스트 | iframe 제거, data-* 제거, class 제거, fallback anchor만 남은 HTML fixture 검증 |
| 성능 계측 | 대형 문서에서 normalizeContent, initializeVideoBlocks, AI diff rendering 시간 측정 |
| design system 정리 | video modal의 shadow/focus glow 등 일부 기존 스타일을 최신 flat/minimal 기준으로 정리 |
Final verdict
최종 판정
9.1.3-alpha1.1.0은 9.1.2 대비 실질적이고 광범위한 업데이트다. 주된 패치 방향은 보안 경계 강화 + 미디어/블록 persistence 안정화 + AI/ClipURL/Meme 사용성 개선이다. 사용성은 분명히 개선되었으며, 특히 “삽입한 블록이 저장 후 깨지는 문제”, “비디오 URL 인식 실패”, “AI 변경 결과 검토 어려움”, “콘텐츠 삽입 도구의 발견성 부족”을 줄이는 방향이다. 다만 alpha로 보는 것이 타당하며, production 배포 전에는 NSFW 기본값, video iframe sandbox 제거, 외부 Meme API, 브라우저/CMS 저장 회귀 테스트를 반드시 통과시켜야 한다.