로봇 규칙 세 글자가 핵심 페이지 하나를 통째로 막고 있었다
한눈에 답변
robots.txt의 Disallow 규칙이 짧은 세 글자로 적혀 있었는데, 그 규칙이 경로의 접두사와 일치하면 전부 차단하는 방식으로 해석되면서 전혀 다른 페이지, 그것도 경쟁률·마감일 계산 기준을 설명하는 유일한 페이지까지 함께 막고 있었다. 사이트맵은 그 페이지를 제출하고 안내 파일도 소개하고 있었지만, 답변엔진 열두 종 전부가 그 페이지를 읽을 수 없는 상태였다.
무엇이 막혀 있었나
로봇 규칙 파일에 적어 둔 짧은 차단 규칙 하나가, 그 이름으로 시작하는 모든 경로를 함께 막아 버리고 있었다. 그 규칙이 의도한 대상은 로그인한 사용자만 보는 개인 페이지였는데, 우연히 같은 세 글자로 시작하는 전혀 다른 페이지 — 데이터 산출 방법을 설명하는 페이지 — 까지 같은 차단 대상이 됐다.
왜 이렇게 넓게 막혔나
로봇 배제 표준의 정식 규격에서, 차단 규칙은 정확히 일치하는 것이 아니라 경로의 앞부분이 일치하면 전부 차단하는 접두사 매칭 방식이다. 검색엔진 공식 문서의 예시도 짧은 규칙 하나가 그 글자로 시작하는 더 긴 다른 경로까지 막는 사례를 직접 보여 준다. 그리고 여러 규칙이 겹칠 때는 더 길게 일치하는 규칙이 이긴다는 원칙 때문에, 짧은 차단 규칙이 짧은 허용 규칙을 이겨 버렸다.
왜 하필 이 페이지가 막힌 게 치명적이었나
막힌 페이지는 경쟁률과 마감일 계산 기준을 설명하는, 대체할 다른 페이지가 없는 유일한 문서였다. 이미 다른 여러 안내 문서에서 이 페이지를 “여기서 계산 기준을 확인하라”고 링크로 가리키고 있었다. 그런데 답변엔진 크롤러 열두 종류 전부가 이 저장소의 규칙 구조상 개별 그룹으로 취급되고 있었고, 그 열두 그룹 모두에서 같은 차단 규칙이 복제돼 있었다 — 즉 어떤 답변엔진도 이 핵심 페이지를 읽을 수 없는 상태였다.
어떻게 고쳤나
차단 규칙 끝에 “경로가 정확히 여기서 끝난다”는 것을 뜻하는 기호를 붙여, 그 이름 자체로 끝나는 경로만 막고 그 뒤에 다른 글자가 이어지는 경로는 막히지 않게 좁혔다. 이 기호를 해석하지 못하는 구식 크롤러가 있더라도, 그런 경우엔 원래 차단하려던 개인 페이지 하나만 열리게 될 뿐이고, 그 페이지는 어차피 검색 제외 설정과 로그인 요구가 이미 걸려 있어 위험이 없었다.
이 사건에서 확인한 것
한쪽 코드는 이미 이 페이지를 정확히 일치하는 방식으로 처리하고 있었다. 즉 저장소 안에 정답을 아는 부분과 모르는 부분이 동시에 존재하고 있었던 셈이다. 그리고 실제로 서버가 내보내는 최종 파일을 검색엔진 관점에서 다시 받아 대조하는 검사를 새로 만들었다 — 소스 코드의 배열만 보는 것으로는, 그 배열이 실제로 어떻게 조립돼 나가는지까지는 확인할 수 없기 때문이다.