멱등하다는 것.
첫번째 수행을 한 뒤 여러차례 시도해도 결과를 변경시키지 않는 작업 또는 기능의 속성
HTTP 메서드의 멱등성 (Idempotent)
동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성 을 가졌다고 말합니다.
메서드가 여러번 실행되어도 결과가 같으므로 안전하게 사용할 수있는 성질
멱등성 메서드엔 어떠한 부수 효과(side effect)도 존재해서는 안됩니다. 올바르게 구현된 REST API의 GET , HEAD , PUT , DELETE , OPTIONS 메서드는 멱등성을 가집니다.
멱등성이 필요한 이유
HTTP 멱등성이 필요한 이유는 요청의 재시도 때문입니다. HTTP요청이 멱등하다면 요청에 실패했을 경우 주저없이 재시도가 가능합니다. 따라서 멱등성을 사용하면 통신오류에 탄력적인 웹서비스 구성이 가능합니다.
HTTP METHOD 특징
GET
URL에 데이터를 포함하여 데이터 조회에 적합하다.
HEAD
GET 메서드 요청과 동일한 응답을 요구하지만, 응답본문을 포함하지 않는다.
요청에서 헤더만 가져올 떄 사용
POST
서버에 데이터를 추가, 작성 시 사용
용량제한은 있지만 Get보다 많은양의 데이터를 보낼 수 있다.
PUT
전체 수정 (대체) 요청 시 사용.
파일 전송 가능
갱신 위주로 사용
DELETE
PATCH
CONNECT
프록시 서버와 같은 중간서버 경유
요청한 리소스에 대해 양방향 연결을 시작하는 메서드
OPTIONS
서버가 어떤 메서드를 지원하는지 알아볼 때 사용한다.
실제 요청을 보내기전에 서버를 테스트하는 용도
curl을 사용해서 OPTION 요청을 서버로 보내으로 서버에서 지원하는 메서드 확인이 가능하다.
curl -X OPTIONS https://endmemories.tistory.com -i
나의 블로그에 요청을 보냈을떄 GET,HEAD,OPTIONS가 허용됨을 알 수 있다.
HTTP/1.1 200
Date: Mon, 03 Jul 2023
Content-Length: 0
T_USERID: d21d7894a
Set-Cookie: REACTION_GUEST=44e
Allow: GET,HEAD,OPTIONS
Accept-Patch:
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
TRACE
원격지 서비스 서버에 루프백
클라이언트가 서버가 전송한 요청을 그대로 반환하기 떄문에 서버에 존재하는 잠재적인 보안취약점이 노출될 수 있다.
+---------+------+------------+
| Method | Safe | Idempotent |
+---------+------+------------+
| CONNECT | no | no |
| DELETE | no | yes |
| GET | yes | yes |
| HEAD | yes | yes |
| OPTIONS | yes | yes |
| POST | no | no |
| PUT | no | yes |
| TRACE | yes | yes |
+---------+------+------------+
안전한 메서드 (Safe Methods)
안전한 메서드란, 서버의 상태나 데이터를 변경하지 않고 리소스를 조회하는 용도로 사용되는 HTTP메서드를 말합니다. 조회에 사용되는 GET, HEAD, OPTIONS, TRACE 와 같이 조회에 사용되는 메서드 들은 안전하다고 말할 수 있다.
안전한 메서드는 멱등하지만, 멱등하다고 해서 안전한 메서드는 아니다.
멱등성이 보장되지 않는 http메서드에 멱등성을 구현하려면.
아래는 토스 기술블로그에 나온 멱등키 지원 방식이다.
요청을 보낼떄 멱등키 API 요청에 포함하여 보낸다. 이전요청과 동일한 멱등키를 가진 요청을 받으면 서버에서 해당 요청을 중복으로 판단한뒤 실제로 처리하지 않고 첫 요청과 같은 응답을 반환하는 방식이다.
요청 본문, URL쿼리 매개변수, 헤더 중 하나에 멱등키를 포함하여 보내면 되는데, IETF(국제 인터넷 표준화 기구)에서는 요청 헤더에 포함하는 방법 을 표준으로 제안 하고 있다.
Idempotency-Key: {IDEMPOTENCY_KEY}
curl --request POST \
--url https://api.tosspayments.com/v1/payments/5zJ4xY7m0kODnyRp/cancel \
--header 'Authorization: Basic dGVzdF9za196WExrS0V5cE5BcldtbzUwblgzbG1lYXhZRzVSOg==' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: SAAABPQbcqjEXiDL' \
--data '{"cancelReason":"고객 변심"}'
헤더에 키를 추가하는 것만으로도 같은 요청이 반복되었는지 식별하여 처리가 가능하다
https://velog.io/@tosspayments/멱등성이-뭔가요
결제 취소 시나리오.
api서버에서는 취소 요청시마다 헤더의 멱등키 존재확인.
멱등키를 저장하기 위한 DB를 구동, 멱등키 포함된 취소요청이 들어왔을때 멱등키 DB를 쿼리 하여 기존에 요청기록이 있는지 확인.
과거 멱등키로 들어온 요청이 있었다면, 저장되어있던 응답데이터 리턴
이전 기록이 없다면 새로 생성딘 응답을 저장한 뒤 응답을 클라이언트에 리턴
정리하자면 특정 http의 요청 메서드가 멱등하지 않은 경우, 멱등성을 제공하기 위해 서버에서 멱등성을 구현할 수 있다. 요청 내부에 멱등성 키를 가지게하여 멱등키 db에 멱등성 키 조회 하는 로직을 추가함으로써 멱등키 DB에 요청에 포함된 키가 DB에 존재 여부에 따라 멱등한 결과를 반환할 수 있다.
요청을 멱등으로 만들면 캐싱된 응답을 반환하여 서버측 처리비용을 점감할 수 있습니다.
https://velog.io/@tosspayments/%EB%A9%B1%EB%93%B1%EC%84%B1%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94
멱등성이 뭔가요?
생소한 표현이지만 알고 보면 쉬워요. 멱등성에 대해 이해하고 API를 멱등하게 제공하기 위한 방법도 함께 알아봐요.
velog.io
https://developer.mozilla.org/ko/docs/Glossary/Idempotent
멱등성 - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN
동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다. 다른 말로는, 멱등성 메
developer.mozilla.org
https://mangkyu.tistory.com/251
[HTTP] HTTP 메소드의 멱등성(Idempotence)과 Delete 메소드가 멱등한 이유
HTTP 메소드의 속성으로 안전, 멱등, 캐시가능이 있는데, 이번에는 그 중에서 멱등이 무엇이고 Patch가 멱등하지 않은 이유와 Delete가 멱등한 이유에 대해서 살펴보도록 하겠습니다. 1. HTTP 메소드의
mangkyu.tistory.com
https://github.com/jojoldu/blog-comments/discussions/589
451 · jojoldu/blog-comments · Discussion #589
Spring Batch의 멱등성 유지하기 프로그래밍에서 자주 사용되는 단어 중에 멱등성 이 있습니다. 이 멱등성을 한마디로 정의 하면 연산을 여러번 적용하더라도 결과가 달라지지 않는 성질 입니다.
github.com
https://stackoverflow.com/questions/45016234/what-is-idempotency-in-http-methods
What is idempotency in HTTP methods?
I've read HTTP documentation, but I can't understand what is idempotency. Can someone help?
stackoverflow.com
https://medium.com/@lyhlg0201/http-method-d561b77df7
HTTP Method
음.. 개발자가 되어서 이런걸 정리하게 될줄은 사실 몰랐다.
medium.com