1. 정의
Client 와 Server 간에는 HTTP Request(Client 의 요청) / HTTP Response (Server 의 응답) 가 이루어진다.
→ 서버가 응답을 보낼 때(HTTP Response), start-line 에 있는 응답코드(상태코드)도 같이 보내진다.
헤더
Content type: text/html
Content type: application/json
본문
<!DOCTYPE html>
<html>
<head><title>By @ResponseBody</title></head>
<body>Hello, Spring 정적 웹 페이지!!</body>
</html>
{
"name":"홍길동",
"age": 20
}
2. 1XX ~ 5XX
- 3자리 숫자로 구성
- 첫번째 자리는 1에서 5까지
- 첫번째 자리가 4와 5인 경우 : 정상적인 상황이 아니기 때문에, 사이트 관리자가 즉시 알아야 하는 정보!
"서버가 요청을 받았으며, 서버에 연결된 클라이언트는 작업(프로세스)을 계속 진행하라."
100 Continue
- "진행 중"
- "현재까지의 진행상태에 문제 X, 클라이언트의 계속된 요청 or 이미 요청 완료한 경우에는 무시해도 O."
101 Switching Protocol
- "클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 들어가며, 서버에서 프로토콜을 변경할 것이다."
- 해당 코드는 Websocket 프로토콜 전환 시에 사용된다.
102 Processing(WebDAV)
"서버가 요청을 수신하여 처리 중에 있지만, 아직 제대로 된 응답을 알려줄 수 없다."
2XX : 성공, Successful responses
"요청을 성공적으로 받았으며 인식했고 수용한다."
200 OK
"성공적으로 요청되었으므로, 정보는 요청에 따른 응답으로 반환된다."
201 Created
- "성공적으로 요청되었고, 그 결과로 새로운 리소스가 생성되었다."
- 이 응답은 일반적으로 POST 요청 or 일부 PUT 요청 이후에 따라온다.
202 Accepted
- "요청을 수신했지만, 그에 응하여 행동할 수 없다."
- 이 응답은 요청 처리에 대한 결과를
이후에 HTTP로 비동기 응답을 보내는 것에 대해서 명확하게 명시하지 X
- 다른 프로세스에서 처리 or 서버가 요청을 다루고 있거나 or 배치 프로세스를 하고 있는 경우를 위해 만들졌다.
- "돌려받은 메타 정보 세트가 오리진 서버의 것과 일치하지 않지만,
로컬이나 서드 파티 복사본에서 모아졌다."
- 이러한 조건에서는
이 응답이 아니라 200 OK 응답을 반드시 우선된다.
204 No Content
- "요청에 대해서 보내줄 수 있는 콘텐츠가 없지만, 헤더는 의미있을 수 있다."
- 사용자-에이전트는 리소스가 캐시된 헤더를 새로운 것으로 업데이트 할 수 있다.
205 Reset Content
- 요청을 완수한 후, 사용자 에이전트에게 이 요청을 보낸 문서 뷰를 리셋하라고 알려준다.
206 Partial Content
- 클라이언트에서 복수의 스트림을 분할 다운로드를 하고자 범위 헤더를 전송했기 때문에 사용된다.
- 클라이언트가 이어받기를 시도하면,
웹서버가 이에 대한 응답코드로 '206 Partial Content'와 함께 Range 헤더에 명시된 데이터의 부분(byte)부터 전송을 시작
207 Multi-Status
- "여러 리소스가 여러 상태 코드인 상황이 적절한 경우, 해당되는 정보를 전달한다."
- 해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 사용
208 Already Reported
- Prostat (property + status 합성어) 응답 속성
- 동일 컬렉션으로 바인드된 복수의 내부 멤버를 반복적으로 열거하는 것을 피하기 위해 사용
- 해당 코드는 WebDAV(Web Distributed Authoring and Vesioning)에 사용
226 IM Used ( HTTP Delta encoding )
"서버가 GET 요청에 대한 리소스의 의무를 다 했고, 응답이 하나 또는 그 이상의 인스턴스 조작이 현재 인스턴스에 적용이 되었다."
3XX : 리다이렉션, Redirection messages
"요청 완료를 위해, 추가 작업 조치가 필요하다."
300 Multiple Choice
- "요청에 대해서 하나 이상의 응답이 가능하다."
- 사용자 에언트 또는 사용자는 그중에 하나를 반드시 선택해야 한다.
(응답 중 하나를 선택하는 방법에 대한 표준화 된 방법은 존재X_
301 Moved Permanently
- "요청한 리소스의 URI가 변경되었다."
- 새로운 URI가 응답에서 아마도 주어질 수 있다.
302 Found
- "요청한 리소스의 URI가 일시적으로 변경되었다."
- 새롭게 변경된 URI는 나중에 만들어질 수 있으므로,
클라이언트는 향후의 요청도 반드시 동일한 URI로 해야한다.
303 See Other
클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답
304 Not Modified
- 캐시를 목적으로 사용
- 클라이언트에게 응답이 수정되지 않았음을 알려주므로,
클라이언트는 계속해서 응답의 캐시된 버전을 사용할 수 있다.
305 Use Proxy
- "이전 버전의 HTTP 기술 사양에서 정의되었으며, 요청한 응답은 반드시 프록시를 통해서 접속해야 한다."
- 프록시의 in-band 설정에 대한 보안상의 걱정으로 인하여 사용↓
306 Unused
이 응답 코드는 더이상 사용되지 않으며, 현재는 추후 사용을 위해 예약되어 있다.
307 Temporary Redirect
- "클라이언트가 요청한 리소스가 다른 URI에 있으며,
이전 요청과 동일한 메소드를 사용하여 요청해야 할 때, 서버가 클라이언트에 이 응답을 직접 보낸다."
→ 공통점: 302 Found HTTP 응답 코드와 동일한 의미
→ 차이점: 사용자 에이전트가 반드시 사용된 HTTP 메소드를 변경하지 말아야 하는 점
(즉, 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야한다.)
308 Permanent Redirect
- "리소스가 이제 HTTP 응답 헤더의 Location: 에 명시된 영구히 다른 URI에 위치하고 있다."
→ 공통점: 301 Moved Permanently HTTP 응답 코드와 동일한 의미
→ 차이점: 사용자 에이전트가 반드시 HTTP 메소드를 변경하지 말아야 하는 점
(즉, 첫 요청에 POST가 사용되었다면, 두번째 요청도 반드시 POST를 사용해야 한다.)
4XX : 클라이언트 오류, Client error responses
"요청의 문법이 잘못되었거나 요청을 처리할 수 없다."
400 Bad Request
"잘못된 문법으로 인하여, 서버가 요청하여 이해할 수 없다."
401 Unauthorized
- 비록 HTTP 표준에서는 '미승인(unauthorized)'를 명확히 하고 있지만, 의미상 이 응답은 '비인증(unauthenticated)'를 의미
- 클라이언트는 요청한 응답을 받기 위해서는 스스로를 인증해야 한다.
402 Payment Required
- 이 코드는 나중에 사용될 것을 대비해 예약되었다.
- 첫 목표로는 디지털 결제 시스템에 사용하기 위하여 만들어졌지만 지금 사용되고 있지는 않다.
#### 403 Forbidden
- "클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않다."
→ 차이점 : 401과 다른 점은 서버가 클라이언트가 누구인지 알고 있다.
- 예시: 클라이언트는 미승인이므로, 서버는 거절을 위한 적절한 응답을 보낸다.
404 Not Found
- "서버는 요청받은 리소스를 찾을 수 없다."
= 브라우저에서는 알려지지 않은 URL을 의미
= API 에서 종점은 적절하지만, 리소스 자체는 존재하지 않음을 의미할 수 있다.
- 서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여,
이 응답을 403 대신에 전송할 수도 있다.
- 이 응답 코드는 웹에서 반복적으로 발생
405 Method Not Allowed
- "요청한 메소드는 서버에서 알고 있지만, 제거되었고 사용할 수 없다." - 예시: 어떤 API에서 리소스를 삭제하는 것을 금지할 경우,
필수적인 메소드인 GET과 HEAD는 제거될 수 없으며, 이 에러 코드를 리턴할 수 없다.
406 Not Acceptable
- 서버가 서버 주도 콘텐츠 협상을 수행한 후,
사용자 에이전트에서 정해준 규격에 따른 어떠한 콘텐츠도 찾지 않았을 때, 웹서버가 보낸다.
407 Proxy Authentication Required
- 401과 비슷하지만, 프록시에 의해 완료된 인증이 필요
408 Request Timeout
- "서버가 사용되지 않는 연결을 끊고 싶어한다."
- 이 응답은 요청을 한 지 시간이 오래된 연결에 일부 서버가 전송
- 어떤 때에는 이전에 클라이언트로부터 어떠한 요청이 없었다고 하더라도 보내지기도 한다.
- 웹(Chrome, Firefox 27+, IE 9 같은)서핑 속도를 올리기 위해
HTTP 사전 연결 메카니즘을 사용하는 브라우저들이 해당
- 일부 서버는 이 메시지를 보내지 않고 연결을 끊어버리기도 한다.
409 Conflict
"요청이 현재 서버의 상태와 충돌된다."
410 Gone
- "요청한 콘텐츠가 서버에서 영구적으로 삭제되었으며, 전달해 줄 수 있는 주소 역시 존재하지 않는다."
411 Length Required
- 서버에서 필요로 하는 Content-Length 헤더 필드가 정의되지 않은 요청이 들어왔기 때문에, 서버가 요청을 거절한다.
412 Precondition Failed
"클라이언트의 헤더에 있는 전제조건은 서버의 전제조건에 적절하지 않다."
413 Payload Too Large
"요청 엔티티는 서버에서 정의한 한계보다 크므로, 서버는 연결을 끊거나 혹은 Retry-After 헤더 필드로 돌려보낼 것이다."
414 URI Too Long
"클라이언트가 요청한 URI는 서버에서 처리하지 않기로 한 길이보다 길다."
"요청한 미디어 포맷은 서버에서 지원하지 않으므로, 서버는 해당 요청을 거절할 것이다."
416 Requested Range Not Satisfiable
- "Range 헤더 필드에 요청한 지정 범위를 만족시킬 수 없다."
- 범위가 타겟 URI 데이터의 크기를 벗어났을 가능성이 있다.
417 Expectation Failed
"Expect 요청 헤더 필드로 요청한 예상이 서버에서는 적당하지 않다."
418 I'm a teapot
"서버는 커피를 찻 주전자에 끓이는 것을 거절한다."
421 Misdirected Request
- "서버로 유도된 요청은 응답을 생성할 수 없다."
- 이것은 서버에서 요청 URI와 연결된 스킴과 권한을 구성하여 응답을 생성할 수 없을 때 보내집니다.
422 Unprocessable Entity (WebDAV)
"요청은 잘 만들어졌지만, 문법 오류로 인하여 따를 수 없다."
423 Locked (WebDAV)
"리소스는 접근하는 것이 잠겨있다."
424 Failed Dependency (WebDAV)
"이전 요청이 실패하였기 때문에 지금의 요청도 실패했다."
426 Upgrade Required
- "서버는 지금의 프로토콜을 사용하여 요청을 처리하는 것을 거절하였지만, 클라이언트가 다른 프로토콜로 업그레이드를 하면 처리를 할지도 모른다."
- 서버는 Upgrade 헤더와 필요로 하는 프로토콜을 알려주기 위해, 426 응답에 보낸다.
428 Precondition Required
- "오리진 서버는 요청이 조건적이어야 한다."
- 클라이언트가 리소스를 GET해서, 수정하고, PUT으로 서버에 돌려놓는 동안
서드파티가 서버의 상태를 수정하여 발생하는 충돌인 '업데이트 상실'을 예방하기 위한 목적
429 Too Many Requests
"사용자가 지정된 시간에 너무 많은 요청을 보냈다("rate limiting")."
- "요청한 헤더 필드가 너무 크기 때문에 서버는 요청을 처리하지 않을 것이다."
- 요청은 크기를 줄인 다음에 다시 전송해야 한다.
451 Unavailable For Legal Reasons
"사용자가 요청한 것은 정부에 의해 검열된 웹페이지와 같은 불법적인 리소스다."
5XX : 서버 오류, Server error responses
"서버가 명백히 유효한 요청에 대한 충족을 실패했다."
500 Internal Server Error
"웹 사이트 서버에 문제가 있지만, 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없다."
501 Not Implemented
"서버가 요청을 이행하는 데 필요한 기능을 지원하지 않는다."
502 Bad Gateway
- "서버가 게이트웨이로부터 잘못된 응답을 수신했다."
- 인터넷상의 서버가 다른 서버로부터 유효하지 않은 응답을 받은 경우 발생
503 Service Unavailable
- "서버가 요청을 처리할 준비가 되지 않았다."
- 일반적인 원인: 유지보수를 위해 작동이 중단되거나 과부하가 걸린 서버
- 주의점
- 이 응답과 함께 문제를 설명하는 사용자 친화적인 페이지가 전송되어야 한다.
- 임시 조건에 사용되어야 한
- Retry-After: HTTP 헤더는 가능하면 서비스를 복구하기 전 예상 시간을 포함해야 한다.
- 웹마스터는 이러한 일시적인 조건 응답을 캐시하지 않아야 하므로,
이 응답과 함께 전송되는 캐싱 관련 헤더에 대해서도 주의해야 한다.
504 Gateway Timeout
- "웹페이지를 로드하거나 브라우저에서 다른 요청을 채우려는 동안
한 서버가 액세스하고 있는 다른 서버에서 적시에 응답을 받지 못했다."
- 서버가 게이트웨이 역할을 하고 있으며, 적시에 응답을 받을 수 없을 경우
- 원인: 대게 인터넷상의 서버 간의 네트워크 오류 or 실제 서버의 문제
(컴퓨터, 장치 또는 인터넷 연결에 문제가 아닐 수 있다.)
505 HTTP Version Not Supported
- "서버에서 지원되지 않는 HTTP 버전을 클라이언트가 요청했다."
- 웹 브라우저에서 이 오류가 표시되는 경우 웹 서버 소프트웨어에서 지원하는 HTTP 버전을 확인해봐야 한다.
(대부분의 웹 브라우저는 웹 서버가 1.x 버전의 HTTP 프로토콜을 지원한다고 가정하는데, 실제로 1.0 이하의 매우 오래된 버전은 요즘 거의 사용되지 않는다. (최신 버전의 프로토콜에 비해) 보안 및 성능이 좋지 않기 때문)
506 Variant Also Negotiates
- 서버에 내부 구성 오류가 있는 경우 발생
- 요청을 위한 투명한 콘텐츠 협상이 순환 참조로 이어진다.
507 Insufficient Storage
- 선택한 가변 리소스는 투명한 서버에 내부 구성 요류가 있는 경우 발생
- 콘텐츠 협상에 참여하도록 구성되므로, 협상 과정에서 적절한 끝점이 아니다.
508 Loop Detected (WebDAV)
- 서버가 요청을 처리하는 동안, 무한 루프를 감지한 경우 발생
510 Not Extended
"서버가 요청을 이행하려면, 요청에 대한 추가 확장이 필요하다."
511 Network Authentication Required
"클라이언트가 네트워크 액세스를 얻기 위해 인증할 필요가 있다."
HttpStatus
스프링에서는 아래와 같은 편리한 enum도 제공
public enum HttpStatus {
CONTINUE(100, Series.INFORMATIONAL, "Continue"),
OK(200, Series.SUCCESSFUL, "OK"),
CREATED(201, Series.SUCCESSFUL, "Created"),
MULTIPLE_CHOICES(300, Series.REDIRECTION, "Multiple Choices"),
MOVED_PERMANENTLY(301, Series.REDIRECTION, "Moved Permanently"),
FOUND(302, Series.REDIRECTION, "Found"),
BAD_REQUEST(400, Series.CLIENT_ERROR, "Bad Request"),
UNAUTHORIZED(401, Series.CLIENT_ERROR, "Unauthorized"),
PAYMENT_REQUIRED(402, Series.CLIENT_ERROR, "Payment Required"),
FORBIDDEN(403, Series.CLIENT_ERROR, "Forbidden"),
INTERNAL_SERVER_ERROR(500, Series.SERVER_ERROR, "Internal Server Error"),
NOT_IMPLEMENTED(501, Series.SERVER_ERROR, "Not Implemented"),
BAD_GATEWAY(502, Series.SERVER_ERROR, "Bad Gateway"),