Backend/Internet

[Internet] What is HTTP? (4) _ HTTP 요청 메서드, HTTP 상태 응답 코드

lakelight 2022. 7. 10. 12:38
728x90
반응형

HTTP 요청 메서드

클라이언트가 웹서버에게 요청하는 목적이나 그 종류를 알리는 수단으로 "HTTP 동사" 라고도 부릅니다. 최초의 HTTP 는 GET 메소드 하나뿐이었지만 이후 다양한 메소드들이 등장했습니다.

요청 메서드의 위치는 HTTP 요청 메시지의 첫째줄 첫째항에 나타납니다.

ex) GET /localhost:8080/member HTTP/1.1
사용해봤던 요청 메서드

개발을 하면서 주로 조회를 할 때 GET을 사용하고 로그인이나 사용자 개인정보를 확인하여 사용자 식별을 할 때는 개인정보가 포함되어 있으므로 개인정보를 Request Body에 담아서 POST를 사용합니다.

데이터를 업데이트할 때는 PUT을 사용하고 삭제할 때는 DELETE를 사용합니다. 제가 사용했던 요청 메서드는 GET, POST, PUT, DELETE 이렇게 4가지가 있습니다.

HTTP 요청 메서드 종류

GET

특정 리소스를 조회합니다. GET을 사용하는 요청은 대부분 데이터 (리소스)를 받기만 합니다. 서버에 전달하고 싶은 데이터가 있다면 query parameter를 통해 전달합니다. 메시지 바디 (Request Body)를 통해서 데이터를 전달할 수는 있지만 지원하지 않는 곳이 있으니 쓰지 않는 것을 추천합니다. 

POST

특정 리소스에 엔티티(Request Body)를 제출할 때 쓰입니다. 리소스 요청을 처리하고, 메시지 바디를 통해 서버로 데이터를 전달합니다. 주로 신규 리소스를 등록하거나 프로세스를 처리하는데 사용합니다. 이는 종종 서버의 상태나 변화나 부작용을 일으킵니다.

PUT

특정 소스를 대체(대상을 변경하기도, 저장하기도 한다는 의미)합니다. 만약 리소스가 없다면 리소스를 생성합니다. 보통 리소스를 업데이트할 때 사용합니다. 덮어쓰기 라고 생각하면 이해가 쉬울 것 같습니다. 
PUT 메서드는 URL에 담긴 정보로 엔티니를 식별할 수 없다면 생성까지 해야하기 때문에 엔티티의 필요한 모든 정보를 payload에 실어서 보내야합니다. [멱등성을 지킵니다.]

PATCH

PUT과 마찬가지로 리소스를 수정할 때 사용하지만 PATCH는 리소스를 일부분만 변경할 수 있습니다. Request Body를 받는 DTO를 별도로 만들어 부분 에디터를 받아 엔티티를 수정할 수 있습니다. PATCH는 새로운 엔티티를 생성하지는 못하기 때문에 엔티티의 정보를 모두 보내지 않아도 됩니다. [멱등성을 지키지 못합니다.]

DELETE

특정 리소스를 삭제합니다. (회원 삭제, 게시글 삭제, 댓글 삭제 등등)

CONNECT

목적 리소스로 식별되는 서버로의 터널을 맺습니다.

OPTIONS

목적 리소스의 통신을 설정하는데 쓰입니다. 주로 CORS에서 사용합니다.

HEAD

GET 메서드의 요청과 동일한 응답을 요구하지만, 메시지 부분을 제외하고 상태 줄과 헤더만 반환합니다.

TRACE

목적 리소스의 경로를 따라 메시지 loop-back 테스트 (아래 더보기 참조) 를 합니다.

더보기

*loop-back 테스트는 한 통신 장비에서 신호를 보내 그 신호가 일정 구간의 회선을 거친 뒤 다시 원점으로 되돌아오도록 하는 시험으로서, 이는 해당 장비가 올바르게 작동하는지를 알아보거나, 또는 네트웍 상에서 동작하지 않는 노드를 규명하는 시험 방법으로 많이 쓰인다. (출처:terms.co.kr의 loopback test)

HTTP 요청 메서드 속성

안전(Safe Methods)

계속해서 메서드를 호출해도 리소스를 변경하지 않는다는 의미입니다. 주요 메서드 중에서 GET 메서드가 안전하다고 볼 수 있습니다. 왜냐하면 조회만 하고 다른 데이터를 수정하거나 생성하지 않기 때문입니다.

멱등(Idempotent Methods)

계속 호출해도 결과가 같다는 의미입니다. GET PUT DELETE는 멱등하다고 볼 수 있지만 데이터를 생성하거나 부분적으로 수정하는 POST PATCH는 멱등하다고 볼 수 없습니다.

캐시가능(Cacheable Methods)

캐싱을 해서 데이터를 효율적으로 가져올 수 있다는 의미입니다. GET HEAD POST PATCH가 캐시가 가능하고 실제로는 GET HEAD만 주로 캐싱이 사용된다고 합니다.

HTTP 상태 코드

클라이언트가 보낸 요청의 처리 상태를 Response 값에서 알려주는 기능입니다.

보통 100~500번대를 사용하는데 크게 아래와 같이 나눌 수 있습니다. 

  • 1xx (Informational): 요청이 수신되어 처리되고 있는 상태입니다.
  • 2xx (Successful): 요청이 성공적으로 전달되었고 정상적으로 처리된 상태입니다.
  • 3xx (Redirection): 요청을 완료를 위한 추가행동이 필요한 상태입니다.
  • 4xx (Client Error): 클라이언트의 오류로, 잘못된 문법이나 요청을 처리할 수 없는 상태입니다.
  • 5xx (Server Error): 서버 오류로, 데이터베이스나 서버 자체 오류로 요청을 처리하지 못하는 상태입니다.

HTTP 상태 코드 종류

1xx (Informational)

  • 100(계속) - 요청자는 요청을 계속해야합니다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 의미합니다.
  • 101(프로토콜 전환) - 요청자는 서버에 프로토콜 전환을 요청했으며 서버는 이를 승이하는 중입니다.

2xx (Successful)

  • 200(성공) - 서버가 요청을 제대로 처리했다는 의미입니다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰입니다. 
  • 201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했습니다.
  • 202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았습니다.
  • 203(신뢰할 수 없는 정보): 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있습니다.
  • 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠가 없습니다.
  • 205(콘텐츠 재설정): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않습니다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구합니다.
  • 206(일부 콘텐츠): 서버가 GET 요청의 일부만 성공적으로 처리했습니다.

3xx (Redirection)

  • 300(여러 선택항목): 서버가 요청에 따라 여러 조치를 선택할 수 있습니다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공합니다.
  • 301(영구 이동): 요청한 페이지를 새 위치로 영구적으로 이동했습니다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달됩니다. (이벤트가 만료된 페이지, 새로운 홈페이지 url을 만들고 만약 전 url로 접속하려고 한다면 301을 보내주고 새로운 홈페이지로 redirect해줍니다.)
  • 302(임시 이동): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 합니다.
  • 303(기타 위치 보기): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시합니다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달합니다.
  • 304(수정되지 않음): 마지막 요청 이후 요청한 페이지는 수정되지 않았습니다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않습니다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고 함)을 표시하도록 서버를 구성해야 합니다.
  • 305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있습니다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 합니다.
  • 307(임시 리다이렉션): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 합니다.

4xx (Client Error)

  • 400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했습니다.
  • 401(권한 없음): 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있습니다. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝습니다.
  • 402(결제 필요): 이 요청은 결제가 필요합니다.
  • 403(Forbidden, 금지됨): 서버가 요청을 거부하고 있습니다. 예를 들자면, 사용자가 리소스에 대한 필요 권한을 갖고 있지 않습니다. (401은 인증 실패, 403은 인가 실패라고 볼 수 있음)
  • 404(Not Found, 찾을 수 없음): 서버가 요청한 페이지(Resource)를 찾을 수 없습니다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공합니다.
  • 405(허용되지 않는 메소드): 요청에 지정된 방법을 사용할 수 없습니다. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우, 또는 읽기 전용 리소스에 PUT 요청을 보내는 경우에 이 코드를 제공합니다.
  • 406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없습니다.
  • 407(프록시 인증 필요): 이 상태 코드는 401(권한 없음)과 비슷하지만 요청자가 프록시를 사용하여 인증해야 합니다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 합니다.
  • 408(요청 시간초과): 서버의 요청 대기가 시간을 초과하였습니다.
  • 409(충돌): 서버가 요청을 수행하는 중에 충돌이 발생했습니다. 서버는 응답할 때 충돌에 대한 정보를 포함해야 합니다. 서버는 PUT 요청과 충돌하는 PUT 요청에 대한 응답으로 이 코드를 요청 간 차이점 목록과 함께 표시해야 합니다.

5xx (Server Error)

  • 500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없습니다.
  • 501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없습니다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시합니다.
  • 502 (Bad Gateway, 불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았습니다.
  • 503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없습니다. 이는 대개 일시적인 상태입니다.
  • 504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했습니다.
  • 505(HTTP 버전이 지원되지 않음): 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않습니다.
  • 507(용량 부족, WebDAV)
  • 508(루프 감지됨, WebDAV)
  • 509(대역폭 제한 초과, Apache bw/limited extension)

자세한 내용

 

[참고]

1. 정보통신기술용어해설-HTTP Request Method

2. [WEB] HTTP Request Method (HTTP 요청 메소드) - what is programming[티스토리]

3. mdn web docs - 개발자를 위한 웹 기술 - HTTP 요청 메서드

4. 자원을 수정하는 HTTP 메서드 - PUT vs PATCH

 

728x90
반응형