HTTP status code 실험

요즘 회사에서 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에 맞게 적절하게 대응하는 것으로 보인다. 파이어폭스도 조금 해봤는데 크게 다르지는 않았다.

Advertisements

답글 남기기

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

WordPress.com 로고

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

Twitter 사진

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

Facebook 사진

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

Google+ photo

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

%s에 연결하는 중