418 I’m a teapot 에러

얼마 전 일하느라 MDN 문서를 보다가 오랜만에 418 에러와 관련된 문서를 봤습니다. 이 418 에러는 볼 때마다 포스팅을 한번 해봐야겠다 싶던 참이라 마침 만우절이기도 해서 포스팅을 준비했었습니다. 그 이후로 코로나 등 여러가지 문제 때문에 이제야 글을 올리게 되었습니다. -_-

418 에러는 404 Not found 에러 같이 RFC 표준에도 올라와 있는 표준 http response 코드입니다. 에러 내용은 “I’m a teapot”. 나는 찻 주전자다라는 뜻인데 클라이언트가 서버 쪽에 커피를 따라달라고 했을 때 나오는 에러입니다. 커피를 따라달라고 요청했는데 찻 주전자기 때문에(?) 서버 측에서 커피를 따를 수 없어서 요청을 거부할 때 사용하는 에러입니다.

(안웃긴) 개발자 농담인데 무려 표준 코드로 아직도 살아있는 엄연한 에러 코드입니다. 1998년에 만우절 농담으로 추가되었다고 합니다.

구글에서도 https://www.google.com/teapot 주소로 접속하면 해당 에러를 응답 받을 수 있습니다.

여기까지해서 만우절 농담으로 끝났으면 좋았을건데, 문제는 418 에러가 표준에 들어가고 여러 브라우저도 지원하는 에러 코드인데 의미도 모호해서 여러가지 목적으로 사용된다는겁니다. 대충 418 에러로 검색해봐도 네이버 쇼핑이나 페이스북 등에서 418 에러를 만났는데 이게 무슨 에러냐라고 묻는 글들이 꽤 있습니다. 정의를 찾아봐도 찻 주전자 같은 이상한 이야기나 하고 있으니 이해하기도 어렵죠.

딱 이렇게 쓰인다고 보기는 어렵지만 418 에러는 “찻 주전자로서 커피 따르기를 거부”하는 에러이므로 대부분 서버에서 자동화봇에 대한 서비스를 거절하는 목적으로 많이 사용됩니다. 위에 나온 네이버 쇼핑이나 페이스북 사례들도 크롤링 같은 도구를 사용하다가 차단되는 경우 서버에서 418 에러를 내보내는 것 같습니다.

혹자는 이런 경우 클라이언트의 요청을 서버가 거절한 것이므로 서버 사이드 오류인 503 에러 또는 5xx 에러가 더 맞지 않냐는 주장도 있습니다. 하지만 418 에러는 클라이언트가 해당 서버가 차 주전자임을 알고 있음에도 커피를 따라달라는 “이행할 수 없는 요청”을 했기 때문에 거절된겁니다. 즉 클라이언트 측 오류인거죠.

MDN 문서에 따르면 커피 주전자인데 커피가 없을 경우엔 503 에러를 내보내도록 되어있습니다. 즉 서버가 커피 주전자라서 커피를 따라달라고 요청했으면 503 에러, 서버가 찻 주전자인데 커피를 따라달라고 요청했으면 418 에러가 반환되도록 엄격하게 구분하고 있습니다.

딱 잘라 정의하기 싫은 에러를 규정할 때 418 에러를 쓰기도 하는 것 같지만 대부분 “이행할 수 없는 요청에 대한 거절”을 나타낼 때 사용하는 코드라고 보시면 이해하기 편하실 것 같습니다.

만우절 농담은 만우절로 끝내면 되지 이걸 굳이 웹 표준에 넣어놔서 많은 사람들 고생시키는 미국 Geek들.. 심지어 재미도 없는 농담이었습니다. -_- 혹시라도 일상에서 418 에러를 만났을 때 이 글이 이해에 조금이라도 도움이 되었으면 좋겠습니다.