HTTP 응답은 항상 다음과 같은 Status-Line 으로 시작한다.
HTTP/1.1 200 OK
왼쪽부터 순서대로 HTTP-Version, Status-Code, Reason-Phrase가 온다.
그런데 만약 응답을 해줘야 하는 HTTP 서버가, 적절한 이유구문을 결정하지 못해 Reason-Phrase 없이 응답을 보내려면 어떻게 해야 할까?
그냥 “HTTP/1.1 200” 로 보내면 될 것 같지만, 정답은 “HTTP/1.1 200 “이다. 끝에 공백문자를 하나 넣어줘야 한다.
이유가 뭘까? RFC 2616에 정의되어 있는 Status-Line의 문법을 보자.
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
흠. 반드시 Reason-Phrase를 넣게 되어있다. 그럼 Reason-Phrase는 어떻게 정의되어 있을까?
Reason-Phrase = *<TEXT, excluding CR, LF>
Reason-Phrase는 CR이나 LF를 제외한 문자로 된 0자 이상의 문자열이다. “0자 이상” 이기 때문에 당연히 빈 문자열도 문제없다. 따라서 “HTTP/1.1 200 “과 같은 Status-Line은 문법상 틀리지 않다. 그러나 “HTTP/1.1 200″은 틀렸다. Status-Code 200 뒤에 공백(SP)가 빠졌기 때문이다.
이렇게 되어버린 것은 사실 실수라고 한다. Reason-Phrase를 생략하고 싶은 경우엔 “HTTP/1.1 200” 식으로 응답할 수 있게 했어야 했다. 하지만 이제와서 되돌릴 순 없으니 앞으로도 계속 이렇게 사용할 것이다. HTTP/2.0이 나와도 계속.