정의
클라이언트가 서버에 요청하는 방식클라이언트가 서버에 어떤 동작을 요청할지를 나타내는 방식입니다.
RESTful API 설계의 핵심 요소 중 하나로, 각 메서드는 특정 목적에 맞게 사용됩니다.
서버의 상태를 변경하지 않는지(안정성), 동일 요청을 여러 번 보내도 결과가 같은지(멱등성) 고려해야 합니다.
GET - 조회 ( 안전, 멱등 )
서버의 리소스를 조회합니다.GET
GET 메서드 정의서버로부터 리소스를 조회할 때 사용되는 메서드입니다. 요청 시 본문이 없고, 데이터를 변경하지 않습니다.특징💬 멱등성 보장: 몇 번 호출해도 결과가 같음📦 URL에 파라미터
develop-enchantment.tistory.com
POST - 생성 ( 비안전, 비멱등 )
서버에 데이터를 전송하여 리소스를 생성합니다.POST
종류정의리소스를 생성하거나 서버에 데이터를 전송하는 메서드POST는 클라이언트가 서버에 데이터를 전송하여 새로운 리소스를 생성하거나 서버 측 처리를 요청할 때 사용됩니다.일반적으로
develop-enchantment.tistory.com
PUT - 전체 수정 ( 멱등 )
지정된 리소스를 전체 대체합니다.PUT
종류 정의리소스를 생성하거나 완전히 대체하는 데 사용되는 메서드PUT은 클라이언트가 서버에 지정한 리소스를 완전히 덮어쓰기하거나 새 리소스를 생성할 때 사용됩니다.요청 본문에 포함된
develop-enchantment.tistory.com
DELETE - 삭제( 멱등 )
지정된 리소스를 삭제합니다.DELETE
종류 정의리소스를 삭제할 때 사용하는 메서드DELETE는 클라이언트가 서버의 특정 리소스를 삭제하도록 요청할 때 사용됩니다.RESTful API에서는 CRUD의 Delete 작업에 해당합니다.특징리소스를 제거
develop-enchantment.tistory.com
HEAD - 메타 정보 조회 (안전, 멱등)
응답 본문 없이 헤더만 반환합니다.HEAD
종류정의리소스의 헤더 정보만 조회하는 HTTP 메서드HEAD는 서버에 리소스를 요청할 때 본문 없이 응답 헤더 정보만 반환합니다.다운로드 여부, 캐시 유효성 검사, 존재 확인 등에서 유용하게 사
develop-enchantment.tistory.com
OPTIONS - 지원 메서드 확인 (안전, 멱등)
서버가 해당 리소스에서 지원하는 메서드를 반환합니다. CORS(교차 출처 리소스 공유) 요청 시 사전 확인용으로 사용됩니다.
- 안전성(Safe): O
- 멱등성(Idempotent): O
- 사용 예: CORS 프리플라이트 요청
TRACE - 경로 반사 (보안상 비권장)
요청을 그대로 서버에 반사하여 네트워크 경로를 추적하는 용도입니다. 보안 취약점 노출 위험이 있어 대부분의 서버에서는 비활성화되어 있습니다.
- 안전성(Safe): O
- 멱등성(Idempotent): O
- 사용 예: 디버깅 용도 (실제 사용 거의 없음)
CONNECT - 터널링 (HTTPS 등 특수 목적)
프록시 서버를 통해 SSL 터널을 설정하는 데 사용됩니다. 클라이언트와 서버 간에 암호화된 연결이 필요할 때 사용됩니다.
- 안전성(Safe): X
- 멱등성(Idempotent): X
- 사용 예: HTTPS 프록시 요청
정의
Idempotent & Safe 메서드 구분Idempotent & Safe 메서드 구분
- 안전(Safe): 서버의 상태를 변경하지 않음 (예: GET, HEAD, OPTIONS)
- 멱등(Idempotent): 동일 요청을 여러 번 보내도 결과가 같음 (예: GET, PUT, DELETE, HEAD, OPTIONS)
- 비멱등: 요청이 서버 상태를 변경하거나, 여러 번 실행 시 결과가 달라짐 (예: POST, PATCH)
사용 예제 코드 (JavaScript - fetch)
// GET 요청
fetch('/api/users')
.then(res => res.json())
.then(data => console.log(data));
// POST 요청
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Alice', age: 30 })
});
// PUT 요청
fetch('/api/users/1', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Alice', age: 31 })
});