🔍
광고 자리 · 리더보드

괌 MPRE 좌석이 만석이라 감시 봇을 만들었다, 웹페이지 변경 감지 자동화 후기

8월 12, 2026
광고 자리 · 본문 상단

웹페이지 변경 감지 자동화가 필요했던 이유는 단순했다. 시험장 자리가 취소로 비는 순간을 잡고 싶은데, 그 화면은 로그인해야만 보인다.

배경부터 짧게. 미국변호사 시험(DC bar)을 보려면 사전요건으로 MPRE라는 법조윤리 시험을 먼저 통과해야 한다. 이 시험은 미국 전역의 시험장에서 치르는데, 한국에서 제일 가까운 미국 땅이 괌이다. 연초에 예약이 열리면 그해 세 번 치르는 회차를 전부 한꺼번에 잡을 수 있는데, 괌은 아시아 지역 응시자가 몰리는 시험장이라 그때 좌석이 다 나간다. 내가 들어갔을 때는 이미 마감이었다.

다행히 같은 회차 안에서는 시험장을 옮길 수 있다. 누군가 취소하면 자리가 잠깐 뜬다. 문제는 그게 언제인지 아무도 안 알려준다는 것. 그래서 하루에도 몇 번씩 로그인하고, 재예약 화면까지 클릭해 들어가서 달력을 확인하고 나오는 짓을 반복했다. 어느 날 이걸 왜 내가 하고 있나 싶더라. 마침 클로드코드를 쓰고 있었으니 이 감시를 통째로 넘겨보기로 했다.

결론부터 말하면 감시기는 만들어졌고 한 달쯤 돌았다. 그리고 자리는 못 잡았다. 시험은 백업으로 잡아둔 LA에서 보는 걸로 정리됐다. 그 과정에서 걸린 것들이 오히려 쓸모 있어서 그것만 적는다.

📑 목차


1. 새로고침을 하루에 몇 번씩 하고 있었다

상황부터 정리해두자. 시험 자체는 정해진 날짜에 미국 전역의 시험장에서 동시에 치른다. 시험장은 예약제고, 이미 잡아둔 예약을 같은 회차 안에서 다른 시험장으로 옮기는 것도 된다. 수수료를 내고, 시험 이틀 전까지. 옮기려는 사람이 있으면 원래 자리가 비고, 그 빈자리를 다른 사람이 채간다. 취소석이 도는 구조다.

내가 원한 건 그 빈자리 하나였다. 근데 자리가 떴다는 알림 기능 같은 건 없다. 사이트에 들어가서 직접 봐야 한다. 그것도 로그인하고, 내 예약 상세로 가고, 재예약 링크를 누르고, 시험장을 바꾸는 검색창에 도시를 넣고, 그제서야 달력이 뜬다. 클릭 대여섯 번.

이걸 자기 전에도 하고 있었으니 말 다 했지.

그래서 이 클릭 대여섯 번을 그대로 대신 밟아줄 무언가가 필요했다. 자리가 있으면 텔레그램으로 알려주고, 없으면 조용히 있는 것. 예약 버튼까지 대신 누르게 하는 건 처음부터 뺐다. 결제가 걸리고, 검증도 못 해본 코드를 한 방에 실행시키는 건 너무 위험하니까.

2. 변경 감지 서비스로는 안 되는 페이지가 있다

웹페이지 변경 감지 자동화라고 검색하면 서비스가 여럿 나온다. 주소를 넣어두면 주기적으로 그 페이지를 긁어서 이전과 달라진 부분이 있을 때 메일이나 알림을 주는 도구들. 공개된 페이지라면 그걸로 충분하다. 가격이 바뀌었는지, 공지가 올라왔는지 보는 데는 아주 잘 맞는다. 코드도 필요 없고.

그런데 내 경우엔 안 됐다. 이유는 하나다. 그 좌석 달력은 주소창에 URL을 넣는다고 열리는 페이지가 아니다. 로그인 뒤에 있고, 그것도 내 계정에 붙은 시험 응시 자격 뒤에 있다. 로그인 없이 그 주소를 부르면 아무것도 안 나온다. 즉 감시 도구가 볼 수 있는 화면 자체가 존재하지 않는 셈.

여기서 갈림길이 생긴다. 로그인 벽이 없는 페이지면 기성 서비스를 쓰면 되고(웹에서 자료를 긁어오는 쪽 얘기는 크롤링 입문 글에 따로 정리해뒀다), 벽이 있으면 "실제 브라우저를 띄워서 사람처럼 로그인한 상태로 클릭해 들어가는" 방식밖에 없다. 후자를 해주는 도구가 플레이라이트(Playwright) 같은 브라우저 자동화 라이브러리다. 브라우저를 코드로 조종하는 물건이라고 보면 된다.

그래서 방향을 정했다. 진짜 크롬을 하나 띄워놓고, 거기서 로그인한 상태를 유지하면서, 주기적으로 그 클릭 대여섯 번을 밟게 하는 것.

공개 페이지와 로그인 벽 뒤 페이지의 접근 경로를 번호 스텝으로 비교한 두 카드 ▲ 공개 페이지와 로그인 벽 뒤 페이지의 접근 경로를 번호 스텝으로 비교한 두 카드 (자체 제작 이미지)

3. 시작하자마자 멈췄다, 전제가 틀려서

계획안을 먼저 받아봤다. 코드 짜기 전에 뭘 어떻게 할 건지 문서로 내놓게 하는 방식인데, 이번엔 그게 값을 했다. 계획안에 "사용자는 이미 다른 시험장에 좌석을 예약해둔 상태"라고 적혀 있었거든. 읽다가 어라 싶었다. 나는 응시 자격만 받아둔 상태였지 어디에도 예약을 안 했다.

이게 왜 문제냐면, 재예약 화면은 예약이 있어야 나온다. 예약이 없으면 옮길 게 없으니 그 링크 자체가 안 생긴다. 감시기가 도달해야 할 목적지가 아예 없는 상태였던 것. 코드를 다 짜고 돌렸으면 "왜 링크를 못 찾지" 하면서 한참 헤맸을 거다.

그래서 인프라만 깔아두고 거기서 멈췄다. 텔레그램으로 메시지 보내는 부분, 크롬 띄워서 로그인하는 부분, 설정이 제대로 됐는지 확인하는 검사 스크립트까지만. 그다음 백업으로 쓸 LA 시험장을 결제해서 실제로 예약을 잡았고, 그러고 나서야 재개했다.

계획을 먼저 문서로 받아보는 습관은 지시법 정리한 글에서도 한 번 다뤘는데, 이번 건은 좀 다른 종류였다. 코드가 틀린 게 아니라 출발 전제가 틀렸던 거라, 코드를 아무리 잘 짰어도 못 살렸다.

4. 세션에는 정해진 수명이 있었다

재개하고 나서 제일 궁금했던 건 이거였다. 한 번 로그인해두면 계속 유지되나?

재보라고 시켰다. 13~16분마다 계속 페이지를 밟으면서 언제 풀리는지 기록하는 프로브를 따로 돌렸다. 결과는 535분, 그러니까 8시간 55분에서 끊겼다. 체크 40회를 하는 동안 계속 활동 중이었는데도 만료됐다. 가만히 있어서 풀린 게 아니라, 로그인한 시점부터 시간을 재서 자르는 방식이었던 것. 활동으로는 못 늘린다.

같이 알게 된 게 하나 더 있다. 브라우저 창을 닫으면 세션도 같이 사라졌다. 로그인 정보가 디스크에 저장되는 게 아니라 그 브라우저 안에만 살아 있어서, 매번 새 브라우저를 띄워 확인하는 방식은 첫 시도부터 "세션 만료"로 튕겼다. 그래서 크롬을 아예 안 끄고 상주시키는 구조가 됐다. 창 하나 켜둔 채로 그 안에서 계속 왔다 갔다 하는 것.

봇으로 걸릴까 걱정했는데 9시간 40회 동안 자동입력 방지 문자(CAPTCHA)는 한 번도 안 떴다. 13~16분에 한 번이면 사람이 들락거리는 것보다 오히려 얌전한 빈도라서 그런 듯.

정리하면 이렇게 됐다. 자정 무렵 내가 크롬에서 한 번 로그인해주고, 거기서부터 아홉 시간쯤을 자동으로 감시한다. 아침에 세션이 풀리면 오늘치 종료 메시지가 오고 끝. 하루 24시간 무인 감시는 애초에 불가능했다. 시간 맞춰 자동으로 띄우는 배선(맥의 launchd)은 아침 브리핑 만든 글에 자세히 적어놨으니 여기선 건너뛴다.

13~16분 간격 40회 체크 뒤 535분 지점에서 세션이 만료된 과정을 표시한 가로 타임라인 차트 ▲ 13~16분 간격 40회 체크 뒤 535분 지점에서 세션이 만료된 과정을 표시한 가로 타임라인 차트 (자체 제작 이미지)

5. 자리 있다고 잘못 알릴 뻔했다

제일 아찔했던 건 이거다. 세션 수명 재보려고 돌린 프로브가, 재는 김에 좌석 판정도 같이 찍고 있었는데 거기서 "자리 있음"이 나왔다. 괌은 만석인데.

들여다보니 감시기가 괌 달력이 아니라 백업으로 잡아둔 LA 시험장 달력을 보고 있었다. 그 달력엔 당연히 내 자리가 있다. 내가 예약한 거니까. 시험장을 바꾸는 단계가 조용히 실패했는데도 화면은 멀쩡한 달력이라, 봇 입장에선 구분할 방법이 없었던 거다.

원인은 검색창이었다. 그 주소 입력칸이 단순한 글자 입력칸이 아니라 지도 검색이 붙어 있는 칸이었다. 안에는 이미 LA 시험장 주소와 좌표가 들어 있고, 코드로 글자만 갈아끼우면 화면에 보이는 텍스트만 바뀌고 실제로 넘어가는 좌표는 그대로다. 결국 예전 위치로 검색된다. 사람처럼 한 글자씩 실제로 타이핑해서 자동완성 후보를 띄우고, 그 후보를 골라줘야 좌표까지 바뀌었다.

고치고 나서 안전장치를 하나 더 걸었다. 최종 달력 화면에 괌 시험장 이름이 안 보이면 알림을 보내지 말고 그냥 오류로 끝내라는 것. 잘못된 알림보다는 침묵이 낫다고 봤다.

자리 났다고 새벽에 벌떡 일어났는데 내 자리였으면 좀 그렇잖아.

6. 만들고 난 뒤가 진짜였다

돌기 시작하면 끝인 줄 알았는데 아니었다. 살면서 겪은 건 대충 이렇다.

라이브 이틀 만에 감시가 사흘 동안 멈춰 있었다. 세션이 풀렸는데 재로그인 요청이 자정에만 뜨는 구조였고, 자정에 컴퓨터 앞에 없으면 그날은 통째로 날아갔다. 재로그인 알림도 네트워크가 잠깐 튄 사이 유실됐다. 그래서 로그인 창을 바탕화면 아이콘으로 빼서 아무 때나 더블클릭하면 되게 바꾸고, 알림 전송은 세 번까지 재시도하게 고쳤다.

주말부터 모니터가 안 꺼졌다. 절전 설정을 아무리 봐도 멀쩡한데 화면이 계속 켜져 있길래 헤르메스 업데이트를 의심했다가, 범인은 감시기가 띄워둔 크롬이었다. 오류가 난 체크에서 화면 캡처를 뜨다가 "지금 화면 녹화 중이니 끄지 마라"는 표시를 걸어놓고 안 풀어버린 것. 그게 22시간 동안 박제돼 있었다. 데몬을 한 번 재시작하니 사라졌다.

오류가 날 때마다 전체 화면 스크린샷을 떨구게 해뒀는데, 그게 236KB짜리라 알아서 복구되는 일시 오류에도 계속 쌓였다. 어느새 81개, 21MB. 진짜 실패일 때만 남기도록 조건을 걸어 막았다.

노트북 파일 동기화가 멈춰 있길래 파보니 이것도 감시기였다. 크롬 프로필 폴더가 373MB인 데다 캐시가 초 단위로 다시 쓰이는 바람에, 동기화 프로그램이 영원히 따라잡지 못하고 매달려 있었다. 그 폴더를 동기화 제외로 빼서 끝냈다.

넷 다 감시 로직하고는 아무 상관이 없다. 자동화를 하나 붙이면 그 자동화를 돌보는 일이 따로 생긴다는 걸 이때 체감했는데, 이 얘기는 점검하는 자동화 글에서 한 번 더 다뤘다. 맥 특유의 함정에 걸려 며칠 날린 적도 있어서 권한 오류 겪은 기록도 같이 남겨뒀다.

감시기가 보낸 텔레그램 알림 3종과 하루 56회 체크 집계를 정리한 터미널 화면 ▲ 감시기가 보낸 텔레그램 알림 3종과 하루 56회 체크 집계를 정리한 터미널 화면 (자체 제작 이미지)

7. 한 달 돌리고 껐다

한 달쯤 돌았다. 점검하던 날 기록을 보면 그날 하루 56번 확인해서 54번은 만석, 2번은 일시 오류였고 그건 알아서 복구됐다. 판정 자체는 정확했다. 다만 자리가 안 났다. 새벽 아홉 시간을 매일 지켜봤는데도 그 시험장은 끝까지 만석이었고, 결국 감시를 끄기로 했다. 자동 실행 등록을 해제하고 프로젝트 폴더는 보관함으로 넘겼다. 시험은 백업으로 잡아둔 LA 좌석에서 보는 걸로 정리됐다.

그래서 실패냐 하면 반반이다. 감시기는 제 할 일을 했고, 세상에 자리가 안 났을 뿐이다. 그건 코드가 어떻게 할 수 있는 영역이 아니다. 다만 하나는 확실히 알았다. 아홉 시간짜리 세션이라는 벽 때문에 이 감시는 애초에 반쪽짜리였고, 하필 자리가 낮에 떴다면 나는 못 잡았을 거다. 시작 전에 이 한계를 알았다면 만들었을까? 아마 만들긴 했을 것 같다. 그래도 기대치는 훨씬 낮췄겠지.

비슷한 걸 해보고 싶은 사람이라면 순서만 지키면 된다. 첫째, 감시할 페이지가 로그인 뒤에 있는지부터 확인한다. 공개 페이지면 기성 변경 감지 서비스로 5분이면 끝나고, 그럴 땐 굳이 만들 이유가 없다. 둘째, 로그인 뒤에 있다면 세션이 얼마나 버티는지부터 재본다. 이게 감시 설계를 통째로 결정한다. 셋째, 잘못된 알림을 막는 확인 절차를 반드시 넣는다. 화면이 멀쩡해 보인다고 내가 원한 화면인 건 아니니까. 넷째, 결제나 예약처럼 되돌리기 어려운 클릭은 사람이 직접 한다. 어디까지 자동으로 풀지에 대한 얘기는 권한 세팅 글에 정리해뒀다.

3줄 요약 - 로그인해야 보이는 페이지는 기성 변경 감지 서비스로 못 잡는다, 브라우저를 통째로 띄우는 방식이어야 한다 - 세션 수명(여기선 약 9시간)이 감시 설계를 결정한다, 만들기 전에 재봐라 - 감시 로직보다 뒤에 붙은 것들(화면 안 꺼짐, 스크린샷 쌓임, 동기화 멈춤)이 손이 더 갔다

자리는 못 잡았지만 새벽마다 새로고침하던 습관은 없어졌다. 그거라도 어디냐 싶다.


이 글은 정보 제공 목적으로 남긴 개인 경험 기록이고, 작성 시점(2026년 8월) 기준이다. 여기 적은 방식이 다른 환경에서 똑같이 굴러간다는 보장은 못 한다. MPRE 일정과 시험장, 예약·재예약 정책과 수수료, 사이트 화면 구조는 주관 기관 공식 페이지에서 바뀔 수 있으니 실제 결제·예약 전에 원문을 확인하는 게 안전하다. 본문에 나온 시험장·좌석 관련 금액과 기한은 내가 진행할 당시 기준이며 현재 값과 다를 수 있다 [⚠️UNVERIFIED]. 또한 로그인이 필요한 사이트의 자동화는 해당 서비스 이용약관에 걸릴 수 있고, 이 글은 특정 사이트에 대한 자동화를 권유하지 않는다. 따라 해서 생긴 결과에 대한 책임은 못 진다.

참고한 공식 자료 - 브라우저 자동화(Playwright 파이썬): playwright.dev/python - 맥 정기 실행 등록(launchd): Apple Developer Archive - 텔레그램 봇 알림 보내기: core.telegram.org/bots/api - 클로드코드 개요: code.claude.com/docs - 공개 페이지용 변경 감지 도구(오픈소스): changedetection.io

광고 자리 · 멀티플렉스

함께 읽으면 좋은 글