보안
이 페이지는 현재 적용 중인 구체적인 보안 조치를 설명하며, 조치가 바뀌면 함께 갱신합니다.
전송과 응답 헤더
Cross-Origin-Embedder-Policy는 의도적으로 전역 적용하지 않았습니다. 광고·측정 스크립트를 깨뜨리는 반면, 어떤 도구도 SharedArrayBuffer에 의존하지 않아 얻는 것이 없기 때문입니다.
- 전 구간 HTTPS. 하위 도메인을 포함한 2년 max-age의 HSTS를 적용합니다.
- 스크립트·스타일·이미지·글꼴·연결 대상을 이 출처와 실제로 사용하는 측정 도메인으로 제한하는 Content-Security-Policy를 적용합니다.
- frame-ancestors 'none' 으로 다른 페이지에 삽입되지 않도록 하고, 구형 브라우저를 위해 X-Frame-Options도 함께 보냅니다.
- X-Content-Type-Options: nosniff, strict-origin-when-cross-origin 리퍼러 정책, 그리고 카메라·마이크·위치·결제 접근을 차단하는 Permissions-Policy를 적용합니다.
파일을 다루는 방식
- 확장자를 믿지 않고 파일 앞부분의 시그니처(매직 바이트)를 읽어 검증하므로, 확장자만 바꾼 파일은 거부됩니다.
- Office 형식은 ZIP 컨테이너이므로 엔트리 개수, 단일 엔트리 크기, 압축 해제 후 총 크기에 상한을 두어 압축 폭탄을 막습니다.
- 다운로드에 사용하기 전 파일명에서 경로 구분자와 제어문자를 제거합니다.
- 문서에서 추출한 텍스트는 HTML이 아니라 텍스트 노드로 삽입하므로, 문서가 페이지에 마크업을 주입할 수 없습니다.
- 사용이 끝난 object URL은 해제하고, 작업이 끝나면 큰 버퍼 참조를 놓아 줍니다.
의존성
PDF 처리는 pdf-lib과 pdf.js를 사용하며, 공개 CDN이 아니라 이 사이트에서 직접 제공하고 버전을 고정합니다. PDF.js 워커와 포함하는 글꼴도 이 도메인에서 제공하므로, 어떤 문서를 다루는지 제3자가 알 수 없습니다.
의도적으로 제공하지 않는 기능
현재 PDF 암호 설정과 해제를 제공하지 않습니다. 브라우저에서 암호화가 불가능해서가 아니라, 여러 브라우저에서 검증을 마친 구현을 아직 내놓지 못했기 때문입니다. 반쯤 동작하는 암호화 기능은 없는 것보다 나쁩니다. 해당 도구 페이지에 검증된 구현에 필요한 조건을 정리해 두었습니다.
열 수 없는 문서의 암호를 알아내거나 우회하는 기능도 제공하지 않습니다.
취약점 제보
보안 문제를 발견하면 재현 가능한 수준의 정보를 담아 이메일로 알려 주시고, 공개 전에 수정할 수 있는 합리적인 기간을 주시기 바랍니다. 제보에 실제 개인 문서를 첨부하지 말아 주세요.