개요
최근 사이드프로젝트를 통해 토스 채용공고에 대한 크롤러를 개발했다. 그간 여러 사이트를 분석하고 크롤러를 만들었던 경험을 가졌기에 이번에도 어렵지 않게 크롤러 개발이 가능했지만 토스 채용공고 크롤러 개발은 생각보다 까다로웠기에 해당 경험을 정리해보고자 한다.
이 글에서는 실제 토스의 채용공고 크롤링에 관련된 코드는 다루지 않을 생각이다. 쓸데없는 걱정이겠지만 이 글을 통해 드러난 방법으로 토스 측의 시스템이 변경하게 되는 것을 염려해서다.
토스 채용공고에 대한 분석
토스의 채용공고 페이지에 접속하면 “계열사”가 아닌 “직군”을 중심으로 구성한 채용공고 페이지가 눈에 띈다.

큰 회사답게 여러 직군들에 대한 채용공고가 눈에 들어온다. 하지만 토스 채용공고 크롤러는 “직군” 중심이 아니라 토스의 “계열사”별로 어떤 “직군”을 모집하는지를 수집해야 한다. 계열사 정보는 특정 모집공고를 클릭해서 확인할 수 있다.

특정 계열사를 클릭하면 해당 직군의 상세 공고를 확인할 수 있다.


정리해 보자면 “ 모집 직군 정보 > 계열사 > 공고 상세” 순으로 이어진다.
토스 채용공고 크롤링이 어려운 점
여기까지 봤을 때 페이지의 흐름에 따라 Selenium을 이용해 코드를 작성하면 될 듯싶다. 하지만 Selenium을 사용하는 방법은 최후의 보루다. Selenium은 WebDriver와 같은 별도의 프로그램이 필요하기 때문에 성능 이슈가 추가적으로 발생한다. 필자는 이러한 특성 때문에 Http Request를 통해 데이터 수집을 선호한다.
그러나 토스 채용공고 크롤러는 Http Request를 통한 데이터 수집이 불가능하다. Http Request를 이용해 크롤러를 만드는 것을 “정적 크롤링”이라고도 부르는 듯하는데 토스 채용공고는 이 “정적 크롤링” 방식이 통하지 않는다. 아무래도 프런트단에서 동작하는 JavaScript와 관련된 무언가가 작동되지 못해서 일어나는 일인 듯싶다.
Selenium을 사용하면 이러한 현상을 피해 크롤링이 가능하지만 앞서 언급했듯 성능 이슈로 인해 사용하지 않으려고 한다.
토스는 채용공고는 어떻게 크롤링할까?
그렇다면 Http Request를 통한 크롤링 불가한 상황에서 토스 채용공고와 같은 사이트는 어떤 식으로 크롤링을 할 수 있을까?
답은 하나밖에 없다고 생각하는데 바로 “페이지 안에서 데이터를 어디서 가져오는가?”를 분석하는 것이다. 쉽게 말하면 네트워크 트래픽을 분석하는 것인데 프런트와 백엔드가 분리된 시스템이라면 프런트에서는 어떤 식으로든 데이터를 Fetch 하는 과정이 일어남을 가정하고 네트워크 트래픽을 살펴보자는 접근법이다.
토스 채용공고 크롤러는 이러한 접근을 이용해서 데이터 수집에 성공할 수 있었다. 아래 이미지는 이 과정을 통해 발견한 토스의 채용공고를 수집하는 데 사용했던 토스 내부의 API이다.

위의 API는 토스의 직군 목록을 반환해 주는 API이기 때문에 직군 목록의 나열만 되어있다. 그러니 계열사 정보를 얻어올 수 없다. 그렇기 때문에 “직군 정보 상세”에 대한 API도 찾아야 하는데 이 API 다음과 같이 호출되고 있었다.

토스 채용공고 API 분석하기
지금까지 알아낸 토스 채용공고 API에서 필요한 정보가 들어있음을 확인했다. 그러나 특이한 점은 토스 API가 API 요청에 대한 응답 결과로써 상당히 많은 데이터를 뿌려준다는 점이다.

위는 채용공고 상세 API에 대한 응답값을 Json Cracker를 이용해 시각화한 이미지다. 보시다시피 굉장히 많은 데이터를 담고 있다.
토스 채용공고 API에서 필요한 데이터를 어떤 식으로 추출했는지에 대한 코드는 작성하지 않을 예정이다.
마치며
과거에 크롤러를 만들 때는 Selenium을 이용해서 HTML 태그를 분석하고 이를 파싱 하는 방향으로 접근했지만 근래에는 원천 데이터를 어디서 가져올 수 있지에 대한 시각으로 바라보고 있다. 그렇다 보니 네트워크 트래픽을 열어보고 그 안에서 데이터를 가져올 수 있을지를 보게 되는데 이런 접근방식이 HTML 태그를 분석하는 방식보다는 훨씬 편리한 방법이라고 생각된다.
토스 채용공고도 마찬가지인 사례였다. 아쉬움이 남는다면 Http Request 만으로 JavaScript가 동작 후 page content를 가져올 수 있는지에 대한 조사를 미처 다하지 못한 부분이다. 여력이 된다면 해당 부분을 계속 조사해 보기로 하고 이만 글을 마친다.
'개발 노트 > 개발 삽질' 카테고리의 다른 글
makefile에서 .env 사용 시 특수문자 처리하기 (0) | 2025.02.12 |
---|---|
Github Action에서 Selenium 실행시키기 (7) | 2024.09.23 |
Obsidian 노트를 Tistory에 업로드 시키는 방법 (4) | 2024.09.15 |
마비노기 패킷 송수신 데이터 관찰기 (2) | 2024.08.18 |
ProxySQL을 사용하면 DB Connection을 줄일 수 있다고 ? (0) | 2024.05.04 |