본문으로 건너뛰기
유환호 연락하기

홈 / 기록

존재하지 않는 페이지 번호를 404로 막지 않은 이유

한눈에 답변

목록 주소 뒤에 페이지 번호를 임의의 큰 숫자로 붙여도 서버는 항상 정상 응답과 함께 카드 0개인 페이지를 돌려주고 있었다. 목록 경로가 수천 개인데 여기에 임의의 정수를 곱하면 사실상 무한한 얇은 페이지가 만들어지는 구조였다. 이 문제는 404가 아니라 색인 제외로 막았다 — 공고 목록은 몇 시간마다 마감돼 페이지 수가 계속 바뀌므로, 방금까지 존재하던 페이지를 영원히 없던 것으로 선언하면 안 되기 때문이다.

무엇을 발견했나

목록 페이지 주소 뒤에 페이지 번호를 실제로 존재하지 않는 아주 큰 임의의 숫자로 바꿔서 열어 봤다. 정상적인 오류 응답이 나올 것으로 예상했는데, 실제로는 정상 응답 코드와 함께 색인 허용 상태, 그리고 그 페이지 자신을 대표 주소로 지정한 채로 카드 0개인 빈 화면이 나왔다. 목록 경로가 수천 개에 달하는데, 여기에 임의의 정수를 곱하면 이론상 끝없이 많은 빈 페이지를 만들 수 있는 구조였다.

왜 404로 막지 않았나

가장 직관적인 해법은 존재하지 않는 페이지 번호에 404 오류를 돌려주는 것이다. 하지만 이 서비스의 목록은 공고가 몇 시간마다 마감되며 계속 줄어드는 구조다. 오전에는 10페이지까지 있던 목록이 오후에는 8페이지로 줄어들 수 있다. 이 상황에서 9페이지에 404를 돌려주면, 그건 “이 주소는 원래 없었다”는 영구적인 선언이 되는데 실제로는 몇 시간 전까지 존재했던 페이지였다. 사실과 다른 신호를 보내는 셈이다.

대신 어떻게 처리했나

범위를 벗어난 페이지 번호는 검색 결과에서 제외하는 방식으로 처리했다. 페이지 자체는 정상적으로 열리지만 검색엔진에게는 색인하지 말라고 안내하는 것이다. 이렇게 하면 그 페이지가 한때 존재했다가 사라졌다는 사실과 모순되지 않으면서도, 빈 페이지가 검색 결과를 오염시키는 것은 막을 수 있다.

1페이지는 왜 예외인가

1페이지는 공고가 0건이어도 이 규칙에서 제외했다. “지금 이 지역·분야에는 공고가 없다”는 것 자체가 그 페이지가 답해야 할 유효한 정보이기 때문이다. 존재해야 할 답이 마침 비어 있는 것과, 애초에 존재 범위를 벗어난 페이지를 요청한 것은 서로 다른 상황이다.

같이 정리한 것

이 판정을 공통 레이아웃 한 곳에서 처리하도록 모았다. 대표 주소는 그 페이지 자기 자신으로 유지했는데, 검색 제외 안내와 함께 “이 페이지의 대표 주소는 다른 곳”이라는 신호까지 같이 주면 검색엔진이 어느 쪽을 따라야 할지 알 수 없는 모순된 상태가 되기 때문이다. 화면에 보이는 제목에는 “2페이지”라는 표시를 남겨서, 검색에서는 빠지더라도 사람이 브라우저 탭이나 관리 도구에서 이 페이지를 구분할 수 있게 했다.