03-http status code
Http 응답 메시지의 상태코드는 크게 다섯가지로 나뉩니다. 상태코드는 세자리 숫자로 100~599 번 까지 정해져 있으며 각각의 의미가 존재합니다. 자주 사용되는 코드 및 설명은 아래와 같습니다.
100 information response
정보성 상태코드로 초기에는 존재하지 않았으나, http/1.1 에서 도입되었습니다. 요청이 정상적으로 수신되었음을 의미하며 프로세스를 계속해서 진행하도록 합니다.
100-Continue
요청의 시작 부분 일부가 받아들여졌으며, 클라이언트는 나머지를 계속 이어서 보내야 함을 의미합니다.
101- Switching protocol
서버가 프로토콜을 변경했음을 의미합니다. 101
번의 경우 websocket 통신시 사용되는 경우가 있습니다. 일반적으로 websocket통신시 최초 커넥션을 맺을때 http로 통신하고 연결된 후 websocket으로 변경하게 됩니다. 이때 메시지를 교환하면서 101
으로 응답받는 것을 확인할 수 있습니다.
200-299 success
클라이언트가 보낸 요청이 정상적으로 수신 및 처리되었음을 의미합니다. 요청 메서드 또는 파리미터별 응답코드가 일부 다르게 표현될 수 있습니다.
200-OK
요청이 정상적으로 처리됨을 의미합니다. 가장 일반적인 형태로 204
코드와는 달리 엔터티 본문은 요청된 리소스를 포함합니다.
201-Created
서버에 객체가 정상적으로 생성되었음을 의미함니다.
202-Accepted
클라이언트의 요청이 정상적으로 수신 되었지만, 처리가 완료되지 않았을 의미합니다. 배치 작업등을 표현하기 위해 만들어졌으며 비동기 작업일때 표현하기 용이합니다.
204-No content
헤더와 상태줄을 포함하지만 엔터니 본문은 포함하지 않습니다. Rest API에서 post
, put
, delete
등의 메서드가 성공시 해당 코드를 내려주는게 적절한 응답이 될 수 있습니다.
300-399 Redirection
리다이렉션 상태코드는 클라이언트 요청에 대해 다른 URL을 호출하도록 지시합니다. 때때로 구글과 같은 검색 엔진의 봇들은 3xx 번대 코드를 해석하여 페이지 정보를 갱신하기도 합니다. SEO 관점에서도 3xx번대 코드를 잘 사용하는것은 중요합니다.
301-Moved Permanently
요청된 리소스가 영구적으로 이동되었음을 의미합니다. 변경된 URL을 Location
헤더에 표기합니다. https 프로토콜을 사용하는 서버의 경우 80
포트롤 접속한 http 요청을 443
으로 리다이렉트 할때 사용하기도 합니다.
서버응답 예시
HTTP/1.1 301 Moved Permanently
Location: http://hahava.github.io
302-Found
요청된 리소스가 임시적으로 이동되었음을 의미합니다. 변경된 URL을 Location
헤더에 표기합니다. 이후에는 원래 URL을 사용해야 합니다.
304-Not modified
서버는 클라이언트가 요청한 리소스가 이전 요청과 비교하여 전혀 변경되지 않았음을 의미합니다. 304
로 응답받은 클라이언트는 기존에 캐싱된 엔터티를 사용할 수 있습니다.
클라이언트가 최초 응답시 서버는 etag
를 헤더에 삽입합니다. etag
는 리소스 변경 여부를 확인하는 역할을 답당하며 해시 값으로 되어있습니다. 이후 클라이언트는 해당 값을 If-Modified-Since
또는 If-None-Match
를 헤더에 삽입하여 변경 여부를 확인합니다.
최초 요청
GET /hahava HTTP/1.1
Accept: text/html
최초 응답
HTTP/1.1 200 Ok
Content-Type: text/html
ETag: "abcdefg"
이후 요청
GET /hahava HTTP/1.1
Accept: text/html
If-None-Match: "abcdefg"
캐싱되어 있는 경우 응답
HTTP/1.1 304 Not Modified
ETag: "abcdefg"
307 Temporary Redirect
리소스가 임시적으로 변경되었음을 의미하며, 헤더에 location
으로 표현합니다.
308 Permanent Redirect
리소스가 영구적으로 변경되었음을 의미하며, 헤더에 location
으로 표현합니다.
301
과302
를 처음 계획했을때 URL 변경 여부를 확인하기 위해 만들어졌습니다. 따라서 모든 요청에 대한 method는GET
로 변경해서 요청하게 됩니다.post
등 다른 메서드를 사용하기 위해서는 반드시307
또는308
상태코드를 사용합니다.
400-499 client errors
클라이언트가 서버에 요청시 서버는 요청을 수신했으나 정상적인 요청이 아닐 경우를 의미합니다.
400-Bad Request
클라이언트의 잘못된 요청 또는 문법등으로 인해 발생합니다.
401-Unauthorized
클라이언트가 리소스를 요청시 인증되지 않았음을 의미합니다. 해당 코드 반환시 헤더에 인증값을 추가하여 요청해야 합니다.
403-Forbidden
요청이 서버에 의해 거부되었음을 의미합니다. 주로 거절의 이유를 숨기고 싶을때 사용합니다.
401
과403
은 인증과 관련된 부분에서 비슷하게 사용될 수 있습니다. 가장 큰 차이점으로401
의 경우 인증자체가 안된경우를 표현할 수 있으며,403
의 경우 인증 관련 값은 존재하나 해당 인증에 대한 접근 권한이 없는 경우를 표현할 수 있습니다.
404-Not Found
클라이언트가 요청한 URL을 찾을 수 없는 경우를 의미합니다.
405-Method Not Allowed
클라이언트가 요청한 URL에서 해당 메서드를 지원하지 않을 경우를 의미합니다. 해당 코드로 응답을 반환시 헤더에 Allow
으로 지원하는 메서드를 표현합니다.
Google post 요청시
POST google.com HTTP/1.1
반환 내용
HTTP/1.1 405 Method Not Allowed
...
Allow: GET, HEAD
...
500-599 Server Error
클라이언트가 정상적인 요청을 보냈음에도 때떄로 서버 자체의 문제로 요청을 처리하지 못하는 경우가 발생하기도 합니다.
500-Internal Server Error
서버가 요청을 처리할 수 없게 만드는 에러를 만났을 때 사용합니다. 일반적으로 WAS(Web Application Server)
를 사용할경우 내부에서 발생하는 에러는 대부분 500으로 표현됩니다.
501-Not Implemented
서버가 지원하지 않는 기능이나 아직 구현되지 않는 기능을 요청할 때를 의미합니다. 만약, 차후 지원 예정이라면 Retry-After
를 헤더에 추가하여 날짜 또는 초를 표현합니다.
HTTP/1.1 501 Not Implemented
Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Retry-After: 120
503-Service Unavailable
서버가 요청을 처리할 준비가되지 않았음을 의미합니다. 일반적으로 서버가 다운됐거나 과부하 상태인 경우입니다. 503
을 반환할 경우 해당 응답이 캐시되지 않도록 주의해야 합니다.
댓글남기기