다운로드는 전용 클라이언트로 막혀 있었는데, 미리보기는 그냥 이미지였다
행정기관 공고문 PDF를 확보하려고 상세페이지를 열었는데, 첨부파일 다운로드 링크를 누르니 “다운로드 프로그램을 설치해야 한다”는 안내가 떴다. 이노릭스(Innorix)라는 전용 파일 전송 클라이언트를 거쳐야 하는 구조였다. curl로 그 링크에 그대로 요청을 보내봐도 파일 대신 설치 안내 페이지나 빈 응답만 돌아왔다.
증상 — 다운로드 링크가 전용 클라이언트로 감싸여 있다
상세페이지의 HTML을 열어보면 다운로드 링크가 이런 식으로 돼 있었다.
<a href="javascript:void(0)" onclick="existFile('0'); return false;">
2026년 입주자 모집공고문.pdf
</a>
existFile()은 서버에 파일 존재 여부를 먼저 확인한 뒤, 이노릭스 클라이언트의 API(control.getAllFiles()[num].downloadUrl)로 실제 다운로드를 위임하는 함수였다. 이 URL은 이노릭스 에이전트가 로컬에서 열어주는 세션에 종속돼 있어서, 브라우저 없이 curl만으로는 재현할 수 없었다.
발견 — 같은 페이지에 ‘미리보기’ 버튼이 따로 있었다
다운로드 링크 바로 옆에 “바로보기”라는 버튼이 있었다. 클릭해보니 새 창으로 문서뷰어가 열렸는데, 그 URL 자체가 흥미로웠다.
https://example.go.kr/main/com/util/htmlConverter.do?brd_id=...&seq=...&file_seq=1
→ (리다이렉트) https://example.go.kr/main/skin/doc.html?fn=...&rs=/main/upload/bbs/.../html/
doc.html은 페이지 넘김 UI가 있는 문서뷰어였다. 브라우저 개발자 도구로 페이지의 <img> 태그를 확인해보니 이랬다.
Array.from(document.querySelectorAll('img')).map(img => img.src)
// [
// "https://example.go.kr/.../20260814_abc123.files/1.png",
// "https://example.go.kr/.../20260814_abc123.files/2.png",
// ...
// ]
뷰어가 PDF를 페이지 단위 PNG로 미리 렌더링해서 서빙하고 있었다. 이 URL들은 이노릭스를 전혀 거치지 않는 일반 정적 리소스였다.
우회 — 이미지 URL을 뽑아 curl로 받는다
브라우저로 뷰어 페이지를 한 번 연 다음, 콘솔에서 이미지 URL 목록을 뽑아 각각 curl로 받으면 원본 PDF의 모든 페이지를 이미지로 확보할 수 있었다.
# 문서뷰어에서 뽑은 이미지 URL 패턴 (페이지 번호만 바뀐다)
BASE="https://example.go.kr/main/upload/bbs/GS0401/2026/08/html/20260814_abc123.files"
for i in $(seq 1 42); do
curl -s -A "Mozilla/5.0" "$BASE/$i.png" -o "page_$i.png"
done
이렇게 받은 페이지 이미지는 표·도장·서명란까지 원본 그대로였다. 다운로드 버튼이 막혀 있다고 해서 그 사이트에서 문서 원문을 아예 확보할 수 없는 게 아니었다 — “다운로드”라는 하나의 기능이 막혔을 뿐, “미리보기”라는 다른 기능은 같은 결과물(문서 원문)을 다른 경로로 이미 제공하고 있었다.
이 우회가 통했던 이유, 그리고 통하지 않을 수도 있는 이유
이 사이트의 뷰어는 페이지를 캔버스에 그리거나 워터마크로 텍스트 선택을 막는 대신, 단순히 <img> 태그로 PNG를 렌더링하는 방식이었다. 그래서 이미지 URL 추출이라는 가장 단순한 방법이 통했다. 만약 뷰어가 페이지를 캔버스(<canvas>)에 그려서 우클릭·저장 자체를 막는 구현이었다면, 이미지 URL을 따로 뽑아낼 수 없어 이 방법은 통하지 않았을 것이다.
같은 시기에 다룬 다른 공공기관 사이트는 아예 이런 우회가 필요 없었다 — 첨부파일 다운로드 링크(fileDown.do?fileId=...)에 별도 인증 없이 직접 curl 요청을 보내면 PDF가 그대로 내려왔다. 두 사이트 모두 “공고문 PDF를 공개한다”는 같은 목적이었지만, 그 파일을 실제로 어떻게 서빙하는지는 완전히 달랐다.
정리
파일 다운로드가 전용 클라이언트나 인증으로 막혀 있어도, 같은 페이지의 “미리보기”·“바로보기” 같은 다른 기능이 같은 콘텐츠를 다른 방식으로 이미 열어두고 있는 경우가 있다. 다운로드 버튼 하나가 막혔다고 포기하기 전에, 그 페이지에 원본과 동일한 내용을 보여주는 다른 진입점이 있는지부터 확인하는 게 먼저다. 그리고 그 방법이 통했다는 사실 자체가 “이 종류의 사이트는 다 이렇다”는 뜻은 아니다 — 사이트마다 뷰어 구현이 다르므로 매번 직접 열어서 확인해야 한다.
자주 묻는 질문
이노릭스가 뭔가요?
한국 공공기관·기업 사이트에서 많이 쓰는 파일 전송 보안 솔루션입니다. 브라우저의 기본 다운로드 대신 전용 클라이언트(또는 브라우저 확장)를 거쳐 파일을 주고받게 하는 구조라, 일반적인 HTTP 다운로드 요청만으로는 파일을 받을 수 없습니다.
이노릭스로 막힌 다운로드를 뚫은 건가요?
아닙니다. 다운로드 버튼 자체는 건드리지 않았습니다. 같은 상세페이지에 있던 '미리보기' 버튼이 이노릭스를 거치지 않고 별도의 문서뷰어로 페이지를 렌더링했는데, 그 뷰어가 각 페이지를 `<img>` 태그의 PNG 파일로 그대로 서빙하고 있었습니다. 그 이미지 URL을 뽑아 curl로 받은 것뿐입니다.
다른 사이트에도 이 방법이 통하나요?
사이트마다 다릅니다. 같은 시기에 다룬 다른 기관 사이트는 첨부 다운로드 링크가 별도 인증 없이 직접 열려서 이 우회 자체가 필요 없었습니다. 문서뷰어를 쓰는 사이트라도 뷰어 구현체(이미지 방식인지, 캔버스에 그려서 텍스트 선택도 막는 방식인지)에 따라 통하지 않을 수도 있습니다.
이미지로 받은 원본에서 표의 숫자를 어떻게 확인했나요?
페이지 이미지를 그대로 눈으로 읽었습니다. 표가 복잡한 페이지일수록 텍스트 추출 도구가 행·열을 뒤섞는 경우가 있어서, 이미지를 직접 보고 숫자를 옮기는 쪽이 더 안전했습니다.