본문 바로가기

Coding, Testing, Challenge

API 9개가 404였는데, 서버 로그에는 아무것도 없었습니다

API 9개가 통째로 404

외주 SI 프로젝트에서 특정 화면들만 데이터를 못 불러왔습니다. 404였습니다. 그런데 앱 서버 로그에는 그 요청이 한 줄도 없었습니다.

처음 내린 진단이 틀렸습니다

진단하려고 요청을 가로채는 지점에 로그를 심었습니다. 들어오는 요청을 전부 찍는 곳입니다.

그 화면을 열었는데 아무것도 안 찍혔습니다.

그래서 이렇게 결론냈습니다. "요청 자체가 안 나가는구나. 화면 쪽 문제다."

이게 틀렸습니다.

요청을 가로채는 그 지점은 앱까지 도착한 요청에만 불립니다. 404는 애초에 그 앞에서 끝납니다. 로그가 없다는 건 요청이 안 왔다는 뜻이 아니라, 앱까지 못 왔다는 뜻이었습니다.

브라우저 개발자 도구를 열어 보니 요청은 제대로 나가고 있었습니다. 응답만 404였습니다.

진짜 원인

웹서버가 확장자로 요청을 가로챕니다
앱 서버까지 요청이 도달하지 못합니다

앞단 웹서버 설정에 이런 게 있었습니다.

ext = "html, css, js, png, json"

"이 확장자로 끝나는 요청은 정적 파일이니 내가 직접 처리하겠다"는 뜻입니다. 앱 서버로 넘기지 않습니다.

그런데 우리 API 주소가 이렇게 생겼습니다.

/order/list.json
/member/detail.json
/code/tree.json

웹서버는 이걸 파일로 봤습니다. 디스크에 그런 파일이 없으니 404. 앱은 요청이 왔다는 사실조차 모릅니다.

이런 주소가 9개 있었습니다. 나머지 화면은 멀쩡했으니 "일부만 안 된다"로 보였던 겁니다.

오류 페이지도 404였습니다

404가 나면 오류 안내 페이지로 보내도록 돼 있었습니다.

error_document = "/error.html"

그 파일도 없었습니다. 그래서 404 → 오류 페이지로 이동 → 그것도 404가 됐습니다. 화면에는 아무 설명 없는 기본 오류만 나왔습니다.

안내 문구 하나만 제대로 떴어도 "이건 웹서버가 낸 404구나"를 훨씬 빨리 알았을 겁니다.

고친 것

정적 확장자 목록에서 뺐습니다

ext = "html, css, js, png"

한 낱말 지우고 끝났습니다. 찾는 데 하루, 고치는 데 1분이었습니다.

같은 함정이 전에도 있었습니다

이게 처음이 아니었습니다. 이전에는 다른 확장자 하나가 같은 식으로 요청을 가로채고 있었습니다. 그때 목록에서 하나를 뺐는데, "이건 우리 주소에 없으니 무해하다"고 넘긴 게 남아 있었습니다.

그때 목록 전체를 한 번 훑었어야 했습니다. 걸린 항목만 고치고 나머지를 안 본 게 재발의 원인입니다.

가져갈 것

  • 인터셉터에 안 찍힌다 = 요청이 안 왔다가 아닙니다. 앱까지 못 왔다는 뜻입니다.
  • 404를 만났을 때 누가 낸 404인지부터 가르세요. 앱이 낸 것과 웹서버가 낸 것은 고치는 곳이 다릅니다.
  • API 주소에 확장자를 붙이지 마세요. 앞단 서버가 파일로 오해합니다.
  • 오류 안내 페이지가 실제로 뜨는지 확인하세요. 그게 안 뜨면 진단 시간이 몇 배가 됩니다.
  • 같은 종류의 설정이 목록으로 돼 있으면, 걸린 항목만 고치지 말고 목록 전체를 보세요.

제일 값비쌌던 건 틀린 진단으로 반나절을 화면 쪽에서 보낸 것입니다. 로그가 없다는 사실에서 잘못된 결론을 내렸고, 그 뒤로는 계속 엉뚱한 데를 팠습니다.

증거가 없다는 건 증거가 아닙니다. 왜 없는지를 먼저 물었어야 했습니다.


만든 것들