보안
파일 검증
저희는 파일의 확장자나 브라우저가 알려 주는 MIME 타입을 신뢰하지 않습니다. 선택한 모든 파일은
실제 바이트 시그니처로 식별하며, 디코딩할 수 없는 것은 처리를 시작하기 전에 거부합니다.
문서 파일의 이름을 .png로 바꿔도 잘못 처리되지 않고 거부됩니다.
이 검사는 어느 단계에서도 업로드 없이 사용자 기기에서 실행됩니다.
자원 제한
- 메모리 폭주를 막기 위한 파일당 크기 제한(기본 25 MB).
- 압축 폭탄에 대비한 전체 픽셀 수 제한(기본 40 메가픽셀).
- 처리 큐 크기를 제한하는 일괄 처리 개수 제한(기본 20개).
SVG 처리
SVG는 픽셀만이 아니라 코드입니다. 그래서 그리기 전에 별도의 정리 과정을 거칩니다.
<script>, <foreignObject>, <iframe>,
<embed>, <object>, 미디어와 애니메이션 요소를 제거하고,
모든 on… 이벤트 속성을 떼어내며, href는 같은 문서 내 참조와 인라인
data:image/ 값으로만 제한합니다. @import를 쓰거나 원격 URL을 가져오는
내장 스타일시트는 삭제하고, 문서 밖을 가리키는 url()이 들어 있는 속성은 모두 제거합니다.
이후 래스터화는 blob URL을 불러오는 <img> 요소를 통해 이뤄지는데, 이는 명세상
스크립트를 실행하지도 하위 리소스를 가져오지도 않습니다. 정리 과정은 유일한 방어선이 아니라
두 번째 층입니다.
Content Security Policy
사이트는 스크립트, 스타일, 이미지, 폰트, 네트워크 연결의 출처를 제한하고, 프레임 삽입을 금지하며,
base-uri와 form-action을 이 출처로 고정하는 Content Security Policy를
함께 배포합니다. connect-src는 의도적으로 좁게 두었습니다. 이미지 데이터를 어디론가
보내는 코드 경로가 없고, 이 헤더 덕분에 의존성이 침해되더라도 조용히 그런 동작을 시작할 수 없습니다.
메모리 관리
Object URL, ImageBitmap, 캔버스는 파일을 제거하거나 페이지를 닫을 때 해제되고,
페이지를 벗어날 때 워커가 종료됩니다. 일괄 처리를 취소하면 인코딩 중인 파일이 끝나기를 기다리지 않고
워커를 즉시 종료합니다. 이미지는 localStorage, sessionStorage, IndexedDB 등
어떤 영구 저장소에도 기록되지 않습니다. 압축과 다운로드를 한 번 끝낸 뒤 저장된 값이 테마 설정뿐임을
자동 테스트가 확인합니다.
취약점 신고
보안 문제를 발견하셨다면 [email protected]로 상세 내용과 재현 절차를 보내 주세요. 공개하시기 전에 저희가 대응할 수 있는 합리적인 시간을 주시면 감사하겠습니다.