HTTP 418 에러의 의미를 아시나요? I'm a teapot!


HTTP 응답에는 상태 코드라는 개념이 있습니다. 상태 코드는 웹 서버에서 응답을 내려줄 때, 요청에 대한 처리 결과를 간결하게 알려주기 위해 사용되죠. 대표적인 상태 코드로 200 OK, 404 Not Found, 500 Internal Server Error 등이 있습니다.

그런데, HTTP 상태 코드의 목록을 자세히 들여다보면 이런 생소한 코드도 존재한답니다.


https://developer.mozilla.org/ko/docs/Web/HTTP/Status

418 I'm a teapot
서버는 커피를 찻 주전자에 끓이는 것을 거절합니다.

생뚱맞게 찻 주전자가 왜 나오죠..? 누가 커피를 끓여달라고 한 거죠? 모질라 도큐먼트에 있는 내용치고는 파격적입니다. 귀엽기도 하고요. 어쩌다 이런 스펙이 생겼을지 궁금하지 않으신가요?


국제 인터넷 표준화 기구(Internet Engineering Task Force, IETF)는 말 그대로 전 세계에서 통용되는 인터넷에 대한 표준, 명세를 정의하는 단체입니다.

이 IETF에는 매년 만우절에 장난스러운 RFC를 출판하고 있습니다. RFC란 RFC 메모라고도 하는데요, 새로운 인터넷 기술이나 연구의 결과물을 담고 있는 일종의 웹 출판물이라고 보시면 됩니다. 국제 웹 표준과 밀접한 관련이 있는 공신력 있는 문서입니다. 장난으로 기술문서를 배포하다니, 일종의 '재능 낭비'라고 할까요.

418 I'm a teapot은, 1998년 만우절에 IETF에서 출판한 RFC2324의 내용의 일부입니다. 이제 이 RFC의 내용을 살펴보겠습니다.

#커피 주전자용 프로토콜, HTCPCP

RFC2324의 주제는 바로 커피 주전자용 프로토콜, HTCPCP 입니다.

직역하자면 하이퍼텍스트 커피포트 제어 프로토콜이라고 할 수 있겠네요. 커피를 제공받고자 하는 클라이언트와 커피 서버(=커피포트 서버, 커피포트) 사이의 통신에 사용됩니다. HTTP 프로토콜 기반으로 만들어졌습니다. 즉, HTTP 위에 추가로 새로운 메소드, 헤더, 상태 코드 등을 정의 한 형태입니다. URI 스킴으로 coffee:를 사용합니다.

#HTCPCP 메소드

메소드 설명
BREW 커피포트를 조종하기 위한 코멘드를 서버에게 전달하는 데에 쓰입니다. 즉 커피를 끓일 수 있습니다. 커피포트는 불(fire) 없이 전기로 물을 데우기 때문에, 방화벽(firewall)에 대한 옵션은 포함할 필요가 없습니다. POST 메소드로도 동일한 동작을 지원하나, depretacted 되었습니다.
GET URI에 해당하는 자원을 리턴합니다. 즉 서버가 커피를 서빙합니다.
PROPFIND 커피의 메타데이터를 조회합니다.
WHEN 커피를 끓인 후 우유를 넣을 때, 멈춰야 하는 타이밍을 서버에게 알립니다. (Enough? Say WHEN.)

#HTCPCP 헤더

HTTP 요청에는 클라이언트가 처리할 수 있는 응답 타입을 표시하기 위해 Accept 헤더가 사용되는데요. 예를 들어 HTTP 요청을 Accept: text/html 헤더와 함께 보낸다면 클라이언트는 그 응답으로 HTML 도큐먼트를 기대할 겁니다.

HTCPCP로는 커피를 주문할 때는, (즉 BREW 요청을 보낼 때는) 여러 가지 부가적인 요구 사항을 같이 전달하는데요. Accept 헤더 하나만으로는 커피에 필요한 다양한 요구 사항을 다 담을 수가 없어서 Accept-Additions라는 헤더 필드를 사용합니다.

커피에 추가로 원하는 우유 타입 (Cream, Half-and-half, Whole-milke), 시럽 타입(Vanilla, Chocolate), 알코올 타입(Whisky, Rum, Kahlua) 등을 지정할 수 있습니다. 예를 들어 Accept-Additions: Whole-milk;10,Vanilla;2 이라고 요청하면 바닐라 라떼가 만들어질 것 같네요!

#HTCPCP 상태 코드

상태 코드 설명
406 Not Acceptable 요청을 수행할 수 없을 때의 에러 코드입니다. 대표적인 예시로는 요청 헤더 Accept-Additions에 명시된 요구사항을 만족할 수 없는 경우입니다. 예를 들어 바닐라 시럽이 다 떨어졌을 수 있겠네요.
418 I'm a teapot 찻주전자가 커피를 끓여달라는 요청을 받았을 때의 에러 코드입니다. 이 경우 응답의 body는 짧고 통통(short and stout)할 수 있습니다.

#같이 보면 좋은 내용