"HTTP/1.1 200" 은 틀리고 "HTTP/1.1 200 " 은 맞는 이유

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이 나와도 계속.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중