클라이언트와 서버의 request, response 과정 속 HTTP/1.1에서 사용할 수 있는 메서드에 대해 알아보자. 어떤 종류가 있고, 각 종류는 어떤 특징을 갖고 있을까?
✉️ HTTP 메시지 구조
- Header + Body로 나뉘어 진다.
- Header에는 주소 정보, 메서드 방식, 클라이언트 정보, 브라우저 정보, 접속 URL 등의 정보를 담는다.
- Body에는 보통 비어 있다가 필요시 데이터 정보가 포함된다.
📨 메서드를 사용해 지시를 내리다
- request를 보내는 경우 메서드라고 불리는 명령이 있다.
- 메서드는 리소스에 어떠한 행동을 하기 원하는지를 지시하기 위해 존재한다.
- 메서드에는 GET, POST, PUT, DELETE 등이 있다.
- 메서드는 대문자와 소문자를 구별하기 때문에 대문자로 기재해야 한다.
지금부터 HTTP/1.0과 HTTP/1.1에서 제공하고 있는 메서드를 알아보자!
GET (조회)
- 리소스 획득.
- GET 메서드는 리퀘스트 URI로 식별된 리소스를 가져올 수 있도록 요구한다.
- 파라미터가 URI에 포함되기 때문에 HTTP 헤더에 포함되어 서버에 요청된다.
- 때문에 HTTP의 body는 비어있다.
- 서버는 리소스를 해석해 결과를 내보낸다.
- 멱등성(결과가 달라지지 않는 성질)을 가진다.
- 자원의 상태를 변화시키지 않아 안정적이다.
- HTTP 메서드는 서버의 상태를 바꾸지 않으면 그 메서드가 안전하다고 말한다.
- 캐싱이 되는 특징을 갖고 있어 POST보다 속도가 빠르다.
- 아이디나 패스워드가 URL에 포함되면 보안에 취약하므로 유의해야 한다.

URI vs URL
URI는 리소스를 식별하기 위해 문자열 전반을 나타내는데 비해 URL은 리소스의 장소(네트워크 상의 위치)를 나타냅니다. URL은 URI의 서브셋임.
POST (생성)
- 데이터 전송.
- 요청 유형은
Content-Type
헤더로 나타낸다.
- URL에 요청 데이터를 기록하지 않고, 데이터를 HTTP 바디에 넣어 전송한다.
- 데이터 전송에 대한 제한이 없으므로, 많은 양의 데이터를 전송할 수 있다.

POST 방식이 GET 방식보다 안전할까?
POST든 GET이든 보내는 데이터는 전부 클라이언트 측에서 볼 수 있다. 단지 GET 방식은 URL에 데이터가 표시되어 더 쉽게 볼 수 있어서지, 두 방식 모두 보안을 생각한다면 암호화를 해야 한다.
PUT (변경)
- 새로운 리소스를 생성하거나 데이터를 대체한다.
- PUT 자체에 인증 기능이 없어 누구든지 파일을 업로드 가능하다는 보안 상의 문제도 있어서 일반적인 웹 사이트에서는 사용되지 않고 있다.

PUT vs POST
PUT과 POST의 차이는
멱등성
으로, PUT은 멱등성을 가집니다. PUT은 한 번을 보내도, 여러 번을 연속으로 보내도 같은 효과를 보입니다. 즉, 부수 효과가 없습니다.DELETE (삭제)
- 지정한 리소스를 삭제한다.
- PUT 메서드와 같이 인증 기능이 없어 일반적인 웹 사이트에서는 사용되지 않고 있다.

HEAD
- HEAD 메서드는 GET과 같은 기능이지만 메시지 바디는 돌려주지 않는다.
- URI 유효성과 리소스 갱신 시간을 확인하는 목적 등으로 사용된다.
OPTIONS
- 제공하고 있는 메소드를 문의한다.
- 예를 들어, OPTIONS 메서드를 request하면 response로 허락된 GET, POST 등 서버가 제공하고 있는 메서드를 돌려준다.
TRACE
- 경로를 추적한다.
- 크로스 사이트 트레이싱(XST)과 같은 공격을 일으키는 보안 상의 문제가 있어 보통은 사용되지 않는다.
CONNECT
- 프록시에 터널 접속 확립을 요함으로써, TCP 통신을 터널링 시키기 위해서 사용된다.
- 주로 SSL이랑 TLS 등의 프로토콜로 암호화된 것을 터널링 시키기 위해서 사용되고 있다.
🛡️ 멱등성
- 동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말한다.
- 올바르게 구현한 경우 GET, HEAD, PUT, DELETE 메서드는 멱등성을 가지며, POST 메서드는 그렇지 않다.
- 모든 안전한 메서드는 멱등성 또한 갖지만, 모든 멱등성을 지닌 메서드가 안전한 것은 아니다. 예컨대 PUT과 DELETE는 둘 다 멱등성을 가졌지만 안전하지는 않은 메서드다.
DELETE 메서드가 멱등성을?

DELETE /idX/delete HTTP/1.1
의 상태 코드는 응답마다 달라질 수 있지만, 그럼에도 멱등성을 가진다.
- REST API에서 개발자는 DELETE 메서드를 사용해 "목록의 마지막 항목 제거" 기능을 구현해서는 안된다.
멱등성 관련 기술 지식 정리
- 멱등성 메서드 문서: GET, HEAD, PUT, DELETE, OPTIONS, TRACE
- 비 멱등성 메서드 문서: POST, PATCH, CONNECT
참고자료 :
<그림으로 배우는 Http&Network Basic> ch.2