HTTP 메서드
HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타낸다.
총 9가지 종류가 있다.
주요 메서드 5가지
1. GET
- 리소스를 조회한다.
- 서버에 전달하고 싶은 데이터는 Query를 통해 전달한다.
- 메세지 바디를 사용할 수 있지만 지원하지 않는 곳이 많아 권장하지 않는다.
GET/MEMBER/1
2. POST
- 요청데이터를 처리하며, 주로 데이터 등록에 사용한다.
- 메세지 바디 안에 데이터를 담아 서버로 요청데이터를 전달한다.
- 서버는 요청데이터를 처리한다.
- 메세지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
- 주로 전달된 데이터로 신규 리소스를 등록하며 프로세스 처리에 사용한다.
POST/MEMBER/2
{
"name":"seungkwan",
"age":26
}
3. PUT
- 리소스가 있으면 대체하고 해당 리소스가 없으면 생성한다.
- 데이터를 덮어쓴다는 개념
PUT/MEMNER/2
{
"name":"wonwoo"
}
위와 같이 요청하면 기존에 있던 정보가 아래처럼 덮어씌워진다. (age 라는 정보도 날라감)
{
"name":"wonwoo"
}
4. PATCH
- 리소스를 일부만 변경한다.
- PUT과 마찬가지로 리소스를 수정할 때 사용하지만, 리소스를 일부만 변경할 수 있다.
memeber/1 안에 {"name":"wonwoo", "age":28} 이 있을 때 아래와 같이 요청한다면
// 요청
PATCH/member/1
{
"age":26
}
아래와 같이 변경된다.
name의 정보는 그대로 두고 age에 대한 정보만 수정한다.
{
"name":"wonwoo"
"age":26
}
5. DELETE
- 리소스를 제거할 때 사용한다.
DELETE/member/1
기타 메서드 4가지
HEAD : GET과 동일하지만 메시지 부분을 제외하고,
상태 줄과 헤더만 반환
OPTIONS : 대상 리소스에 대한 통신 가능 옵션을 설명
(주로 CORS에서 사용)
CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
GET vs POST
1. GET은 조회하는 메서드, POST는 데이터 등록하는 메서드
2. BODY의 유무 (GET:X, POST:O)
GET으로 조회할 때 URL 끝에 파라미터로 포함되어 전송되는데, 이를 쿼리 스트링(QueryString)이라고 부른다.
www.example-url.com/resources?name1=전원우&name2=부승관
URL안에 데이터 정보가 들어있을 수 있기 때문에 보안상 GET으로 중요한 정보를 다루면 안된다.
(GET도 메세지 바디를 사용할 수 있지만 지원하지 않는 곳이 많아 권장하지 않는다.)
POST는 전송할 데이터를 HTTP 메세지 바디에 담아 서버로 보낸다.
www.example-url.com/addBoard
POST는 데이터를 전달할 때 메세지 바디 안에 데이터를 담아 서버에 전송하기 때문에 GET보다 비교적 안전하다.
(하지만 크롬의 개발자 도구, Fiddler 로 요청 내용을 확인할 수 있기 때문에 암호화 해야 한다.)
3. 멱등성 (GET:O, POST:X)
멱등성 (idempotent) 은 연산을 여러 번 하더라도 결과가 달라지지 않는 성질을 뜻합니다. API 요청에서 멱등성을 보장하면 같은 요청이 여러 번 일어나도 항상 첫 번째 요청과 같은 결과가 돌아옵니다.
예를 들어 결제 고객이 부분 취소 요청을 했는데 네트워크가 불안정해서 성공 응답이 전송되지 않을 수 있습니다. 결제 고객은 부분 취소가 이루어지지 않았다고 판단하고 다시 요청을 보내서 두 번 취소되는 문제가 생깁니다. 이런 상황에서 멱등키를 사용하면 같은 요청이 여러 번 처리되지 않아 안전합니다.
- tosspayments
GET은 리소스를 조회한다는 점에서 여러 번 요청하더라도 응답이 똑같지만,
POST는 리소스를 새로 생성하거나 업데이트할 때 사용되기 때문에 멱등이 아니라고 볼 수 있다.
(POST 요청이 발생하면 서버가 변경될 수 있다.)
4. 속도
GET방식은 캐싱을 하기 때문에 여러번 요청 시 저장된 데이터를 활용하므로 POST에 비해 비교적 빠르다.
POST vs PUT
둘 다 생성할 수 있지만, PUT은 해당 리소스가 있으면 데이터를 덮어씌운다.
무슨말인지 아래 예제를 통해 이해할 수 있다.
이와 같은 데이터가 있다고 가정한다.
{
"id":1,
"name":"wonwoo",
"age":28
}
POST로 아래 데이터를 생성하기 위해 요청했다.
POST/member
{
"name":"wonwoo",
"age":28
}
그러면 member에는 "id"가 1인 "wonwoo"와 2인 "wonwoo"가 생기게 된다.
그럼 PUT으로 해당 데이터를 요청해보자.
(기본적으로 PUT은 리소스를 수정하는 것이므로 구분할 수 있는 ID를 넣어준다.)
PUT/member/1
{
"age":26
}
원래 {"id":1} 인 데이터에는 맨 위와 같이 이름과 나이 정보가 있는 상태지만,
PUT으로 요청함으로써 {"id":1} 에 해당하는 데이터에는 기존의 정보(이름, 나이)가 사라지고 {"age":26} 이라는 데이만 남게된다.
HTTP 상태코드
1xx번대 (Informational)
요청이 수신되어 처리 중이라는 의미이다.
2xx번대 (Successful)
요청을 성공적으로 받았다는 의미이다.
200 (OK) : 서버가 요청을 제대로 처리했다는 의미.
201 (Created) : 성공적으로 요청되었으며 새로운 리소스가 생성됨
202 (Accepted) : 서버가 요청을 접수했지만 아직 처리되지 않음
204 (No Content) : 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
3xx번대 (Redirection)
요청을 완료하려면 추가 작업이 필요하다는 의미이다.
300 (Multiple Choices) : 서버가 요청에 따라 여러 조치를 선택할 수 있다.
서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나,
요청자가 선택할 수 있는 작업 목록을 제공한다.
301 (Moved Permanently) : 영구적인 URL 리다이렉션을 위해 사용되며,
즉 응답을 수신하는 URL을 사용하는 현재의 링크나 레코드가 업데이트되어야 함을 의미
302 (Found) : 요청한 리소스가 다른 URI에서 응답하고 있다는 의미
303 (See Other) : 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시
304 (Not Modified) : 마지막 요청 이후 요청한 페이지는 수정되지 않았을 때 표시
307 (Temporary Redirect) : 요청한 리소스가 Location 헤더에 주어진 URL 로 임시로 옮겨졌다는 의
(HTTP/1.1 에서 302의 의미를 재정의 하여 추가)
4xx번대 (Client Error)
요청 문법이 잘못되었거나 요청을 처리할 수 없다는 의미로 클라이언트에 오류가 있음을 나타낸다.
400 (Bad Request) : 서버가 요청의 구문을 인식하지 못했다는 의미
401 (Unauthorized) : 클라이언트가 해당 리소스에 대한 엑세스 권한이 없으니 인증이 필요하다는 의미
403 (Forbidden) : 지정한 리소스에 대한 필요 권한을 가지고 있지 않기 때문에 엑세스가 금지되었다는 의미.
404 (Not Found) : 서버가 요청한 페이지(Resource)를 찾을 수 없다는 의
5xx번대 (Server Error)
클라이언트의 요청은 유효하지만 서버에 오류가 있음을 나타낸다.
500 (Internal Server Error) : 서버에 에러가 발생했다는 의미
502 (Bad Gateway) : 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다는 의미
503 (Service Unavilable) : 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다는 의미
대개 일시적인 상태이다.
참고 :
[Network] HTTP란 무엇인가? - 늘 새롭게
4. HTTP 메서드 - Catsbi
[네트워크] get 과 post 의 차이 - 인생의 로그캣
HTTP 상태코드 - 위키백과
HTTP 상태코드 100~500 전체요약 - hongong
'CS공부' 카테고리의 다른 글
쿠키(Cookie)와 세션(Session)의 차이 (0) | 2023.07.21 |
---|---|
동기와 비동기 / 블록과 논-블록 (0) | 2023.07.20 |
[HTTP] HTTP의 개념 및 진화 (0) | 2023.07.13 |
API (애플리케이션 프로그래밍 인터페이스) 란? (0) | 2023.07.07 |
RESTful API 란? (0) | 2023.07.05 |