출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식 (by 김영한 님)
HTTP 메서드
리소스와 행위를 분리
URI는 리소스만 식별한다.
리소스와 해당 리소스를 대상으로 하는 행위를 분리하자
- 리소스 : 회원
- 행위 : 조회, 등록, 삭제, 변경
HTTP 메서드 종류
-
주요 메서드 종류
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스 부분 변경
- DELETE : 리소스 삭제
-
기타 메서드
- HEAD : GET과 동일하나 메시지 부분을 제외하고, 상태∙헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션 설명
- CONNECT : 대상 리소스로 식별되는 서버에 대한 터널 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트 수행
GET

리소스 조회
- 서버에 전달하고 싶은 데이터는 query를 통해서 전달
- 메시지 바디를 사용해 데이터를 전달할 수 있으나 권장 X
POST

요청 데이터 처리
- 메시지 바디를 통해 서버로 요청 데이터 전달하고 서버는 요청 데이터를 처리
- 요청 데이터를 어떻게 처리하는 가?
- 새 리소스 생성(등록)
- 요청 데이터 처리
단순 데이터 생성∙변경을 넘어선 프로세스를 처리해야하는 경우
즉, POST의 결과로 리소스가 새로 생성되지 않을 수 있음
- 다른 메서드로 처리하기 애매한 경우
e.g. JSON으로 조회 데이터를 넘겨야 하는데, GET 메서드 사용하기 어려운 경우
PUT
리소스를 대체
- 리소스가 있으면 ⇒ 대체
- 리소스가 없으면 ⇒ 생성
- POST와 차이점 : 클라이언트가 리소스 위치를 알고 URI 지정 (즉, 클라이언트가 리소스를 식별)
PATCH

리소스 부분 변경
DELECT
리소스 제거
HTTP 메서드의 속성
- 안전(Safe)
- 호출해도 리소스를 변경하지 않는다.
- 계속 호출해서 로그가 쌓여 장애가 발생하는 경우, 해당 리소스에만 안전을 고려한다.
- 멱등(Indempotent)
- f(f(x))=f(x)
- 몇 번을 호출하더라도 결과가 같음
- 멱등 메서드
- GET : 항상 같은 결과가 조회됨
- PUT : 결과를 대체하는 메서드이므로 최종 결과는 항상 같음
- DELETE : 결과를 삭제하는 메서드이므로 최종 결과는 항상 같음
- POST : 멱등이 아님! 두 번 호출하면 같은 결제가 중복해서 발생 가능
- 활용
- 자동 복구 메커니즘
- 서버가 타임아웃 등으로 정상 응답을 주지 못했을 때, 클라이언트가 같은 요청을 다시 해도 되는지에 대한 판단 근거가 된다.
- 재요청 중간에 다른 곳에서 리소스를 변경해버리면 그렇게 변경된다. 외부 요인까지 고려해주진 않는다.
- 캐시가능(Cachable)
- 응답 결과 리소스를 캐시해서 사용해도 되는가에 대한 이야기
- GET, HEAD, POST, PATCH 캐시 가능 (보통은 GET, HEAD 정도만 사용)
HTTP 메서드 활용
클라이언트에서 서버로 데이터 전송
[ 데이터 전달 방식 ]
- 쿼리 파라미터를 통한 데이터 전송
- 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH
- 회원 가입, 상품 주문, 리소스 등록, 리소스 변경
[ 4가지 상황 ]
- 1. 정적 데이터 조회 : 쿼리 파라미터 미사용

- 이미지, 정적 텍스트 문서
- 조회는 GET 사용
- 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능
- 2. 동적 데이터 조회 : 쿼리 파라미터 사용

- 주로 검색, 게시판 목록에서 정렬 필터 (검색어)
- 조회 조건을 줄여주는 필터 / 조회 결과를 정렬하는 정렬 조건에 사용
- 조회는 GET을 사용
- 3. HTML Form 데이터 전송

- HTML Form submit시 POST 전송 (GET 전송도 가능)
- Content-Type : application/x-www-form-urlencoded 사용
- form의 내용을 메시지 바디를 통해 전송(쿼리 파라미터 형식)
- 전송 데이터를 url encoding 처리
- Content-Type : multipart/form-data
- 파일 업로드 같은 바이너리 데이터 전송 시 사용
- 다른 종류의 여러 파일과 폼의 내용을 함께 전송 가능
- 4. HTTP API 데이터 전송

- 서버to서버 - 백엔드 시스템 통신
- 앱 클라이언트 - 아이폰, 안드로이드
- 웹 클라이언트 - HTML에서 Form 전송 대신 자바 스크립트를 통한 통신에 사용(AJAX)
e.g. React, VueJS (웹 클라이언트)와 API 통신
- POST, PUT, PATCH : 메시지 바디를 통해 데이터 전송
- GET : 조회, 쿼리 파라미터로 데이터 전달
- Content-Type : application/json (표준) - TEXT, JSON, XML 등
HTTP API 설계 예시
HTTP API - 컬렉션
POST 기반 등록
e.g.) 회원 관리 API 제공
컬렉션(Collection)
- 서버가 관리하는 리소스 디렉토리
- 서버가 리소스의 URI를 생성하고 관리
[ API 설계 ]
- 회원 목록 /members -> GET
- 회원 등록 /members -> POST
- 회원 조회 /members/{id} -> GET
- 회원 수정 /members/{id} -> PATCH, PUT, POST
- 회원 삭제 /members/{id} -> DELETE
[ 신규 자원 등록 특징 ]
- 클라이언트는 등록될 URI를 모른다.
- 서버가 새로 등록된 리소스 URI를 생성해준다.
- 여기서 컬렉션은 /members
HTTP API - 스토어
PUT 기반 등록
e.g.) 정적 컨텐츠 관리, 원격 파일 관리
스토어(store)
- 클라이언트가 관리하는 리소스 저장소
- 클라이언트가 리소스 URI를 알고 관리
[ API 설계 ]
- 파일 목록 /files -> GET
- 파일 등록 /files/{filename} -> PUT
- 파일 조회 /files/{filename} -> GET
- 파일 삭제 /files/{filename} -> DELETE
- 파일 대량 등록 /files -> POST
[ 신규 자원 등록 특징 ]
- 클라이언트가 리소스 URI를 알고 있어야 한다.
- 클라이언트가 직접 리소스의 URI를 지정한다.
- 여기에서 스토어는 /files
특징
- GET, POST만 지원
- 컨트롤 URI
- GET, POST만 지원하므로 제약이 있음
- 해결하기 위해 동사로 된 리소스 경로 사용
- 컨트롤 URI - /new, /edit, /delete
- HTTP 메서드로 해결하기 애매할 때 사용
[ API 설계 ]
- 회원 목록 /members -> GET
- 회원 등록 폼 /members/new -> GET
- 회원 등록 /members/new, /members -> POST
- 회원 조회 /members/{id} -> GET
- 회원 수정 폼 /members/{id}/edit -> GET
- 회원 수정 /members/{id}/edit, /members/{id} -> POST
- 회원 삭제 /members/{id}/delete -> POST
HTTP 상태 코드
상태 코드
: 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능
- 1xx (Informational): 요청이 수신되어 처리중
- 2xx (Successful): 요청 정상 처리
- 200 OK : 요청 성공
- 201 Created : 요청 성공해서 새로운 리소스 생성됨
- 202 Accepted : 요청이 접수되었지만 처리가 완료되지 않았음
- 204 No Content : 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터 無
- 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요
- 영구 리다이렉션 : 특정 리소스의 URI가 영구적으로 이동 (301, 308)
- 일시 리다이렉션 : 일시적인 변경 (302, 307, 303)
- 특수 리다이렉션 : 결과 대신 캐시 사용 (300, 304)
- 4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
- 400 Bad Request : 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음
- 401 Unauthorized : 클라이언트가 해당 리소스에 대한 인증이 필요함
- 403 Forbidden : 서버가 요청을 이해했지만 승인을 거부함
- 404 Not Found : 요청 리소스를 찾을 수 없음
- 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함
- 500 Internal Server Error : 서버 문제로 오류 발생
- 503 Service Unavailable : 서비스 이용 불가