티스토리 뷰

WEB/HTTP

[HTTP] HTTP 상태코드

MAENCO 2021. 8. 2. 15:10
반응형
HTTP Status

HTTP Status 말 그대로 상태를 알려주는 응답 코드들인데

서버에서 클라이언트에게 이 코드들로 응답을 하여 서버와의 통신이 성공적이었는지, 어떠한 문제가 있는지 알려준다

 

응답은 5개의 그룹으로 나눠져 있다

 

1XX: Information Response (응답 - 요청이 수신되어 처리 중 / 거의 사용하지 않는다고 함)

100: Continue

진행 중임을 나타내며, 현재까지 진행상태에 문제가 없으며 클라이언트가 계속해서 요청을 하거나

이미 요청을 완료한 경우에는 무시해도 된다

 

101: Switching Protocol

클라이언트에 의해 보낸 업그레이드 요청 헤더에 대한 응답으로 보내진다

이 헤더에 들어가며 서버에서 프로토콜을 변경할 것을 알려준다, 101 코드 같은 경우 Websocket 프로토콜 전환 시에 사용된다

 

102: Processing(WebDAV)

서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없을 때 사용한다

 

2XX: Successful Response (성공적인 응답 - 요청 정상 처리)

성공적인 요청에 대한 응답이다, 성공의 의미는 HTTP 메서드에 따라 달라진다

GET: 리소스를 불러와서 메시지 바디에 전송되었습니다.
HEAD: 개체 해더가 메시지 바디에 있습니다.
PUT 또는 POST: 수행 결과에 대한 리소스가 메시지 바디에 전송되었습니다.
TRACE: 메시지 바디는 서버에서 수신한 요청 메시지를 포함하고 있습니다.

 

201: Created

요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었음

이 응답은 보통 POST 또는 일부 PUT 요청에 대한 응답으로 사용된다

 

202: Accepted

요청이 접수되었으나 처리가 완료되지 않았음

배치 처리 같은 곳에서 사용한다

예) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리 함

 

204: No Content

서버가 요청을 성공적으로 수행했지만 응답에 보낼 데이터가 없음

 

3XX: Redirection Response (리다이렉션 - 요청을 완료하려면 추가 행동이 필요)

웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면 그 위치로 자동 이동하는데

이것을 리다이렉션이라고 하는데 이는 아래와 같이 나뉜다

영구 리다이렉션

-특정 리소스의 URI가 영구적으로 이동

예) /members -> /users

 

301: Moved Permanently

요청한 리소스의 URI가 변경되었음을 의미한다

리다이렉트 시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있다

 

308: Permanent Redirect

301과 기능은 같지만 리다이렉트시 요청 메서드와 본문을 유지한다

예) 처음 POST를 보내면 리다이렉트도 POST를 유지한다

 

일시 리다이렉션

-리소스의 URI가 일시적으로 변경된다 따라서 검색 엔진 등에서 URL을 변경하면 안 된다

 

302: Found

요청한 리소스의 URI가 일시적으로 변경되었음을 의미한다

새롭게 변경된 URI는 나중에 만들어질 수 있으며 이후의 요청도 동일한 URI어야 한다

리다이렉트 시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있다

 

303: See Other

302와 기능은 같다 리다렉트시 요청 메서드가 GET으로 변경된다

 

307: Temporary Redirect

302와 기능은 같다 리다이렉트 시 요청 메서드와 본문을 유지하는데 이중 요청 메서드는 꼭 유지하여야 한다

 

PRG Pattern: Post/Redirect/Get 패턴

권장되는 디자인 패턴 중 하나로, HTTP POST 요청에 대한 응답이 또 다른 URL로의 GET 요청을 위한

리다이렉트(3XX status)이어야 한다는 패턴이다, 이 패턴이 필요한 이유를 예를 들어 설명하자면

만약 상품 주문을 하고 나서 그 상태로 웹 브라우저를 새로고침 하게 되면 당연히 POST 요청이 다시 가게 되고 중복 주문이 발생한다

 

PRG패턴을 사용하지 않았을 시

이런 중복 주문이 생기는 것을 방지하기 위해서 Post -> Redirect -> Get 패턴을 사용하면

Get 메서드로 리다이렉트 되었기 때문에 새로고침을 한다한들 GET메서드가 요청되지 POST로 인한 중복 주문은 없다

PRG 패턴을 사용하였을 시

PRG 패턴의 핵심은 브라우저가 이해할 수 있는 3XX 응답 코드를 통해 POST를 통해 요청했던 페이지에서

새로운 리소스의 페이지로 바꾸도록 하는 것이다

 

현재는 보통 302를 기본값으로 사용한다고 한다, 하지만 권장 코드는 303과 307이다

이 이유는 302가 초기에 만들어진 의도가 원래 메서드를 유지하도록 만들었는데

사람들이 대부분 GET으로 바꾸어 사용해 버린 것 (GET으로 바꿀 수 있으니..)

 

그렇기 때문에 302 보다 좀 더 명확한 303과 307을 만들었고

PRG 패턴에서 권장 사용도 303이지만 302를 써도 무방하다고 한다

 

특수 리다이렉션

-결과 대신 캐시를 사용

 

304: Not Modified

클라이언트에게 리소스를 수정되지 않았음을 알려준다 따라서 클라이언트는 로컬 PC 저장된 캐시를 재사용한다

더 자세한 내용은

HTTP(7) - 쿠키와 세션 그리고 캐시(2)

 

4XX: Client Error (클라이언트 에러 - 잘못된 문법 등으로 서버가 요청을 수행할 수 없음)

핵심은 오류의 원인이 클라이언트에게 있다는 것이다

즉 클라이언트가 이미 잘못된 요청을 하거나 데이터를 보내고 있기 때문에 똑같은 재시도를 해도 실패한다

 

400: Bad Request

잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미한다

즉 요청 구문 및 메시지 등에 오류가 있다는 뜻, 클라이언트가 요청 내용을 다시 검토하고 보내야 한다

 

401: Unauthorized

'승인'이 아니라 '인증'이 되지 않았다는 뜻이다

클라이언트는 요청한 응답을 받기 위해 반드시 스스로를 인증해야 한다

 

403: Forbidden

서버가 요청을 이해했지만 승인은 거부함, 주로 인증 자격은 있지만 접근 권한이 불충분한 경우에 발생한다

 

404: Not Found

요청 리소스가 서버에 존재하지 않거나 권한이 부족한 리소스에 접근할 시 이를 숨길 때 사용한다 (403을 통해서도 숨길 수 있다)

 

5XX: Server Erro (서버 에러 - 서버가 정상 요청을 처리하지 못함)

서버에 문제가 있는 것이기 때문에 재시도하면 성공을 할 수 있음

예를 들어 과부하가 걸려 다운되었는데 복구 이후에 요청을 하면 정상적인 응답을 해주는 것

 

500: Internal Server Error

서버가 처리 방법을 모르는 상황이 발생했다는 의미이다

즉 서버 내부 문제로 오류가 발생했다는 뜻, 이외에도 특정한 에러코드로 에러를 규정할 수 없을 때 500을 사용한다

 

503: Service Unavailable

서버가 요청을 처리할 준비가 되지 않았다는 의미이다

일반적인 원인은 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수가 없는 등의 상황이다

 

5XX에러 같은 경우 주의해야 할 점은 '서버' 쪽에 무슨 문제가 있을 때만 이 5XX에러를 내야 한다는 것이다

예를 들어 미성년자 접근 불가라는 조건이 있는데, 미성년자가 접근을 하는 것은 사실 서버 쪽에서 조건을 걸었을 뿐

요청 응답 프로세스에서는 정상적인 요청이며 응답이다, 이럴 때는 5XX에러가 아니라 반드시 4XX에러를 내야 한다

 

 

 

 

더보기

개인 학습을 위해 작성되는 글입니다.

제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.

 

참조 링크:

https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

https://en.wikipedia.org/wiki/Post/Redirect/Get

 

 

반응형
댓글