HTTP 프로토콜

2 분 소요

HTTP

HyperText Transfer Protocol 의 약자. HTTP에 ‘Protocol’이 들어가므로 ‘HTTP 프로토콜’은 사실 잘못된 표현이지만 아무튼 네트워크 안에서 웹 서버와 웹 클라이언트가 데이터를 주고받기 위해 사용되는 “통신 규약”의 한 종류라는 점을 기억하자.

TCP/IP 를 기반으로 동작하며 이름대로라면 html이나 xml 같은 하이퍼텍스트 전송용 프로토콜이지만 실제로는 이미지, 음성, 동영상, 자바스크립트 등 데이터라면 무엇이든 전송이 가능하다.

HTTP 메시지 구조

HTTP는 웹 클라이언트가 웹 서버에게 URL을 통해 요청(HTTP request)을 보내면 웹 서버가 요청을 수행하고 그 결과를 응답(HTTP response)으로 다시 웹 클라이언트에게 전달하는 식으로 이루어져 있다.

request와 response 메세지는 아래와 같은 구조를 가지고 있다.

  • 스타트라인(start line) : 요청 메시지일 때는 request line, 응답 메시지일 때는 status_line이라고 부른다.
    • 요청 메시지일 때는 요청 방식(Method), 요청 URL*, 프로토콜 버전으로 구성된다
      • 예) GET /task/annotation HTTP/1.1
    • 응답 메시지일 때는 프로토콜 버전, 상태 코드, 상태 텍스트로 구성된다.
      • 예) Response - HTTP/1.1 200 OK
  • 헤더(header) : body 및 요청/응답에 대한 정보를 포함하는 부분이며 생략이 가능하다.
  • blank line : 헤더와 바디를 구분하기 위한 빈 줄
  • 바디(body) : 요청/응답 관련 본문 혹은 페이로드(payload)가 들어가는 부분이며 헤더와 마찬가지로 생략이 가능하다.

*URL, URI

URL은 Uniform Resource Locator의 약자로 리소스의 위치를 나타내는 주소를 의미하고, URI는 Uniform Resource Identifier의 약자로 리소스 식별자를 의미한다. URI가 URL의 상위 개념이며 그렇기 때문에 URL로도 리소스 식별이 가능하지만 URI로 리소스의 위치를 파악할 수는 없다.

HTTP 처리 방식(method)

HTTP의 메소드는 클라이언트가 보낸 요청을 처리하는 방법을 의미하며, 가장 많이 사용되는 GET과 POST를 포함하여 9가지로 정의되어 있다.

  • GET : 리소스의 취득, CRUD의 Read와 같다
  • POST : 리소스 생성, 리소스 데이터 추가, CRUD의 Create와 같다
  • PUT : 리소스 변경, CRUD의 Update와 같다
  • DELETE : 리소스 삭제, CRUD의 Delete와 같다
  • PATCH* : 리소스 부분 변경
  • HEAD : 리소스의 헤더(메타데이터) 취득
  • OPTIONS : 리소스가 서포트하는 메소드 취득
  • TRACE : 루프백 시험에 사용
  • CONNECT : 프록시 동작의 터널 접속으로 변경

*PATCH

2010년도에 공식 HTTP 표준 메소드로 추가되었다. PUT과 같이 리소스 변경을 처리하는데 PUT은 리소스의 전체를 변경할 때 사용하고 PATCH는 리소스의 일부만을 수정할 때 사용하는 것으로 구분된다.

HTTP 스펙상 구현 방법에 제한이 없으며 그렇기 때문에 처리를 여러번 적용해도 결과가 달라지지 않는, ‘멱등성(Idempotence)’을 가진 PUT과 달리 PATCH는 멱등성을 가지지 않으며 처리 결과가 매번 달라질 수 있다. 이 때문에 의도하지 않은 방식으로 데이터 변경이 일어날 수도 있으므로 유의해야한다.

상태코드

웹 클라이언트가 보낸 요청에 대한 웹 서버의 처리 결과를 알고 싶을 경우 HTTP Response의 상태 코드를 확인하면 된다. 세 자리 숫자로 이루어진 상태코드는 주로 100~500번대 숫자를 사용하며 첫 번째 자리 숫자에 따라 의미를 나누고 있다.

  • 1xx : Informational, 임시적 응답으로 서버가 클라이언트의 요청을 받았으니 클라이언트에서 작업을 계속 진행하라는 정보 전달 목적으로 사용된다.
  • 2xx : Success, 클라이언트의 요청이 서버에서 성공적으로 처리되었음을 의미한다.
    • 200 : OK, 처리 성공
    • 201 : Created, 리소스 생성됨
    • 202 : Accepted, 요청이 접수되어 처리 진행 예정
  • 3xx : Redirection, 완전한 처리를 위해 추가적인 동작을 필요로 함을 의미하며 처리를 위해 어느 URI의 리소스를 시도해볼 것을 알린다.
    • 301 : Moved Permanently, 리소스가 새로운 URI로 이동됨
    • 303 : See Other, 다른 위치로 리소스를 요청할 것을 의미
    • 307 : Temporary Redirect, 임시 리다이렉션. 추후에는 같은 요청을 위해 원래 URI가 계속 사용됨을 알림
  • 4xx : Client Error, 클라이언트에서 보낸 요청이 잘못된 경우를 의미한다.
    • 400 : Bad request, 요청 구문이 잘못되었음
    • 401 : Unauthorized, 리소스에 대한 접근 권한이 사용자에게 없음
    • 403 : Forbidden, 리소스에 대한 접근이 금지되었음 (리소스 존재 자체를 숨겨야 할 경우 404 사용)
    • 404 : Not Found, 리소스를 찾을 수 없음
  • 5xx : Server Error, 요청을 처리하는 과정에서 서버 쪽에서 문제가 발생한 경우를 의미한다.
    • 500 : Internal Server Error, 서버 내부에서 오류가 발생함
    • 502 : Bad Gateway, 게이트웨이 또는 프록시 서버가 그 뒷단의 서버로부터 잘못된 응답을 받음
    • 503 : Service Unavailable, 현재 서버에서 서비스 제공이 불가능함

댓글남기기