HTTP 메서드 속성

younoah·2022년 1월 15일
1

[WEB]

목록 보기
4/7

🤔 HTTP 메서드 속성??

HTTP 메소드는 속성에는 다음과 같이 3가지 속성이 있고 해당 속성별로 메서드를 구분할 수 있다.

  • 안전한 메서드(Safe Methods)

  • 멱등성(Idempotent Methods)

  • 캐싱 가능(Cacheable Methods)


⛑ 안전한 메서드

메소드를 호출해도 리소스를 변경하지 않는다는 특성이다.

서버에 데이터를 변경하지 않는 요청 메서드(안전한 메서드)

  • GET
  • HEAD
  • OPTION
  • TRACE

서버에 데이터를 변경하는 요청 메서드(안전하지 않은 메서드)

  • POST
  • PUT
  • DELETE
  • PATCH

🧿 멱등성

연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 멱등성(idempotence) 이라 한다

"안전한 메서드"와 개념을 혼동하기 쉽다.

안전한 메소드는 서버의 상태를 아예 변경시키지 않는다.

멱등한 메소드는 서버의 상태를 변경시킬 수도 있고, 시키지 않을 수도 있습니다. 다만, 우리가 요청한 사항은 에러가 나거나, 지연이 발생하지 않는 한 요청에 대한 서버의 상태는 항상 같다.

메서드성질
GET, HEAD멱등이고 안전하다 ,
PUT, DELETE멱등이지만 안전하지 않다.
POST, PATCH멱등이지도 안전하지도 않다.

멱등성은 어떻게 판별할까?

멱등성은 '요청의 효과'를 보고 판단한다.

서버의 상태는 멱등성이 유지되어야 하는경우 같은 행위를 여러 번 반복하더라도 같은 효과를 가져야 한다.

멱등성이 성립하지 않으면, 같은 행위를 여러 번 반복하는 경우 요청마다 다른 효과가 발생된다.

멱등성 예시

GET
GET /data

GET요청을 여러 번 수행한다고, 서버의 상태가 변하지도 않고 같은 효과를 기대할 수 있다. 따라서 멱등성과 안전한 메소드가 성립한다.

POST
POST /data

POST 요청을 반복하게 된다면 데이터들은 계속해서 추가가 될 것이고, 그 때 마다 서버의 응답은 다른 응답을 나타내며, 다른 효과를 지닐 것이다. (같은 내용이더라도 서로 다른 데이터이다.)

PUT
PUT /data/3

PUT 요청으로 3번째 Data를 수정한다고 하자. 3번 데이터가 없는 경우 데이터가 생성 될 수 있다. 이미 존재한다면, 데이터는 수정이 된다.

그러면 PUT요청이 여러 번 실행되더라도 3번째 Data는 우리가 요청한 그 값으로 수정된 항상 같은 상태일 것이다.

DELETE
DELETE /data/3

DELETE요청도 마찬가지이다. 이미 존재하든, 존재하지 않든 여러번 요청을 보내도 삭제되어있는 같은 효과의 결과만을 받는다.

PUT은 멱등이고 PATCH는 멱등이 아니다!?

PUT은 해당 리소스를 완전히 교체해 버리기 때문에 멱등이다.

PATCH는 멱등으로 설계할 수도 있지만, 멱등이 아니게도 설계할 수 있다.

  1. 멱등성 케이스
PATCH /data/3
{ name: "kim"}

PUT 메서드처럼 단수히 데이터를 { name: "kim"} 으로 변경하는 요청일 때는 아무리 몇번이고 같은 요청을 보내도 결과는 같기 때문에 멱등성이다.

  1. 멱등성이 아닌 케이스
PATCH /data/3
{ "operation": "add", "age": 10"}

해당 PATCH요청은 요청할 때마다 age를 10씩 더하는 메서드이다. 이러면 매번 요청마다 age가 10씩 더해진 다른 결과를 받게된다. PATCH는 이렇게 설계가 가능하기 때문에 멱등성이 아니라고 할 수 있다.


🗄 캐싱 가능 Cacheable

응답 결과를 서버에 캐싱해서 사용해도 되는 메소드를 의미한다. 캐싱을 해서 데이터를 효율적으로 가져올 수 있다는 뜻이다

GET, HEAD, POST, PATCH가 가능하지만 일반적으로 GET, HEAD 정도만 캐시 하여 사용한다.


참고 사이트
멱등성 MDN

https://velog.io/@dion/HTTP-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

https://www.inflearn.com/questions/110644

profile
console.log(noah(🍕 , 🍺)); // true

0개의 댓글