HTTP 메서드

jkpapa·2023년 5월 9일
0

HTTP

목록 보기
4/5

HTTP 메서드는 클라이언트가 서버에 요청을 보낼 때, 요청의 종류나 목적을 나타내는 방식이다. HTTP메서드는 리소스와 행위를 분리하는 역할을 한다.

백엔드의 API URI를 설계할 때 가장 중요한 것은 리소스의 식별이다. 만약 하나의 리소스에 대해서 조회, 등록, 수정, 삭제의 기능을 하는 URI를 각각 따로만들면 리소스를 식별하기 어려울 것이다.

/resource/get
/resource/add
/resource/edit
/resource/delete

HTTP 메서드는 리소스와 행위(메서드)를 분리하여 URI는 리소스만 식별 하도록 한다. 리소스에 대한 행위를 구분하는 HTTP 메서드에는 대표적으로 GET, POST, PUT, DELETE가 있다.

GET /resource
POST /resource
PUT /resource
DELETE /resource

HTTP 메서드 종류

GET

GET메서드는 서버에서 특정 리소스를 가져오기(조회하기) 위해 사용된다. 클라이언트가 서버에게 특정 URI에 대한 GET요청을 보내면, 서버는 해당 리소스를 반환한다.

GET요청은 브라우저에서 웹 페이지를 요청하고, 서버에서 해당 웹 페이지를 반한하는 과정에서 가장 많이 사용된다. 브라우저는 URI 주소를 입력하거나 링크를 클릭하면 해당 페이지를 서버에게 GET 요청으로 보내고, 서버는 요청된 페이지를 반환한다.

  • 클라이언트의 GET 요청 HTTP Request Header
GET /members/100 HTTP/1.1
HOST: localhost:8080
  • GET 요청에 대한 서버의 HTTP Reponse Header
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34

{
  "username": "young",
  "age": 20
}

HTTP GET 요청은 요청 바디를 가지지 않는다.(가질 수는 있지만 안씀) 대신 요청한 리소스의 쿼리 파라미터(query parameter)를 URI에 포함하여 서버에게 전달하고 싶은 데이터를 보내 특정 요청을 보낼 수 있다.

쿼리 파라미터는 URI에서 사용되는 일종의 매개변수다. key=value형태로 전달되며 ?로 시작해 파라미터와 값은 &로 구분한다.

예를 들어, http://example.com/search?q=hello&page=1와 같은 URL은 q=hello, page=1라는 쿼리 파라미터를 포함하는 요청이다.

구글에 hello를 검색하면 https://www.google.com/search?q=hello 와 같이 쿼리 파라미터를 포함한 URL을 서버로 요청한다.

하지만, 보안상의 이유로 GET 요청으로 쿼리 파라미터에 민감한 정보(비밀번호, 신용카드 정보 등)을 전송하는 것은 좋지 않다. GET 요청은 URL에 쿼리 파라미터가 노출되므로, 누군가가 해당 URI을 가로채서 쿼리 파라미터를 확인할 수 있다. 따라서 민감한 정보를 전송해야 할 때는 POST나 다른 안전한 방식을 사용하는 것이 좋다.

POST

POST메서드는 서버로 데이터를 전송할 때 사용하는 HTTP 메서드 중 하나이다. GET과 달리 POST는 데이터를 요청 URI에 포함시키지 않고, 요청 본문(request body)에 담아 전송한다.

HTTP POST는 주로 다음과 같은 경우에 사용한다.

  • 사용자가 입력한 데이터를 서버에 전송할 때
  • 서버의 데이터를 업데이트 또는 생성할 때
  • 파일 업로드와 같은 대용량 데이터를 전송할 때

HTTP POST 요청에는 요청 본문에 데이터를 담아 보내기 때문에 GET 요청보다 보안성이 높다.

GET 요청에 경우 URL에 데이터를 담아 보내기 때문에 URL에 데이터가 노출되어 제 3자에게 노출될 가능성이 있다.

하지만, request body에 데이터를 담는다고 해서 보안에서 자유로울 수 있는 것은 아니다. 요청 본문에 담긴 데이터를 암호화하지 않는다면, 제 3자가 데이터를 가로채어 확인할 수 있다.

데이터를 암호화하는 데는 SSL/TLS를 사용(https)하고 요청이 유효한지는 보안 토큰(CSRF token)을 사용해 확인해야 한다고 한다.

  • 클라이언트의 POST 요청 HTTP Request Header
POST /members HTTP/1.1
Content-Type: application/json

{
  "username": "young",
  "age": 20
}
  • 서버의 POST 요청에 대한 HTTP Response Header
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100

{
  "username": "young",
  "age": 20
}

위 헤더에서 Location은 새로이 만들어진 리소스의 URI이다.

HTTP POST 요청을 처리하는 서버는 요청 본문에서 전달된 데이터를 읽어들여 데이터베이스에 업데이터하거나 새로운 데이터를 생성하는 등 요청에 포함된 표현을 처리한다. 이러한 작업이 완료되면, 서버는 일반적으로 상태코드 200을 반환하며, 클라이언트에게 업데이트 된 결과를 알려준다.

PUT

PUT메서드는 클라이언트에서 서버로 데이터를 전송할 때 사용된다. PUT은 POST와 마찬가지로 request body에 데이터를 담아 전송한다.

PUT 요청은 일반적으로 다음과 같은 상황에서 사용된다.

  • 리소스를 업데이트 할 때, 리소스가 없으면 새로운 리소스를 생성한다.

예를 들어, 블로그 포스트의 내용을 업데이트하거나 새로운 블로그 포스트를 생성할 때 PUT요청을 사용할 수 있다.

PUT 요청에서는 요청한 리소스의 식별자를 클라이언트가 요청 URL에 명시해줘야 한다. 이는 서버가 어떤 리소스를 업데이트하거나 생성해야 하는지 알 수 있도록 하기 위함이다. URI에 리소스 식별자를 포함하지 않고 요청하는 POST 방식과의 차이점이다.

PUT /members/100 HTTP/1.1
Content-Type: application/json

{
  "username": "old",
  "age": 50
}

💡 PATCH메서드로 리소스를 부분적으로 수정할 수 있다.

PATCH /members/100 HTTP/1.1
Content-Type: application/json

{
  "age": 50
}

100번째 회원의 나이만 수정하겠다는 요청이다.

DELETE

DELETE메서드는 서버에서 특정 리소스를 삭제하기 위해 사용한다. DELETE요청은 URI에 지정된 리소스를 서버에서 삭제하도록 요청한다.

DELETE /members/100 HTTP/1.1
HOST: localhost:8080

HTTP 메서드 속성

Safe Methods

Safe Methods는 리소스를 변경하지 않고 서버로부터 리소스에 대한 정보를 요청하는 메서드를 의미한다. 이러한 속성을 갖는 메서드는 클라이언트가 서버에게 요청을 보낼 때, 의도적으로 리소스를 수정하거나 삭제하지 않는다는 것을 나타낸다.

대표적인 Safe Methods는 GET 메서드이다. GET 메서드는 서버에서 리소스를 가져오기만한다. 나머지 메서드들은 리소스에 변경을 일으킬 수 있기 때문에 Safe Method에는 속하지 않는다.

이렇듯 Safe Methods는 리소스에 대한 요청을 보내더라도, 서버의 상태를 변경하지 않는다. 따라서 클라이언트는 의도하지 않은 리소스 수정 또는 삭제와 같은 실수를 방지할 수 있다.

Idempotent

Idempotent 속성은 같은 요청을 여러 번 보내더라도 항상 같은 결과를 반환하는 특성을 의미한다. 이러한 특성은 여러 번의 요청이 중복되어 발생할 수 있는 네트워크 환경에서 안정성을 보장하는데 중요한 역할을 한다.

Idempotent 속성을 가지는 HTTP 메서드들은 다음과 같다.

  • GET: 같은 요청을 여러 번 보내도 항상 같은 응답(요청한 데이터)을 반환한다.

  • PUT: 같은 리소스에 대해 같은 요청을 여러 번 보내도 같은 결과가 발생한다.

    • PUT은 리소스를 변경하는데, 기존의 데이터를 덮어쓰는 행위를 한다. 따라서 같은 요청을 여러번하면 같은 내용의 데이터를 덮어쓰는 것과 같으므로 결과는 항상 같다.
  • DELETE: 같은 리소스에 대해 같은 삭제 요청을 여러번 보내면 첫 번째 요청에서 리소스가 삭제된다. 그 이후에는 삭제 할 리소스가 없으므로 아무일도 하지 않아 같은 결과를 반환한다.

POST는 왜 Idempotent에 속하지 않을까?

만약 리소스에 접근해 새로운 데이터를 만들기 위해 POST로 요청했다고 가정해보자. 같은 요청을 여러번 보낼때, POST 요청 URI에는 PUT과 달리 리소스에 식별자를 포함하지 않으므로 같은 내용의 데이터를 반복적으로 추가하게 될 것이다. 이는 항상 같은 결과를 반환하는 Idempotent 속성에 부합하지 않는다.

같은 결과를 반환하는 속성을 활용하면 자동 복구 메커니즘에 사용할 수 있다. Idempotent는 서버가 응답을 제대로 주지 못하였을 때, 클라이언트 측에서 같은 요청을 다시해도 되는가에 대한 판단 근거가 될 수 있다.

HTTP 메서드는 요청의 목적에 따라 다양하게 사용된다. 이러한 HTTP 메서드들을 적절하게 사용하여 RESTful API를 설계하면, 서버와 클라이언트 간의 통신을 보다 간편하고 효율적으로 처리 할 수 있다.

0개의 댓글