HTTP Status Code와 Request Method와의 접목

Joon·2021년 10월 22일
0

참고

https://developer.mozilla.org/ko/docs/Web/HTTP/Status
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

HTTP Status Code

서버는 클라이언트와 HTTP로 데이터를 주고 받을 때, 응답 헤더에 상태코드(Status Code)를 같이 보낸다. 이 HTTPS Status Code는 특정한 HTTP요청이 성공적으로 수행되고 완료되었는지를 클라이언트에게 알려준다.

HTTP Status Code는 HTTP 표준으로 정의되어 있어, 각기 다른 브라우저나 서버단에서도 항상 동일한 형식과 의미를 지닌다.

응답은 3자리 숫자로 이루어져 있으며, 맨 앞자리 숫자 1~5에 따라서 각각 정보(Informational), 성공(Successful), 리다이렉트(Redirection), 클라이언트 에러(Client Error), 서버 에러(Server Error)로 응답코드의 그룹이 나뉘어진다.

1xx(정보)

: 요청을 받았으며 프로세스를 계속 진행합니다.

  • 100: Continue
    - 클라이언트가 어떤 것을 요청했을 때 아직까지는 요청이 상태가 괜찮다는 것을 알려준다.
  • 102: Processing
    - 서버가 요청을 수신하였고, 처리중이므로 아직 제대로 된 응답을 줄 수 없음을 나타낸다.

2xx(성공)

: 요청을 성공적으로 받았으며 인식했고 수용하였습니다.

  • 200: OK
    - 요청이 성공적으로 완료되었음을 알린다.
    성공의 의미는 HTTP 메소드에 따라 달라진다.
  • 201: Created
    - 요청이 성공적이었으며, 그 결과로 새로운 리소스가 생성되었음을 알려준다.
  • 204: No Content
    - 요청을 문제없이 처리했지만, 클라이언트가 요청한
    데이터가 없음을 알려준다.

3xx(리다이렉션)

: 요청 완료를 위해 추가 작업 조치가 필요합니다.

  • 301: Moved Permanently
    - 클라이언트가 요청한 리소스는 다른 곳으로 이전하였으니 다른 URL을 이용하도록 Redirect.
  • 302: Found
    - 클라이언트가 요청한 리소스는 임시로 다른 곳으로 이전하였음을 알린다.
  • 303: See Other
    - 302와 유사하지만, 오직 GET 요청에서만 사용할 수 있는 응답 코드.
  • 307: Temporary Redirect
    - 임시적인 리다이렉트. 302 Found와 동일한 의미이지만 사용자 에이전트가 사용된 HTTP 메소드를 변경하지 말아야한다. 예를 들면 POST로 첫 요청이 전송되었다면, 그 다음 요청도 POST여야 한다.
  • 308: Permanent Redirect
    - 영구적인 리다이렉트. 301 Moved Permanently와 동일한 의미를 지니며, 307 Temporary Redirect와 마찬가지로 클라이언트가 이전 메소드와 동일한 메소드를 사용해야 한다.

4xx(클라이언트 오류)

: 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.

  • 400: Bad Request
    - 클라이언트측의 잘못된 문법(query 혹은 API)으로 인해 서버가 요청을 이해할 수 없음을 나타낸다.

  • 401: Unauthorized
    - 비록 HTTP 표준에서는 "미승인(unauthorized)"를 명확히 하고 있지만, 의미상 이 응답은 "비인증(unauthenticated)"을 의미한다. 클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 한다.

    • 대표적인 예시로 회원제인 사이트에서 로그인을 하지 않고, 로그인이 필요한 리소스에 접속을 요청할 때를 들 수 있다.
  • 403: Forbidden
    - 클라이언트가 요청한 리소스에 접근할 권한이 없음을 나타낸다. 401 Unauthorized와 다른 점은, 서버는 클라이언트가 누구인지 알고 있다는 점이다.

    • 인증된 사용자이다. 예시로 회원제 사이트에서 로그인을 했음에도 권한이 주어지지 않은 리소스에 접근을 요청할 때이다.
  • 404: Not Found
    - 웹에서 가장 자주 보이기에 가장 유명한 코드이다. 클라이언트가 요청한 리소스를 서버가 찾을 수 없음을 나타낸다.

    • 브라우저에서는 알려지지 않은 URL을 의미한다. 이것은 API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수도 있으며, 또 서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 전송할 수도 있다.
  • 405: Method Not Allowed
    - 해당 URL에 한해서, 쓰거나 삭제하는 기능이 허용되지 않음을 나타낸다.

  • 409: Conflict
    - 클라이언트가 만들고자 하는 리소스가 이미 존재하거나, 충돌이 날 때 사용한다.

5xx(서버 오류)

: 서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.

  • 최대한 피해야하는 오류이다.
  • 500: Internal Server Eror
    - 서버 내부에서 어떠한 문제가 발생해서 해당 요청을 처리할 수 없을 때 사용된다.
  • 502: Bad Gateway
    - 중간에 있는 서버가 클라이언트의 요청을 받아 처리해야할 때, 어떻게 처리하는지 모를 때를 나타낸다.
  • 503: Service Unavailable
    - 서버가 아직 준비가 되지 않았을 때, 이 URL의 특정한 요청을 처리할 준비가 되지 않았을 때를 나타낸다.
    • 주 원인은 보통 유지보수를 위해 작동을 중단하거나, 서버에 과부하가 걸렸을 때이다.

Request Methods

GET : get
POST : create
PUT : replace
DELETE : delete
PATCH : replace partially
HEAD : get without body (get header only)
OPTIONS : all supported methods for URL
TRACE : echoes the received request

분류

  • 서버에 있는 데이터를 읽기만 하고, 변경하지 않는 Method
    - GET, HEAD, OPTIONS, TRACE
    • 수많은 사용자가 요청을 해도 데이터는 변경되지 않는다.
  • 서버에 있는 데이터를 쓰고, 변경하는 Method
    - POST, PUT, DELETE, PATCH
    • 데이터가 변경되기에 메소드 처리에 대해 조심해야 할듯 하다.

MDN 사이트에서 Request Method 페이지의 아무 메소드나 선택해서 들어가보면 해당 표가 나온다.

이 테이블에서 Safe와 Idempotent에 대해 살펴보자면,

Safe

MDN의 해석을 보자

An HTTP method is safe if it doesn't alter the state of the server. In other words, a method is safe if it leads to a read-only operation. Several common HTTP methods are safe: GET, HEAD, or OPTIONS. All safe methods are also idempotent, but not all idempotent methods are safe. For example, PUT and DELETE are both idempotent but unsafe.

메소드가 서버의 상태를 변경하지 않으면, 그 메소드는 Safe하다고 한다.
그러니까, Request Method가 서버의 데이터를 변경하지 않는, 읽기 전용 상태를 유지하게 한다면, 그 메소드는 Safe하다는 것이다.

GET, HEAD, OPTION이 대표적인 Safe 메소드이다.

모든 Safe 메소드는 Idempotent하지만, 모든 Idempoent한 메소드는 Safe하지 않다고 한다.

Idempotent

한국어로 번역하면 멱등의, 멱등원이다. (뭔소리여?)
그냥 MDN 사이트에 나온 영어로 알아보자.

An HTTP method is idempotent if an identical request can be made once or several times in a row with the same effect while leaving the server in the same state. In other words, an idempotent method should not have any side-effects (except for keeping statistics). Implemented correctly, the GET, HEAD, PUT, and DELETE methods are idempotent, but not the POST method. All safe methods are also idempotent.

이를 해석해보자면, 동일한 요청을 여러번 했을 때, 몇번을 해도, 얼마나 빠르게 하였던 상관없이
서버에게 항상 같은 효과를 지니고, 서버의 상태 또한 동일하게 남을 때 Idempotent하다고 표현한다.

대표적인 Idempotent한 메소드가 GET, HEAD, PUT, DELETE이며, Idempotent 하지 않은 메소드는 대표적으로 Patch, POST가 있다. 그 차이는 요청의 횟수와 상관없이 항상 같은 효과를 지니느냐, 아니느냐, 서버의 상태가 변하느냐, 변하지 않느냐이다.

GET

Status Code

200 : OK | 데이터를 찾았고 보내줄게
401 : Unauthorized | 인증된 사람만(로그인한 사람) 볼 수 있어
403 : Forbidden | 인증되었지만(로그인 했지만) 너는 권한이 없어
404 : Not Found | 요청한 데이터가 없어
405 : Method Not Allowed | GET 메소드는 허용되지 않았어

POST

Status Code

201 : Created | 요청한 것을 만들었어
401 : Unauthorized | 인증된 사람만(로그인한 사람) 볼 수 있어
403 : Forbidden | 인증되었지만(로그인 했지만) 너는 권한이 없어
404 : Not Found | 요청한 경로가 존재하지 않아
409 : Conflict | 만드려고 하는 리소스가 이미 있어서 충돌이 일어났어

PUT, DELETE, PATCH

Status Code

200 : OK
204 : No Content | 콘텐츠가 없어
403 : Forbidden | 인증되었지만(로그인 했지만) 너는 권한이 없어
404 : Not Found |
405 : Method Not Allowed | 해당 메소드는 허용되지 않았어

HEAD, OPTIONS, TRACE

200 : OK
401 : Unauthorized | 인증된 사람만(로그인한 사람) 볼 수 있어
403 : Forbidden | 인증되었지만(로그인 했지만) 너는 권한이 없어
404 : Not Found | 요청한 경로가 존재하지 않아
405 : Method Not Allowed | 해당 메소드는 허용되지 않았어

profile
한줄씩 완성해가는 개발 공부

0개의 댓글