보안

파일 검증

저희는 파일의 확장자나 브라우저가 알려 주는 MIME 타입을 신뢰하지 않습니다. 선택한 모든 파일은 실제 바이트 시그니처로 식별하며, 디코딩할 수 없는 것은 처리를 시작하기 전에 거부합니다. 문서 파일의 이름을 .png로 바꿔도 잘못 처리되지 않고 거부됩니다. 이 검사는 어느 단계에서도 업로드 없이 사용자 기기에서 실행됩니다.

자원 제한

SVG 처리

SVG는 픽셀만이 아니라 코드입니다. 그래서 그리기 전에 별도의 정리 과정을 거칩니다. <script>, <foreignObject>, <iframe>, <embed>, <object>, 미디어와 애니메이션 요소를 제거하고, 모든 on… 이벤트 속성을 떼어내며, href는 같은 문서 내 참조와 인라인 data:image/ 값으로만 제한합니다. @import를 쓰거나 원격 URL을 가져오는 내장 스타일시트는 삭제하고, 문서 밖을 가리키는 url()이 들어 있는 속성은 모두 제거합니다.

이후 래스터화는 blob URL을 불러오는 <img> 요소를 통해 이뤄지는데, 이는 명세상 스크립트를 실행하지도 하위 리소스를 가져오지도 않습니다. 정리 과정은 유일한 방어선이 아니라 두 번째 층입니다.

Content Security Policy

사이트는 스크립트, 스타일, 이미지, 폰트, 네트워크 연결의 출처를 제한하고, 프레임 삽입을 금지하며, base-uriform-action을 이 출처로 고정하는 Content Security Policy를 함께 배포합니다. connect-src는 의도적으로 좁게 두었습니다. 이미지 데이터를 어디론가 보내는 코드 경로가 없고, 이 헤더 덕분에 의존성이 침해되더라도 조용히 그런 동작을 시작할 수 없습니다.

메모리 관리

Object URL, ImageBitmap, 캔버스는 파일을 제거하거나 페이지를 닫을 때 해제되고, 페이지를 벗어날 때 워커가 종료됩니다. 일괄 처리를 취소하면 인코딩 중인 파일이 끝나기를 기다리지 않고 워커를 즉시 종료합니다. 이미지는 localStorage, sessionStorage, IndexedDB 등 어떤 영구 저장소에도 기록되지 않습니다. 압축과 다운로드를 한 번 끝낸 뒤 저장된 값이 테마 설정뿐임을 자동 테스트가 확인합니다.

취약점 신고

보안 문제를 발견하셨다면 [email protected]로 상세 내용과 재현 절차를 보내 주세요. 공개하시기 전에 저희가 대응할 수 있는 합리적인 시간을 주시면 감사하겠습니다.