Lobsters 검색, 로그인 여부와 무관하게 봇 점수로 Anubis 챌린지 판별
Lobsters의 Anubis 설정은 `/search` 이외의 경로를 통과시키고, 검색 요청은 계정 로그인 상태 대신 봇 점수에 따라 처리합니다. `Mozilla`·`Opera`와 일치하는 요청에 가중치 10을 더해 총점이 10 이상 20 미만이면 난이도 2의 `fast` 챌린지를 적용합니다. 운영자 pushcx는 수천 개 IP로 요청 제한을 우회한 크롤러가 리디렉션 조회에 부하를 준 일을 대응 배경으로 들었습니다.

로그인한 Lobsters 이용자가 /search에서 Anubis 챌린지를 만나는 것은 검색 경로의 정책이 계정 상태가 아니라 요청의 봇 점수를 기준으로 하기 때문입니다. Lobsters 저장소의 배포 설정은 요청을 Caddy에서 Anubis로, 다시 Puma 애플리케이션으로 전달합니다. Anubis는 /search로 시작하지 않는 경로를 통과시키고 검색 요청에 정책을 적용합니다.
정책 파일은 사용자 에이전트가 Mozilla 또는 Opera와 일치하는 요청에 generic-browser 규칙으로 가중치 10을 더합니다. 총 가중치가 10 이상 20 미만이면 fast 알고리즘, 난이도 2의 챌린지를 내도록 설정돼 있습니다. 계정 로그인 여부는 정책 조건에 없으므로 인증된 이용자도 해당 점수 구간에 들면 검색에서 챌린지를 받습니다.
Lobsters 운영자 pushcx는 2025년 10월 25일 공격적인 크롤러가 수천 개 IP를 바꿔 가며 요청 제한을 우회했고, 사이트가 느려지거나 거의 멈췄다고 저장소 이슈에 기록했습니다. 과부하가 집중된 곳은 검색이 아니라 리디렉션 조회 엔드포인트였습니다. pushcx는 해당 엔드포인트가 로컬에 캐시된 페이지를 내주는 대신 데이터베이스 조회를 두세 차례 해, 크롤러 요청이 몰리면서 데이터베이스에 부하가 쌓였다고 설명했습니다.
pushcx는 로그아웃 방문자의 페이지 전체를 캐시해 애플리케이션 서버 부하를 줄이는 등 성능 개선을 해 온 덕분에 봇 대응을 점진적으로 강화할 여지가 있었다고 밝혔습니다. Anubis는 우선 /search에만 적용하고 챌린지는 대체로 가볍게 설정했습니다. 공격적인 크롤러가 다시 사이트를 압박하면 보호 범위와 난이도를 높일 수 있도록 미리 연결해 둔 것입니다.
참고 자료
- Why is there an Anubis gate in front of Search for logged-in users?
- add Anubis with a conservative config · Issue #1781 · lobsters/lobsters
- Configure Anubis by hmadison · Pull Request #1903 · lobsters/lobsters
- Configure Anubis by hmadison · Pull Request #1903 · lobsters/lobsters · GitHub
- ignore PORT to wire caddy -> anubis -> puma #1781 · lobsters/lobsters@52f4f2b · GitHub