[HTTP] HTTP 상태코드

2젼·2023년 6월 26일
0

HTTP

목록 보기
7/8
post-thumbnail

이번 포스팅에서는 HTTP 상태 코드에 대해서 알아봅시다!

상태 코드

클라이언트가 보낸 요청의 처리 상태를 응답(Response)에서 알려주는 기능

상태 코드는 아래와 같이 크게 5 가지로 분류된다.

  1. 1xx(Information) : 요청이 수신되어 처리 중
  2. 2xx(Successful) : 요청 정상 처리
  3. 3xx(Redirection) : 요청을 완료하려면 추가 행동이 필요
  4. 4xx(Client Error) : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
  5. 5xx(Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못함

하나 씩 살펴보자.

1xx

요청이 수신되어 처리 중인 상태

거의 사용되지 않으므로 생략하겠다.


2xx - 성공

클라이언트의 요청을 성공적으로 처리한 상태

✔️ 200 OK
✔️ 201 Created
✔️ 202 Accepted
✔️ 204 No Content

200 OK

요청 성공

201 Created

요청 성공해서 새로운 리소스가 생성됨

202 Accepted

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

배치 처리 같은 곳에서 사용한다. 예를 들어, 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리하는 것과 같은 상황이다. 잘 사용하지 않는다.

204 No Content

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

예를 들어, 웹 문서 편집기에서 save 버튼에 대해 생각해보자. 이 버튼을 누르면 데이터가 POST를 통해 서버로 넘어가게 될 것이다. 서버는 이 내용을 저장한 뒤 클라이언트에게 따로 보낼 데이터는 없다. save 버튼의 결과로 아무 내용이 없어도 되고, 눌러도 같은 화면을 유지해야 한다. 이때 결과 내용이 없어도 204 메시지만으로 성공을 인식할 수 있다.


3xx - 리다이렉션

요청을 완료하기 위해 유저 에이전트(웹 브라우저와 같은 클라이언트 프로그램)의 추가 조치 필요

✔️ 300 Multiple Choices
✔️ 301 Moved Permanently
✔️ 302 Found
✔️ 303 See Other
✔️ 304 Not Modified
✔️ 307 Temporary Redirect
✔️ 308 Permanent Redirect

리다이렉션(Redirect)이란?

웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동으로 이동힌다.

예시를 살펴보자.

원래 /event의 경로인 페이지를 사용했었는데, 이를 /new-event 경로로 변경했다고 생각해보자. 기존 사용자들이 /event를 입력해 들어왔다. 이때 301 Moved Permanently를 이용해 바뀐 경로를 전달할 수 있다. 클라이언트는 이를 확인해 Location에 있는 URL로 다시 요청을 보내 화면을 띄우게 된다.

리다이렉션에는 크게 3가지 종류가 있다.

1. 영구적인 리다이렉션

특정 리소스의 URI가 영구적으로 이동
원래의 URL을 사용하지 않고, 검색 엔진 등에서도 변경을 인지한다.

301 Moved Permanently

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

308 Permanent Redirect

301과 기능은 같지만, 요청 메서드와 본문을 유지한다.
(처음 POST를 보내면 리다이렉트도 POST를 유지)

2. 일시적인 리다이렉션

리소스의 URI가 일시적으로 변경(가장 많이 사용한다.)
따라서, 검색 엔진 등에서 URL을 변경하면 안됨.

302 Found

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

307 Temporary Redirect

302과 기능은 같지만, 요청 메서드와 본문을 유지한다. 요청 메서드를 변경하면 안된다.

303 See Other

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

그렇다면 일시적인 리다이렉션을 언제 사용할까? 예시를 통해 살펴보자.

PRG : Post/Redirect/Get

만약에 상품 주문 페이지에서 POST로 주문 후에 웹 브라우저를 새로고침하면 어떻게 될까? 새로고침은 다시 요청을 하는 것이므로 서버에 중복 주문이 될 수 있다. 요청했던 것을 새로고침하기 때문에 POST요청을 한 번 더 하기 때문이다.

PRG 사용 전

기존의 경우를 살펴보자.

HTML Form에 주문할 상품들을 넣고 POST 요청을 보냈다. 그럼 서버는 이를 받아 DB에 저장할 것이다. 그리고 이에 대한 응답으로 200 OK를 보낼 것이다. 이때 클라이언트가 새로고침을 누르면 POST 요청을 다시 보내게되어, 주문 데이터 한 건이 더 저장되어 버린다.

이를 해결하기 위해, 리다이렉션을 사용한다. POST로 주문 후에 새로 고침으로 인한 중복 저장을 방지한다.

POST로 요청 후에 결과 화면을 GET 메서드로 리다이렉트

이렇게 되면 새로고침을 해도 결과 화면을 GET으로 조회할 수 있다. 중복 주문 대신에 결과 화면만 GET으로 다시 요청하게 되는 것이다.

위 예시 사진을 살펴보면, 클라이언트가 처음 요청을 보내 서버는 이를 받아 데이터를 DB에 저장하고 응답을 보낼 때, 302 Found를 전달한다.

즉, 이미 URL이 이미 POSTGET으로 리다이렉트 된 것이다. 새로고침해도 GET으로 결과 화면만 조회된다.

3. 기타 리다이렉션

300 Multiple Choices

잘 사용하지 않는다.

304 Not Modified

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

304 응답은 로컬 캐시를 사용해야 하기 때문에 응답에 메시지 바디를 포함하면 안된다..!
조건부 GET, HEAD 요청 시에 사용한다.

캐시에 대한 내용은 여기서 더 자세히 알아볼 수 있다.


4xx - 클라이언트 오류

클라이언트의 요청에 잘못된 문법 등의 문제로 서버가 요청을 수행할 수 없는 경우
오류의 원인이 클라이언트에 있다!

여기 4xx 오류와 5xx 오류의 가장 큰 차이점이 있다.

4xx 오류는 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패한다. 5xx 오류는 서버에서 DB 등의 문제가 해결된다면 똑같은 재시도 시 성공할 가능성이 있다.

400 Bad Request

클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없는 상태

주로 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때 발생한다.

401 Unauthorized

클라이언트가 해당 리소스에 대한 인증이 필요한 경우

인증(Authentication) 되지 않은 경우이다. 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해야 한다.

403 Forbidden

서버가 요청을 이해했지만 승인을 거부하는 경우

주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우이다. ADMIN 등급이 아닌 사용자가 로그인은 했지만, ADMIN 등급의 리소스에 접근하는 것과 같은 경우이다.

404 Not Found

요청 리소스를 찾을 수 없는 경우

요청 리소스가 서버에 없거나, 클라이언트가 권한이 부족한 리소스의 접근할 때 해당 리소스를 숨기고 싶은 경우이다.


5xx - 서버 오류

서버 문제로 오류가 발생한 경우
서버에 문제가 있기 때문에 재시도하면 (서버가 복구된다면) 성공할 수도 있다.

500 Internal Server Error

서버 문제로 오류 발생, 애매하면 500 오류

말 그대로 서버 내부 문제로 오류가 발생한 경우이다. 따라서 백엔드에서 발생한 애매한 오류는 500으로 내면된다.

503 Service Unavailable

서비스 이용 불가
서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없는 경우

이때, Retry-After 헤더 필드를 이용해 얼마 뒤에 복구되는지 예상 시간을 보낼 수 있다.

웬만해서는 서버에서 5xx 오류를 만들면 안된다.


참고

인프런 김영한님의 강의 - 모든 개발자를 위한 HTTP 웹 기본 지식

profile
안녕하세요:)

0개의 댓글