diff --git a/assets/client-server.png b/assets/client-server.png
new file mode 100644
index 000000000..3f2ab55d0
Binary files /dev/null and b/assets/client-server.png differ
diff --git a/assets/dict-naver.png b/assets/dict-naver.png
new file mode 100644
index 000000000..673672b50
Binary files /dev/null and b/assets/dict-naver.png differ
diff --git a/assets/different-request.png b/assets/different-request.png
new file mode 100644
index 000000000..fd099ab18
Binary files /dev/null and b/assets/different-request.png differ
diff --git a/assets/duplicate-request.png b/assets/duplicate-request.png
new file mode 100644
index 000000000..6c5e01368
Binary files /dev/null and b/assets/duplicate-request.png differ
diff --git a/assets/idempotency-key1.png b/assets/idempotency-key1.png
new file mode 100644
index 000000000..4ef3cd171
Binary files /dev/null and b/assets/idempotency-key1.png differ
diff --git a/assets/idempotency-key2.png b/assets/idempotency-key2.png
new file mode 100644
index 000000000..75e67e777
Binary files /dev/null and b/assets/idempotency-key2.png differ
diff --git a/assets/idempotent-signup1.png b/assets/idempotent-signup1.png
new file mode 100644
index 000000000..a6ab89927
Binary files /dev/null and b/assets/idempotent-signup1.png differ
diff --git a/assets/idempotent-signup2.png b/assets/idempotent-signup2.png
new file mode 100644
index 000000000..fbf3b55c3
Binary files /dev/null and b/assets/idempotent-signup2.png differ
diff --git a/assets/idempotent-signup3.png b/assets/idempotent-signup3.png
new file mode 100644
index 000000000..6b0967e21
Binary files /dev/null and b/assets/idempotent-signup3.png differ
diff --git a/assets/idempotent-signup4.png b/assets/idempotent-signup4.png
new file mode 100644
index 000000000..1fe15e7a4
Binary files /dev/null and b/assets/idempotent-signup4.png differ
diff --git a/assets/ietf-idempotency.png b/assets/ietf-idempotency.png
new file mode 100644
index 000000000..aa858d6e8
Binary files /dev/null and b/assets/ietf-idempotency.png differ
diff --git a/assets/mdn-idempotency.png b/assets/mdn-idempotency.png
new file mode 100644
index 000000000..5a79178cd
Binary files /dev/null and b/assets/mdn-idempotency.png differ
diff --git a/assets/signup1.png b/assets/signup1.png
new file mode 100644
index 000000000..d4bde1df4
Binary files /dev/null and b/assets/signup1.png differ
diff --git a/assets/signup2.png b/assets/signup2.png
new file mode 100644
index 000000000..dc2274b51
Binary files /dev/null and b/assets/signup2.png differ
diff --git a/assets/signup3.png b/assets/signup3.png
new file mode 100644
index 000000000..a433f484d
Binary files /dev/null and b/assets/signup3.png differ
diff --git a/assets/signup4.png b/assets/signup4.png
new file mode 100644
index 000000000..dee7d4c61
Binary files /dev/null and b/assets/signup4.png differ
diff --git a/assets/signup5.png b/assets/signup5.png
new file mode 100644
index 000000000..917615106
Binary files /dev/null and b/assets/signup5.png differ
diff --git a/assets/signup6.png b/assets/signup6.png
new file mode 100644
index 000000000..d69c79558
Binary files /dev/null and b/assets/signup6.png differ
diff --git a/technical-writing.md b/technical-writing.md
index 2a194a0ed..46ee539ad 100644
--- a/technical-writing.md
+++ b/technical-writing.md
@@ -1,119 +1,526 @@
-# 1. 프론트엔드 주요 보안 이슈, XSS와 CSRF
+# 들어가며
-프론트엔드 개발에서 보안은 간과하기 쉬운 영역이지만, 웹 애플리케이션의 안전성과 사용자 데이터를 보호하기 위해 필수적인 요소이다. 특히 크로스 사이트 스크립팅(XSS)과 교차 사이트 요청 위조(CSRF)는 프론트엔드에서 자주 발생하는 주요 취약점으로, 각각 브라우저와 웹사이트 간의 신뢰 관계를 악용한다는 공통점이 있다.
+이 글은 아래의 독자들을 대상으로 멱등성과 멱등키에 대해 설명하는 글이다.
-XSS는 "브라우저가 웹 사이트를 신뢰해서 생기는 취약점"이다. 사용자가 입력한 악성 스크립트가 브라우저에서 실행되면서, 사용자 세션 하이재킹이나 민감한 데이터 유출을 초래할 수 있다. 반면, CSRF는 "웹 사이트가 브라우저를 신뢰해서 생기는 취약점"이다. 공격자는 사용자가 인지하지 못한 상태에서 악의적인 요청을 웹 사이트로 전송하게 만들어, 사용자의 의도와 무관한 데이터 변경이나 작업이 이루어지도록 한다.
+- **멱등성** / **멱등키** 키워드를 접해봤지만 그 **의미를 잘 모르는** 개발자
+- **언제 멱등성을 보장해야 하는지** 모호하게 느껴지는 개발자
+- **API에서 어떻게 멱등성을 보장할 수 있는지** 궁금한 개발자
-# 2. 크로스 사이트 스크립팅 (XSS)
+독자는 이 글을 통해 다음의 결과를 얻을 수 있을 것이다.
-## 2.1. XSS란?
+- 멱등성 / 멱등키의 **등장 배경 및 개념**을 명확히 이해한다.
+- **API 멱등성 적용에 대한 기준**을 마련한다.
+- **멱등한 API의 설계 방법을 이해하고 직접 적용**할 수 있다.
-크로스 사이트 스크립팅(XSS)은 웹 애플리케이션 보안에서 가장 흔하게 발견되는 취약점 중 하나로, 사용자 입력에 대한 적절한 검증 및 필터링이 부족할 때 발생한다. XSS는 웹 페이지에 삽입된 악성 스크립트가 브라우저에서 실행되도록 하여, 공격자가 사용자에게 부적절한 콘텐츠를 표시하거나, 사용자 권한을 가로채는 등의 악의적인 행동을 가능하게 한다. XSS는 주로 사용자가 신뢰하는 웹 사이트가 공격자의 악성 스크립트를 그대로 실행하도록 만드는 데 기인한다.
+# 목차
-## 2.2. XSS의 공격 예시
+1. 멱등성이란?
+ 1. 사전적 의미
+ 2. HTTP에서 말하는 멱등성
+2. HTTP 메서드별 멱등성
+3. 멱등한 API 설계는 왜 필요한가?
+ 1. 예시: 외부 API가 포함된 회원가입 로직 중복 실행
+ 2. 시스템 외부 환경은 완전하지 않다
+4. 멱등한 API는 어떻게 만들 수 있을까?
+ 1. 중복 요청을 누가, 어떻게 구별할까?
+ 2. 중복 요청을 서버에서 어떻게 처리할까?
+5. 서버 코드 예시 살펴보기
+6. 모든 API가 멱등해야 할까?
+7. 마무리
-XSS 공격은 사용자가 방문한 웹사이트에서 악성 스크립트를 실행시키는 방식으로 이루어진다. 예를 들어, 공격자가 XSS 취약점이 존재하는 블로그에 게시글이나 댓글을 작성하면서 와 같은 스크립트를 삽입했다고 가정해보자. 이 경우, 다른 사용자가 해당 페이지를 방문할 때 이 스크립트가 브라우저에서 실행되어 경고 창이 표시된다. 이 단순한 예시는 공격자가 악성 코드를 사용하여 웹사이트에서 무엇이든 실행할 수 있음을 보여준다.
+# 1. 멱등성이란?
-또 다른 예로, 한 쇼핑몰 사이트에서 리뷰 작성 기능이 있다고 가정해보자. 공격자가 리뷰 작성란에 와 같은 코드를 삽입한다면, 이 리뷰를 읽는 사용자의 세션 쿠키가 공격자의 사이트로 전송된다. 이 세션 쿠키를 통해 공격자는 사용자의 인증된 세션을 도용하여, 사용자의 계정에 접근하거나, 악의적인 행위를 할 수 있게 된다. 이러한 공격은 웹 애플리케이션에서 입력 데이터를 제대로 검증하지 않았을 때 발생할 수 있는 위험을 잘 보여준다.
+혹시 외부 API _(예: 결제 API)_ 를 적용하는 과정에서 **멱등키**를 마주친 적이 있는가?
+이처럼 중요한 데이터를 다루는 API에서 멱등키, 멱등성이 적용되는 사례를 종종 발견할 수 있다.
-## 2.3. XSS의 영향
+하지만 여기서 **'멱등'** 이라는 단어 자체도 생소하게 느껴질 수도 있다.
+따라서 사전적 의미를 먼저 살펴본 다음, HTTP에서 멱등성이 갖는 의미가 무엇인지 이해해 보자.
-XSS는 다양한 방식으로 웹 애플리케이션과 사용자의 보안을 위협한다. 가장 심각한 문제는 세션 하이재킹이다. 공격자는 사용자의 세션 쿠키를 가로채어, 사용자가 로그인한 상태를 도용할 수 있다. 이를 통해 공격자는 사용자의 권한을 무단으로 획득하여, 민감한 데이터에 접근하거나, 계정을 임의로 조작할 수 있다.
+## 1.1 사전적 의미
-또한, XSS를 이용해 사용자의 브라우저에서 악성 코드를 실행함으로써 사용자의 시스템에 직접적인 피해를 줄 수도 있다. 예를 들어, 공격자는 XSS를 통해 키로거(Keylogger)나 피싱 공격을 실행하는 스크립트를 삽입할 수 있다. 이러한 스크립트는 사용자가 입력하는 모든 키 입력을 기록하거나, 사용자로 하여금 가짜 로그인 페이지에 로그인하도록 유도하여 자격 증명을 탈취할 수 있다.
+
-또한, XSS는 웹 애플리케이션의 신뢰도를 심각하게 저하시킬 수 있다. 공격자가 웹 사이트에 악성 콘텐츠를 삽입하면, 사용자는 해당 사이트를 신뢰하지 않게 되고, 이는 사이트의 평판에 큰 영향을 미친다. XSS는 단순히 기술적인 문제가 아니라, 사용자와 웹 애플리케이션 간의 신뢰 관계를 훼손하는 심각한 보안 위협으로 작용한다. 이러한 이유로 XSS는 모든 웹 개발자가 반드시 이해하고, 방어해야 하는 중요한 보안 이슈이다.
+[네이버 국어사전](https://ko.dict.naver.com/#/entry/koko/3b4f7ca2ddb64633a9607112fb4af0e0)에 따르면 멱등성을 **"연산을 여러 번 적용하더라도 결괏값이 달라지지 않는 성질"** 이라고 설명한다.
-## 2.4. XSS 취약점 대책
+그렇다면 HTTP에서 말하는 멱등성은 무엇을 의미할까?
-### 1. 입력 데이터의 검증
+## 1.2 HTTP에서 말하는 멱등성
-사용자 입력 데이터의 검증은 XSS 방지를 위한 가장 중요한 단계 중 하나이다. 웹 애플리케이션은 모든 사용자 입력을 신뢰해서는 안 되며, 입력된 데이터가 악의적인 의도를 가지고 있을 가능성을 항상 염두에 두어야 한다. 따라서, 모든 사용자 입력은 반드시 철저하게 검증되고, 필터링되어야 한다.
+[MDN 문서](https://developer.mozilla.org/en-US/docs/Glossary/Idempotent)와 [IETF 문서](https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/)에 따르면 각각 다음과 같이 설명한다.
-첫 번째로, 사용자 입력을 HTML 콘텐츠에 직접 삽입하기 전에 특수 문자를 이스케이프 처리해야 한다. 이는 <, >, &, ", ' 등의 특수 문자가 HTML 태그나 속성으로 인식되는 것을 방지하기 위한 조치이다. 이러한 문자가 변환되지 않고 그대로 브라우저에 전달되면, 공격자가 삽입한 스크립트가 그대로 실행될 수 있기 때문이다. 예를 들어,