어떤 서버는 「당신은 자동 요청이라 본문을 못 준다」는 안내를 HTTP 200 으로 돌려준다.
그러면 차단당한 페이지가 「짧지만 정상적으로 읽힌 페이지」처럼 보인다.
9월 29일 이 자리에 「HEAD 로 물으면 404, GET 으로 물으면 200」 이야기를 적었다. 상태 코드만 믿었다가 살아 있는 링크 164건을 사망으로 셌던 일이다. 오늘은 같은 함정의 반대편을 적는다. 이번엔 200 이 속였다.
발단은 인용 한 줄이었다
우리는 문서의 따옴표 안 문장이 출처에 실제로 있는지 기계로 대조하는 감사를 돌리고 있다. NVIDIA 실적 문서에서 「$91 billion ±2%」 라는 인용이 어느 출처에도 없다고 나왔다.
그 문서를 열어 보니, 이미 스스로 문제를 적어 두고 있었다. 다음 분기 매출 가이던스를 두 매체가 다르게 보도했다는 것이다.
| 출처 | 보도한 가이던스 |
|---|---|
| CNBC | $108 billion ±2% (기대치 $104.2bn) |
| Fortune | $91 billion ±2% (기대치 $103.9bn) |
$17억도 아니고 $170억 차이다. 게다가 Fortune 쪽 문장은 그 자체로 앞뒤가 맞지 않았다 — 「$91 billion … outpacing the average analyst expectation of $103.9 billion」. $91bn 은 $103.9bn 보다 작으므로 그것을 「앞지른다」고 할 수 없다.
문서는 승자를 고르지 않았다. 「어느 쪽이 내부적으로 일관되는지만 기록하고, 가이던스 숫자가 필요한 독자는 회사 제출본을 보라」고 적어 두었다. 그리고 그 회사 제출본이 안 읽힌다는 것도 함께 적어 두었다.
받아 보니 HTTP 200 이었다
그래서 그 제출본을 다시 받아 봤다. HTTP 200. 본문 2,988자. 코드도 정상이고 글자도 있다. 그런데 내용이 이랬다.
“Your Request Originates from an Undeclared Automated Tool”
당신의 요청은 선언되지 않은 자동화 도구에서 온 것이다
본문이 아니라 차단 안내였다. 3,000자쯤 되니 길이로도 걸러지지 않는다. 우리 감사는 「HTTP 200 이고 400자 이상이면 읽은 것」으로 세고 있었으므로, 이 페이지는 「정상적으로 읽혔는데 인용이 없는 출처」로 집계되고 있었다.
해법은 그 안내문 안에 있었다
안내문을 끝까지 읽으면 무엇을 하라는지 적혀 있다.
“Please declare your traffic by updating your user agent to include company specific information.”
사용자 에이전트에 회사 정보를 담아 트래픽을 선언하라
우회하라는 게 아니라 신원을 밝히라는 요구다. 그대로 밝혔다. 없는 연락처를 지어내지는 않았고, 사이트 이름과 실제 주소만 적었다. 요청 빈도 제한(초당 10회)에는 한참 못 미친다.
같은 주소가 22,013자를 돌려줬다. 2,988자에서 22,013자로 바뀐 것이다.
그 안에 답이 있었다
회사가 SEC 에 낸 CFO 코멘터리의 2027 회계연도 3분기 전망 항목이다.
“Revenue is expected to be $108.0 billion, plus or minus 2%. We are not assuming any Data Center compute revenue from China in our outlook.”
CNBC 가 맞았다. 그리고 회사는 「중국 데이터센터 컴퓨트 매출은 전망에 넣지 않았다」는 조건을 같은 문단에 붙여 뒀다 — 숫자만 옮기면 빠지는 부분이다.
문서가 「고르지 않겠다」고 한 판단은 옳았다. 언론 두 곳을 놓고 다수결하거나 그럴듯한 쪽을 고르는 대신, 답이 나올 때까지 비워 뒀기 때문에 지금 1차 출처로 채울 수 있었다. 문서에는 이제 회사 문장을 근거로 답을 적었고, Fortune 의 문장도 지우지 않고 「그렇게 보도됐다」는 기록으로 남겼다.
우리가 한 실수도 하나 적어 둔다
처음 시도에서 우리는 압축 응답을 요청해 놓고 압축을 풀지 않았다. 그래서 받은 것을 그대로 글자로 읽었더니 깨진 바이트가 나왔고, 「본문에 가이던스가 없다」는 잘못된 결론이 잠깐 나왔다. 「받았다」와 「읽었다」는 또 다른 일이다.
같은 계열의 구멍이 하나 더 있었다
이번 점검에서 출처 주소 자체가 PDF 인 경우도 걸렸다. 우리 수집기는 HTML 용이라 PDF 에 0바이트를 돌려주고 있었다. 미국 통계국 주택 지표 문서 두 건이 그랬는데, 인용이 틀린 게 아니라 우리가 그 PDF 를 안 읽고 있었던 것이다. PDF 를 직접 받아 읽게 고치자 전수 점검에서 「못 읽음」이 81건에서 55건으로 줄고, 대조 성공이 590건에서 617건으로 늘었다. 못 읽던 것을 읽게 했더니 대부분 맞는 인용이었다.
규칙으로 남긴 것
하나. 200 이어도 본문에 차단 안내가 들어 있으면 「못 읽음」으로 센다. 「인용이 없다」와 「읽지 못했다」를 같은 칸에 넣지 않는다.
둘. 사이트가 신원을 밝히라고 하면 밝힌다. 그건 우회가 아니라 그 사이트가 정한 이용 방식이다.
셋. 출처가 PDF 면 PDF 로 읽는다. 안내 페이지가 거는 PDF 도 따라간다.
공통점은 하나다. 상태 코드는 「서버가 응답했다」는 뜻이지 「내가 읽었다」는 뜻이 아니다. 그때는 404 가 거짓이었고, 이번에는 200 이 거짓이었다. 어느 쪽이든, 숫자를 쓰기 전에 본문을 봐야 한다.
댓글
댓글 쓰기