HTTP 메소드는 클라이언트가 웹 서버에게 요청의 목적이나 종류를 알리는 수단이다.
📌GET
GET 메소드는 데이터를 읽거나 검색하는 등 리소스를 조회할 때 사용한다. 그냥 단순히 리소스를 조회할 때만 사용하는 것이므로 데이터를 수정하는 연산에는 사용하면 안된다.
리소스 조회하는 메소드이기 때문에 요청시에 Body값이 비워져있다. 만약 특정 데이터를 조회하고 싶어서 GET방식에서 보낼 데이터가 있을 때에는 URL 주소에 파라미터를 붙여서 보내면 된다.
아래 [더보기]를 클릭하여 이미지를 참고하면 알 수 있듯이 데이터 조회에 성공한다면 Body 값에 데이터 값을 저장하여 성공 응답을 보낸다.
1. 클라이언트가 100번째 회원 정보 달라고 요청한다.
2. 서버는 해당하는 데이터를 가져와 응답 메시지를 만들어 클라이언트에게 보낸다.
📌POST
POST 메소드는 주로 요청 데이터를 처리하거나 새 리소스를 생성(등록)할 때 사용한다. 또한 다른 메소드로 처리하기 애매한 경우에 사용한다.
다른 메소드로 처리하기 애매한 경우에 대한 예를 들도록 하겠다. 예를 들어 JSON으로 조회를 위한 데이터를 넘겨야 하는데, GET 메소드를 사용하기에는 애매하다. 때문에 이 경우 POST 메소드를 사용한다. POST 메소드로 조회가 가능하다고 GET 메소드 대신에 POST 메소드를 사용하는 것은 옳지 않다. GET 메소드로 조회를 하면 캐싱을 할 수 있기 때문에 조회엔 되도록 GET을 쓰는 것이 좋다.
1. POST 방식으로 데이터를 서버에 보낸다.
2. 서버는 POST로 전달된 메시지를 신규 등록하라는 요청으로 받고 처리한다.
3. 서버는 응답 메시지를 보낸다. 이때, 자원이 생성된 경로(Location)와 데이터도 보낼 수 있다.
📌PUT
PUT 메소드는 리소스를 대체(수정)할 때 사용하며, 만약 해당 리소스가 없으면 생성(등록)한다. 즉 리소스를 덮어쓰기 할때 사용한다.
클라이언트가 리소스 위치를 알고 URI를 지정한다는 것이 POST와의 차이점이다.
예를 들어 PUT 메소드: /members/100 POST 메소드: /members 이다.
1.100번째 회원에게 리소스를 보내겠다고 요청한다.
2. 기존에 데이터가 있다면 수정되고 없다면 등록된다.
만약 요청을 보낼 때 "age":50 만 보낸다면 어떻게 될까?
데이터가 덮어씌워져서 username필드는 삭제되고 age필드만 남게된다.
📌PATCH
PATCH메소드는 리소스를 일부만 변경할 때 사용한다.
PATCH메소드를 사용하면 PUT메소드를 보냈을 때와는 다르게 덮어씌워지는 것이 아닌 해당 리소스만 변경되는 것을 알 수 있다. 아래 [더보기]를 클릭하여 예시를 확인하면 이해하는데 도움이 될 것이다.
1. 100번째 회원에게 리소스를 보내겠다고 요청한다.
2. 해당 리소스가 변경된다.
📌DELETE
DELETE 메서드는 지정된 리소스를 삭제할 때 사용한다.
데이터를 삭제하는 것이기 때문에 요청시에 body 값이비워져있다. URL을 통해서 어떠한 데이터를 삭제할지 파라메터를 받는다.
1. 제거할 위치를 지정하여 보낸다.
2. 해당 위치 리소스가 제거된다.
📌HTTP 메소드의 속성
💡안전
메소드를 호출해도 리소스가 변경되지 않는다는 뜻이다.
GET은 단순 조회만 하기 때문에 안전하다. POST, DELETE, PATCH, PUT은 당연히 안전하지 않다.
GET이 안전하다고 해도 계속 호출해서 수 많은 로그를 쌓다가 서버가 터져버린다면?
→ 안전은 해당 리소스가 변하는지 여부만 고려하기 때문에 이런 부분은 신경쓰지 않아도 된다.
💡멱등
한 번 호출하든, 두번 호출하든, 100번 호출하든 결과가 항상 동일하다는 뜻이다.
- GET: 몇 번 호출하든 같은 결과가 조회된다.
- PUT: 똑같은 파일에 똑같은 요청을 하면 기존 것을 날리고 새로운 것을 덮기 때문에 항상 같다.
- DELETE: 같은 요청을 여러 번 해도 삭제된 결과는 같다.
- POST: 멱등이 아니다. 두 번 호출하면 같은 결제가 중복으로 발생할 수 있다.
멱등 활용 범위
- 자동 복구 메커니즘
- 서버가 TIMEOUT 등으로 정상 응답을 주지 못했을 때, 클라이언트가 같은 요청을 해도 되는지에 대한 판단 근거가 된다.
하지만 재요청을 하는 중간에 다른 곳에서 리소스를 변경해버린다면 멱등이 적용되지 않는 건 아닐까?
- 사용자 1: GET username: A, age: 20
- 사용자 2: PUT username: A, age: 30
- 사용자 1: GET username: A, age:30
- 사용자 2의 PUT 때문에 바뀐 데이터를 조회한다.
멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지 않는다.
💡캐시 가능
응답 결과로 온 리소스를 캐시에 저장해두고 사용해도 될까?
GET, HEAD, POST, PATCH는 캐시가 가능하다. 하지만 실제로는 GET과 HEAD만 캐시로 사용한다. 캐시를 사용하려면 똑같은 리소스랑 키가 맞아야 하는데, POST와 PATCH는 본문 내용까지 고려하기가 복잡하기 때문이다. 반면 GET은 딱 URI만 키로 잡고 캐시하면 돼서 간단하다.
reference - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한)
'CS > HTTP' 카테고리의 다른 글
HTTP 상태코드 (0) | 2022.07.09 |
---|---|
HTTP 메소드 활용 (0) | 2022.07.09 |
HTTP 요청(request)/응답(response) 메시지 구조 (0) | 2022.07.09 |
HTTP 프록시란? (0) | 2022.07.08 |
HTTP 프로토콜이란? (0) | 2022.07.08 |