Suhwanc

 

1. 서론

저번 시간에는 메서드에 대해 배웠다.

만약 면접에서 REST API가 무엇인가요?라고 물으면 GET, POST, PUT, PATCH, DELETE 정도는 알아야 한다고 한다.

 

이번 시간에는 그 정도로 외워야 하진 않지만, 개발하다 보면 자연스럽게 알게 되는 404 에러 같은 걸 공부해보자.

참고로 모든 상태 코드를 적는 건 너무 귀찮은 일이기 때문에 핵심적인 부분만 다룰 예정이다.

 

 

 

2. 상태코드 분류

상태 코드는 모두 세 자릿수 숫자로 구성되는데, 그중 백의 자릿수에 따라서 큼지막한 기능들을 구분한다.

 

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

 

이 중 1xx 부분은 거의 사용하지 않으므로 이후 설명에서 생략하도록 하겠다.

 

 

3. 2xx (Successful)

 

1) 200 OK

 

말 그대로 서버에 전송한 요청이 성공했다는 의미이다. 

 

2) 201 Created

 

서버에 전송한 요청이 성공했고, 새로운 리소스가 생성되었다는 의미이다.

이 경우 응답 메시지에 Location 헤더 필드가 함께 전송되는데, 여기엔 생성된 리소스의 위치를 담고 있다.

 

3) 202 Accepted

 

서버에 요청이 접수되었으나, 아직 처리되지 않은 상태이다.

보통 요청 후 일정 시간 이후 처리해야 하는 상황일 때 사용된다. (타이머 설정 후 전송 같은 느낌)

 

4) 204 No Content

 

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

예를 들어 클라이언트가 저장 버튼을 누르면, 사실 클라이언트가 받을 데이터는 없다.

따라서 이런 상태 메시지만으로 저장이 된 건지 인식할 수 있게 해 준다.

 

 

4. 3xx (Redirection)

우선 3xx의 각 코드들을 살펴보기 전에 리다이렉션이라는 개념을 알고 가야 한다.

만약 웹 브라우저가 3xx라는 응답을 받았고, 이 결과에 Location 헤더가 있다면,

웹 브라우저는 자동으로 Location 위치로 이동하게 된다.

완전 자동으로 이동하는 것은 아니고, 웹 브라우저가 Location 헤더의 위치 정보를 가지고 서버에 다시 요청을 보낸다는 의미이다. 이를 리다이렉트라고 한다.

 

리다이렉션에는 종류가 나뉜다.

 

1) 영구 리다이렉션

 

리소스의 URI가 영구적으로 이동한 경우이다.

얼마 전 학교 홈페이지의 URI가 바뀐 적이 있는데, 그 경우 예전 URI를 통해 접근하게 되면 은근슬쩍 URI가 바뀌어 들어가는 걸 볼 수 있었다. 이는 검색 엔진 등에서 변경 사항을 알고 리다이렉션 한 경우이다.

 

대표적으로 301, 308 코드가 존재한다.

 

  • 301 Moved Permanently : 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.
  • 308 Permanent Redirect : 301과 기능은 같으나, 리다이렉트 시 요청 메서드와 본문이 유지된다.

 

 

2) 일시적인 리다이렉션

 

리소스의 URI가 일시적으로 변경되는 경우이다.

대표적인 사례로 상품을 주문 버튼을 눌러(POST) 결제가 완료되면, 바로 주문 결과 화면으로 이동(GET)하는 리다이렉트 상황이 있다. (POST에서 GET으로 리다이렉트)

이는 나중에 새로고침으로 인한 중복 주문을 방지할 수 있는 장점이 있다.

 

대표적으로 302, 307, 303 코드가 존재한다.

 

  • 302 Found : 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.
  • 307 Temporary Redirect : 리다이렉트 시 요청 메서드와 본문이 유지된다.
  • 303 See Other : 리다이렉트 시 요청 메서드가 GET으로 변경된다.

 

302는 GET으로 변할 수도 있고, 본문이 제거될 수도 있는 모호한 상태 코드이고,

307과 303은 명확한 느낌이 강하다.

 

따라서 307과 303이 권장되지만, 이미 많은 애플리케이션들이 302를 기본값으로 사용한다고 한다. 

 

 

추가

 

304 Not Modified

 

캐시를 목적으로 사용되는데, 클라이언트에게 리소스가 수정되지 않았음을 알려준다.

이런 메시지를 받으면 클라이언트는 맘 놓고 로컬 PC에 저장되어있는 캐시를 재사용할 수 있는 것이다.

이때 캐시로 리다이렉션이 발생한다.

 

 

 

5. 4xx (Client Error)

자주 보이는 4xx대 에러이다. 보통 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없을 때 발생한다.

즉, 오류의 원인은 바로 당신!이라는 말이다.

 

 

400 Bad Request

요청, 메시지 부분에 오류가 발생한 경우이다. 이 경우 클라이언트는 요청 내용을 다시 확인해보아야 한다.

 

401 Unauthorized

인증이 되지 않은 경우이다. 이때 응답으로는 WWW-Authenticate 헤더와 함께 인증 방법을 설명해준다.

 

403 Forbidden

서버가 요청을 이해했지만 승인을 거부한 경우이다. 보통 접근 권한이 없을 때 나타난다.

 

404 Not Found

클라이언트가 요청하는 리소스가 서버에 없는 경우 또는 권한이 부족한 사용자에게 서버가 리소스를 숨기고 싶을 때 발생한다.

 

 

 

6. 5xx (Server Error)

5번과 다르게 서버의 문제로 오류가 발생한 경우이다.

또한 5번 클라이언트 오류와 다른 점은 서버에 문제가 있기 때문에 우리가 새로고침 하면 성공할 수도 있다는 점이다.

 

 

500 Internal Server Error

서버 내부 문제로 오류가 발생한 경우이다. 서버 오류의 경우 웬만하면 500 에러를 보낸다고 한다.

 

503 Service Unavailable

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

이 경우 Retry-After 헤더 필드로 얼마 뒤에 복귀되는지도 보낼 수 있다고 한다. (롤 서버 점검 같은 경우)