[Book - 그림으로 배우는 Http & Network Basic] 4. 결과를 전달하는 HTTP 상태코드
상태 코드는 서버로부터 Request 결과를 전달
상태 코드의 역할: Client가 Server를 향해 Request를 보낼 때 Server에서 그 결과가 어떻게 되었는지 알려줌으로써 Server가 Request를 정상적으로 처리했는지, Request 결과가 에러였는지를 알 수 있다.
상태 코드 클래스
클래스 설명 1xx Informational Request를 받아들여 처리중 2xx Success Request를 정상적으로 처리했음 3xx Redirection Request를 완료하기 위해서 추가 동작이 필요 4xx Client Error Server는 Request 이해 불가능 5xx Server Error Server는 Reqeust 처리 실패
상태 코드의 첫 번째 자리는 Response의 클래스를 의미하고, 나머지 2자리는 분류가 없다.
Success: 2xx
2xx Response: Request가 정상으로 처리되었음
Client가 보낸 Reequest를 Server가 정상 처리했음을 나타낸다.
No Content: 204
이 Response는 Server가 Request를 받아서 처리하는 데는 성공했지만 Response Entity Body를 포함하지 않는다. 또한, 어떠한 Entity Body를 되돌려 보내서도 안된다.
예를 들어 브라우저에서 Request를 보낸 후 204 Response를 수신했어도 표시되어 있는 화면이 변하는 일은 없다.
이 Response는 Client에서 Server에 정보를 보내는 것으로 족하고, Client에 대해서 새로운 정보를 보낼 필요가 없는 경우에 사용된다.
Partial Content: 206
이 Response는 Rangedp에 의해서 범위가 지정된 Request에 의해서 Server가 부분적 GET Request를 받았음을 나타낸다.
Response에는 Content-Range로 지정된 범위의 Entity가 포함되게 된다.
Redirection: 3xx
3xx Response: Request가 정상적으로 처리를 종료하기 위해 브라우저 측에서 특별한 처리를 수행해야 함을 나타낸다.
Moved Permanently: 301
이 Response는 Request된 리소스에는 새로운 URI가 부여되어 있기 때문에 이후로는 그 리소스를 참조하는 URI를 사용해야 한다는 것을 나타낸다.
북마크하고 있는 경우에는 Location 헤더 필드에서 가리키고 있는 URI에 북마크를 다시 하는 것이 좋다는 것을 나타낸다.
이 Response는 ‘http://example.com/sample’라는 Request와 같이 디렉토리를 지정했을 때에 마지막 부분에 ‘/’를 붙이는 것을 잊은 경우 등이 있다.
Found: 302
이 Response는 Request된 리소스에는 새로운 URI가 할당되어 있기 때문에 그 URI를 참조해 주길 바란다는 의미를 나타낸다.
301 (Moved Permanently)와 비슷하지만 302의 경우에는 영구적인 이동이 아닌 일시적인 것이다.
북마크하고 있는 경우에는 301의 경우와 같이 북마크를 변경하지 않고, 계속해서 302를 돌려준 페이지에 대해서 북마크해야 한다.
See Other: 303
이 Response는 Request에 대한 리소스는 다른 URI에 있기 때문에 GET 메소드를 사용해서 얻어야 한다는 것을 나타낸다.
302 (Found)와 같은 기능이지만, Redirect 장소를 GET 메소드를 얻어야 한다고 명확하게 되어 있는 점이 302와 다르다.
예를 들어 POST 메소드로 액세스한 CGI 프로그램을 실행한 후에 처리 결과를 별도의 URI에 GET 메소드로 Redirect 시키고 싶은 경우 등에 303이 사용되고 있다. 302 (Found) 라도 같은 작업이 가능하지만, 303을 사용하는 것이 바람직하다.
301, 302, 303 Response 코드가 되돌아 오면, 대부분의 브라우저에서는 POST를 GET으로 바꿔서 Request의 Entity Body를 삭제하고 Request를 자동적으로 재송신하도록 되어 있다.
301, 302의 사양은 POST 메소드를 GET 메소드에 바꾸는 것을 금지하고 있지만, 구현해 놓은 것 을 보면 이렇게 되어 있는 것이 대부분이다.
Not Modified: 304
이 Response는 Client가 조건부 Request를 했을 때 리소스에 대한 액세스는 허락하지만, 조건이 충족되지 않음을 표시한다.
304를 되돌려 줄 경우에는 Response Body에 어떤 것도 포함되어 있어서는 안된다.
304는 3xx에 분류되어 있지만 Redirect와는 관계가 없다.
Temporary Redirect: 307
이 Response는 302 (Found)와 같은 의미를 지니지만, 302의 경우에는 POST로부터 GET으로 치환이 금지되어 있는데도 불구하고 구현상 그와 같이 되어 있지 않다.
307에서는 브라우저 사양에 따라 POST에서 GET으로 치환을 하지 않는다. 단지, 브라우저마다 Response를 처리하는 동작이 다를 경우가 있다.
Client Error: 4xx
4xx Response: Client의 원인으로 에러가 발생했음을 나타낸다.
Bad Request: 400
이 Response는 Request 구문이 잘못되었음을 나타내고 있다.
이 에러가 발생한 경우, Request 내용을 재검토하고 나서 재송신할 필요가 있다.
또한, 브라우저는 이 Response를 200 OK와 같이 취급한다.
Unauthorized: 401
이 Response는 송신한 Request에 HTTP 인증(BASIC 인증, DIGEST 인증) 정보가 필요하다는 것을 나타내고 있다. 또한, 이미 1번 Request가 이루어진 경우에는 유저 인증에 실패했음을 표시한다.
401을 포함한 Response를 되돌리는 경우에는 Request된 리소스에 적용되는 challenge를 포함한 WWW-Authenticate 헤더 필드를 포함할 필요가 있다.
브라우저에서 처음 401 Response를 받은 경우에는 인증을 위한 다이얼로그가 표시된다.
Forbidden: 403
이 Response는 Request된 리소스의 액세스가 거부되었음을 나타낸다.
403이 발생한 원인 예시
- 파일 시스템의 퍼미션이 부여되지 않은 경우
- 액세스 권한에 문제(허가되지 않은 송신 IP 주소의 액세스 등)
Not Found: 404
이 Response는 Request한 리소스가 서버상에 없다는 것은 나타낸다.
Server 측에 해당 Request를 거부하고 싶은 이유를 분명히 하고 싶지 않은 경우에도 이용할 수 있다.
Server Error: 5xx
5xx Response: Server 원인으로 에러가 발생하고 있음을 나타낸다.
Internal Server Error: 500
이 Response는 Server에서 Request를 처리하는 도중에 에러가 발생했음을 나타낸다.
웹 애플리케이션에 에러가 발생한 경우나 일시적인 경우도 있다.
Service Unavaliable: 503
이 Response는 일시적으로 서버가 과부하 상태이거나, 점검중이기 때문에 현재 Request를 처리할 수 없음을 나타낸다.
이 상태가 해소되기까지 시간이 걸리는 경우에는 Retry-After 헤더 필드에 따라 Client에 전달하는 것이 바람직하다.
상태 코드가 현재 상황과 불일치할 수 도 있다.
Response로 되돌아오는 상태 코드의 대부분은 유저가 다른 내용을 알기 어렵게 되어 있다.
흔히 있는 상황으로 웹 애플리케이션에서 애플리케이션 에러가 발생한 경우에도 상태 코드로는 [200 OK]가 되돌아오는 경우가 있다.