요즘 회사에서 HTTP 스터디중이다.
HTTP/1.1의 다양한 Status Code들에 대해 공부한 뒤, 실제 웹브라우저가 Status Code에 대해 어떻게 대응하는지 궁금해졌다. 그래서 구글 크롬을 가지고서 테스트 해 보았다.
일단 status code를 원하는대로 만들어서 응답해주는 코드를 간단히 작성했다.
header("HTTP/1.1 ".$_REQUEST['status']." ".$_REQUEST['reason']); if (isset($_REQUEST['body'])) { echo $_REQUEST['body']; }
예를 들어 http://npcode.com/test/http-resonse.php?status=201 이렇게 요청하면 201로 응답해준다.
이걸로 구글크롬을 테스트 해 보았다.
특이한 반응을 보인 Status Code
대부분의 status code에 대해 평이하게 반응했지만 몇가지 특이한 것들이 있었다.
204 No Content 마치 response를 받지 않은 것 처럼 처리되는 것으로 보인다. 크롬 개발자 도구(CTRL+SHIFT+I)로 확인해보면 request만 있고 response는 없는 것으로 나온다. 심지어 주소입력창에 입력한 url도 원래대로 돌려놓는다.
205 Reset Content 204와 똑같이 동작한다. 그런데 205 Reset Content라면 form을 지워줘야 HTTP/1.1 스펙대로가 아닌가 싶은데… 어째선지 전혀 form이 지워지지 않는다.
304 Not Modified 다른 redirect 관련 reponse와는 달리 이 응답만은 에러페이지를 내보낸다. body가 있거나 없거나 무조건 “해당 웹페이지를 찾을 수 없습니다.” 페이지.
4xx의 경우는 보통 body를 그대로 출력하지만, 예외인 status code가 딱 3개 있다.
403 Forbidden body가 있으면 body 출력, 없으면 “웹페이지 억세스가 거부되었습니다” 에러 페이지
404 Not Found body가 있거나 없거나 “죄송합니다. 링크가 깨진 것 같습니다” 에러 페이지
407 Proxy Authentication Required body가 있거나 없거나 “해당 웹페이지를 사용할 수 없습니다” 에러페이지
5xx의 경우엔 body가 있으면 body 출력, 없으면 “서버 오류” 에러 페이지를 보여준다. 에러 세부내용은 각 status code에 맞게 나타난다.
RFC 2616(HTTP/1.1)에는 없지만 크롬이 이해하는 Status Code
reason pharse를 빼놓고 보낸 경우에도, 개발자도구로 응답 헤더를 들여다보면 reason pharse가 채워져있다. 기본적으로 HTTP/1.1 스펙에 나온대로 채워주고, 스펙에 없는 몇몇에 대해서도 아래와 같이 몇몇 채워넣는 것들이 있다.
- 418~421 unused
- 422 Unprocessable Entity
- 423 Locked
- 424 Failed Dependency
- 425 No code
- 426 Upgrade Required
- 506 Variant Also Negotiates
- 507 Insufficient Storage
- 508, 509 unused
- 510 Not Extended
418이 I’m a teapot이었으면 조금 재미있었을지도… (RFC2324) 근데 생각해보니 scheme을 coffee가 아닌 http로 해서 요청했으니 될 리가 없겠구나.
정의되지 않은 Status Code에 대한 크롬의 대응
기타 정의되지 않은 status code로 응답한 경우엔, reason pharse와 body 유무에 따라 다음과 같이 동작한다.
- reason pharse가 없는 경우 => 500 Internel server error
- body가 없으면 브라우저 자체 에러 페이지 “웹사이트에서 오류가 발생했습니다” 출력
- body가 있으면 body 출력
- reason pharse가 있는 경우 => 응답한 status code를 그대로 사용
결론
HTTP response의 status code에 대한구글크롬의 반응은, 뭔가 일관성이 있기 보다는 그냥 각 status code에 맞게 적절하게 대응하는 것으로 보인다. 파이어폭스도 조금 해봤는데 크게 다르지는 않았다.