웹 프로그래밍 - RESTful한 HTTP 요청 메서드와 HTTP 응답 상태 코드
- 프로그래밍
- 2021. 12. 9.
HTTP 요청 메서드와 HTTP 응답 코드를 잘 알고 사용한다면 우리는 보다 쉽게 RESTful 하게 HTTP 프로토콜을 사용할 수 있습니다. 뿐만 아니라 HTTP 프로토콜은 REST(Representational State Transfer) 아키텍처 위에서 더 큰 빛을 발하는 통신 규약입니다. 하지만 생각보다 API를 REST 하게 설계하고 사용하는 것은 말처럼 그리 간단치 않습니다.
HTTP 요청 메서드
먼저 알아볼 부분은 HTTP 요청 메서드입니다. HTTP 요청 메서드는 요청(Request)을 통해 기대하는 행동을 말합니다. 예를 들어 서버에서 처리를 하지 않는다고 해도 https://7942yongdae.tistory.com/이라는 URL에 GET 요청(Request)하면 조회를 하고 싶다는 의미이고, POST를 요청한다면 무언가 글을 등록하고 싶다는 의미가 됩니다.
tip. 하나의 URL(혹은 URI)을 통해 GET, HEAD, POST, PUT, PATCH, DELETE과 같은 요청을 처리할 수 있도록 한 이유는 하나의 URL을 가지고 여러 가지 일을 할 수 있도록 정의하기 위함입니다. 예를 들어 글 추가, 수정, 삭제를 위해 각 각의 URL 3개를 만드는 것보다 1개의 URL을 가지고 상황(요청 메서드)에 따라 처리하는 게 효율적일 수 있습니다.
유형 | 개요 |
GET | 조회 |
HEAD | 조회 - 응답 바디 제외 |
POST | 생성 || 추가 |
PUT | 전체 갱신 || 추가 (자원이 없는 경우) |
PATCH | 일부 갱신 |
DELETE | 삭제 |
참고 - https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
HTTP 응답 상태 코드
HTTP 프로토콜을 기준으로 클라이언트와 서버 간에 통신이 이루어지면, 요청(Request)을 한 후 결과로 응답(Response)을 돌려받습니다. 이때 응답은 HTTP 상태 코드를 포함하고 있습니다. HTTP 응답 상태 코드를 공부한다면, 응답 결과의 상태 코드만으로 성공, 실패 여부를 판별할 수 있고 한발 더 나아가 API를 설계할 때도 도움이 됩니다. 정의된 HTTP 상태 코드는 다음과 같습니다.
통신 상황에 대한 정보를 알려주는 1xx - HTTP 응답 코드
코드 | 개요 | 설명 |
100 | Continue | 클라이언트가 보낸 요청에 문제가 없으니, 다음 요청을 이어서 보내도 문제가 없습니다. |
101 | Switching Protocols | 클라이언트 요청에 정의된 upgrade 헤더에 따라 서버가 프로토콜을 바꿉니다. |
요청의 성공을 정의하는 2xx - HTTP 응답 코드
코드 | 개요 | 설명 |
200 | OK | 요청을 성공적으로 처리했습니다. |
201 | Created | 요청을 성공적으로 처리했으며, 그 결과로 새로운 Resource를 생성했습니다. |
202 | Accepted | 요청을 접수만 완료하였습니다. 주로 비동기적으로 처리하는 작업을 위해 만들어졌습니다. |
203 | Non-Authoritative Information |
요청은 성공했지만, Header의 메타 데이터가 원본과 동일하지 않습니다. 주로 Proxy에 의해 Header 값이 변환됩니다. |
204 | No Content | 요청을 처리했지만, 반환 하는 응답 바디가 없습니다. |
205 | Reset Content | 요청 처리 후, 클라이언트에게 요청을 보낸 화면을 새로고침하라고 알려줍니다. |
206 | Partial Content | 범위(Range) 헤더를 이용 할 때 사용되는 성공 상태 코드입니다. 클라이언트에서 다수의 스트림을 이용해 데이터를 받을 때 사용됩니다. |
리다이렉트(Redirect)를 정의한 3xx - HTTP 응답 코드
코드 | 개요 | 설명 |
300 | Multiple Choice | 하나 이상의 응답이 가능하며, 다수의 결과 중 하나를 반드시 선택해야 합니다. |
301 | Moved Permanently | 요청한 Resource의 위치가 변경되었습니다. 변경된 위치값은 포함 될 수 있습니다. |
302 | Found | 요청한 Resource의 위치가 임시로 변경되었습니다. |
303 | See Other | 요청한 Resource는 다른 URL을 통해 얻을 수 있습니다. |
304 | Not Modified | 캐시를 목적으로 사용되며, 요청한 Resource가 수정되지 않았음을 알려줍니다. |
307 | Temporary Redirect | 요청한 Resource의 위치가 임시로 변경되었습니다. 302와 동일한 의미를 가지며, HTTP 메소드를 변경하면 안된다는 점이 다릅니다. |
308 | Permanent Redirect | 요청한 Resource의 위치가 변경되었습니다. 301과 동일한 의미를 가지며, HTTP 메소드를 변경하면 안된다는 점이 다릅니다. |
잘못된 요청임을 알려주는 4xx - HTTP 응답 코드
코드 | 개요 | 설명 |
400 | Bad Request | 전달 된 데이터의 잘못된 문법으로 서버가 요청을 이해할 수 없습니다. |
401 | Unauthorized | HTTP 표준은 미인증(Unauthorized)를 나타내지만, 이 응답은 비인증(unauthenticated)를 의미합니다. |
402 | Pyament Required | 전자 결제 시스템에 사용하기 위해 예약된 상태 코드로, 현재는 사용되고 있지 않습니다. |
403 | Forbidden | Resource에 접근한 권리를 가지고 있지 않습니다. 401과 다른점은 클라이언트를 알고 있다는 것입니다. |
404 | Not Found | Resource가 존재하지 않습니다. |
405 | Method Not Allowd | 요청한 Method를 허용하지 않습니다. |
406 | Not Acceptable | 클라이언트가 정한 규격에 따른 콘텐츠가 존재하지 않습니다. |
407 | Proxy Authentication Required |
인증되지 않은 요청을 받았습니다. 프록시를 통해 완료된 인증이 필요합니다. |
408 | Request Timeout | 클라이언트가 서버가 지정한 시간 내에 요청을 보내지 않았습니다. |
409 | Conflict | Resource의 현재 상태 때문에 요청을 완수할 수 없습니다. 예: 일괄 처리 작업 요청 처리 중에 다시 요청이 발생한 경우 |
410 | Gone | Resource가 삭제되어, 더 이상 존재하지 않습니다. |
411 | Length Required | 헤더에 Content-Length 필드가 정의되어 있지 않습니다. |
412 | Precondition Failed | 클라이언트의 헤더에 있는 전제 조건이 서버의 전제 조건에 적합하지 않습니다. |
413 | Payload Too Large | 클라이언트가 요청한 Entity는 서버에서 정의한 크기보다 큽니다. |
414 | URI Too Long | 클라이언트가 요청한 URI는 서버에서 처리가능한 길이보다 깁니다. |
415 | Unsupported Media Type | 요청한 미디어 포맷은 서버에서 지원하지 않습니다. |
서버 처리 과정에서 문제가 발생했음을 알려주는 5xx - HTTP 응답 코드
코드 | 개요 | 설명 |
500 | Internal Server Error | 서버에서 예상하지 못한 문제가 발생했습니다. |
501 | Not Implemented | 요청한 기능을 지원하지 않습니다. |
502 | Bad Gateway | 게이트웨이로 작업하는 동안 잘못된 응답을 수신했습니다. |
503 | Service Unavailable | 일시적으로 서버를 사용할 수 없습니다. |
504 | Gateway Timeout | 서버가 게이트웨이 역할을 하고 있으며 적시에 응답을 받을 수 없습니다. |
505 | HTTP Version Not Supported | 요청 메시지의 HTTP 프로토콜 버전을 서버가 지원하지 않습니다. |
참고 - https://datatracker.ietf.org/doc/html/rfc2616#section-10, https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
'프로그래밍' 카테고리의 다른 글
Nodejs - MacOS Node 버전 업데이트 하기 (0) | 2022.05.13 |
---|---|
DataGrip - 테이블 DDL을 코틀린 Data Class로 변환하는 스크립트 (0) | 2022.05.11 |
매개변수(Parameter)와 인수(Argument)의 차이점은 무엇일까? (6) | 2022.01.12 |
Gradle - dependencies로 배우는 프로젝트의 의존 관계 구성하기 (1) (0) | 2021.08.23 |
Docker - 도커로 Mariadb 컨테이너 간편하게 설치하기 (1) | 2021.08.20 |