HTTP(HyperText Transfer Protocol)

5 분 소요


0. 들어가면서

웹 서비스 개발을 하면 가장 많이 접하는 프로토콜이다. 최초에는 HTML 문서를 주고받기 위해 만들어졌다. 인터넷이 발전하면서 HTTP를 기반으로 다양한 서비스들이 등장하면서 처음과 다르게 데이터만 주고받는 가벼운 통신을 위해 사용하고 있다. 오늘은 가장 흔하게 접하는 HTTP 통신을 이해하기 위한 글을 작성하였다.

1. HTTP(HyperText Transfer Protocol)

HTTP(HyperText Transfer Protocol)는 WWW(W3) 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. HTML 문서와 프로토콜의 개념은 무엇일까?

  • HTML(HyperText Markup Language)은 웹 페이지를 만들기 위한 언어이며, 브라우저에서 동작하는 언어다.
  • 프로토콜(Protocol)는 프로토콜이란 통신하는 개체 간에 서로 알아볼 수 있는 데이터 형태로 송수신을 하자는 약속이다.

정리하자면 HTTP는 클라이언트와 서버가 HTML 문서를 주고받는 데 사용하는 프로토콜이다. 최초에는 HTML 문서를 주고받았지만, 현재는 필요에 따라 JSON, Plain Text, XML 등의 형태로 데이터를 주고받는다.

브라우저가 서버와 HTML 문서를 주고받을 떄 아래와 같은 흐름이 일어난다. 사용자는 이 과정을 통해 브라우저에서 웹 페이지를 볼 수 있다.

  1. 사용자가 브라우저의 주소창에 URL 주소를 작성한다.
  2. 브라우저는 해당 URL에 대응하는 서버(호스트)로 사용자의 요청을 전달한다.
  3. 서버는 전달받은 사용자 요청에 대해 적절한 처리 후 HTML 문서를 브라우저에게 전달한다.
  4. 응답받은 브라우저는 사용자가 볼 수 있도록 HTML 문서를 화면으로 시각화(rendering)한다.

2. Message Format in HTTP

클라이언트는 다음과 같은 메시지 형태로 서버에게 데이터를 요청한다.

  • Request Line
    • 요청 방법(method)
    • 경로
    • 프로토콜 버전
  • Request Headers
    • 컨텐츠 타입
    • 압축 정보
    • 사용하는 언어
    • 기타
  • Request Message Body
    • 클라이언트가 서버에게 보내는 메시지
HTTP Message Format 형식(Request Message & Response Message)


서버는 다음과 같은 메시지 형태로 클라이언트에게 응답한다.

  • Status Line
    • 프로토콜 버전
    • 상태 코드
    • 상태 메시지
  • Response Header
    • 컨텐츠 타입
    • 압축 정보
    • 기타
  • Response Body
    • 서버가 클라이언트에게 응답하는 메시지
HTTP Message Format 형식(Request Message & Response Message)

3. Characteristic of HTTP

HTTP 통신은 어떤 특징들이 있는지 알아본다.

3.1. Connectionless

비연결성(connectionless)은 서버가 클라이언트에게 응답을 보낸 후 맺어진 연결을 끊어버리는 것을 의미한다. 서버는 불특정 다수 클라이언트들을 위해 서비스를 제공한다. 한번 요청한 클라이언트와 연결을 계속 유지하는 것은 리소스 사용 측면에서 서버에게 많은 부담을 준다. 그렇기에 서버는 클라이언트의 요청에 대한 응답 후 연결을 유지하지 않는다. 클라이언트 입장에서 생각해보면, 다소 불편함이 있다. 비연결성 특징은 클라이언트가 아직 필요한 요청이 더 있음에도 불구하고 매 요청마다 새로운 연결과 해제 과정을 수행시킨다.

3.2. Stateless

무상태(stateless)는 HTTP 통신의 비연결성으로 인해 발생하는 특징이다. 서버는 클라이언트의 요청에 대해 응답 후 연결을 유지하지 않기 때문에 클라이언트의 상태를 모른다. 서버 입장에서는 항상 새로운 클라이언트로부터 요청을 받는 것이다. 무상태 특징은 클라이언트에게 편리한 서비스를 제공하는 것을 제약한다. 이런 문제를 해결하기 위해 쿠키(cookie)와 세션(session)을 사용한다.

4. How to work HTTP?

  1. 사용자가 웹 브라우저를 통해 찾고 싶은 웹 페이지의 URL 주소를 입력한다.
  2. 브라우저는 사용자가 입력한 URL 주소 중에서 도메인 네임(domain name) 부분을 DNS 서버에서 검색한다.
    • 예를 들어, 'https://www.naver.com/' URL 주소에서 도메인 이름은 'naver.com'이다.
    • 실제 네트워크에서 통신은 IP 주소를 기반으로 수행되기 때문에 해당 URL과 매칭되는 IP 주소를 DNS 서버에서 찾아야 한다.
  3. 웹 페이지 URL 정보와 찾은 IP 주소는 HTTP 기반의 요청 메시지로 작성된다.
  4. HTTP 요청 메시지는 해당 IP 주소를 가진 서버로 전달된다.
  5. 서버는 해당 요청에 대해 적절한 수행 후 클라이언트에게 HTTP 응답 메시지를 전달한다.
  6. HTTP 응답은 다시 네트워크를 거쳐 클라이언트에게 전달된다.
  7. 클라이언트 측에 도착한 HTTP 응답 메시지는 HTTP 프로토콜에 의해 웹 페이지를 만들기 위한 HTML 문서로 변환된다.
  8. 변환된 HTML 문서는 웹 브라우저에 의해 웹 페이지로 출력되며, 사용자가 이를 볼 수 있다.
http://tcpschool.com/webbasic/works

5. HTTP methods

클라이언트가 요청 시 사용하는 HTTP 메서드들에 대해 알아본다.

5.1. Main Methods

가장 많이 사용되는 요청 방식들이다. 알고 있어야 하고 각 메서드들이 어떤 특징을 가지는지 파악하고 있어야 한다.

  • GET Method
    • 서버 측에 존재하는 자원에 대한 요청이다.
    • 요청 파라미터가 URL에 노출되어 보안에 취약하다.
  • POST Method
    • 서버에 새로운 자원을 생성할 때 사용한다.
    • 클라이언트는 서버로 정보를 보낼 때, HTTP 메시지에 담아서 제출한다.
    • 새로운 자원이 생기면 'Location' 헤더에 새로이 작성된 리소스의 URL 주소 정보를 담아 응답한다.
  • PUT Method
    • 서버에 존재하는 자원을 변경한다.
    • POST 방식처럼 정보를 제출하지만 정보 갱신 위주로 사용된다.
    • PUT 메서드는 클라이언트가 서버 측 구현에 관여하는 것이므로 주로 POST 메서드를 사용한다.
  • DELETE Method
    • 존재하는 자원에 대한 삭제를 요청할 때 사용한다.
    • 서버는 요청에 해당하는 리소스를 삭제한다.
    • 통상 동일한 구현이 가능한 POST 메서드 방식으로 대체된다.
  • PATCH Method

5.2. Other Methods

개발할 떄 주로 사용하지는 않지만, 함께 정리하였다.

  • CONNECT Method
  • HEAD Method
    • 메시지 헤더(문서 정보)를 취득할 때 사용한다.
    • GET 요청과 비슷하지만 실제 문서를 요청하는 것은 아닌 메서드이다.
  • TRACE Method
    • 요청 리소스가 수신되는 경로를 보여준다.
    • 해당하는 리소스까지 이동하면서 loop-back 메시지를 전달한다.
  • OPTIONS Method
    • 서버 측에서 제공하는 메서드가 무엇인지 확인할 때 사용한다.
    • 서버는 헤더 정보에 Allow: GET,POST,HEAD 와 같은 방식으로 자신이 처리할 수 있는 요청을 전달한다.

5.3. Summary of HTTP Methods

다음과 같이 표로 정리할 수 있다.

HTTP 메서드 RFC 요청에 Body 존재 여부 응답에 Body 존재 여부 안전 멱등(Idempotent) 캐시 가능
GET RFC 7231 아니오
HEAD RFC 7231 아니오 아니오
POST RFC 7231 아니오 아니오
PUT RFC 7231 아니오 아니오
DELETE RFC 7231 아니오 아니오 아니오
CONNECT RFC 7231 아니오 아니오 아니오
OPTIONS RFC 7231 선택 사항 아니오
TRACE RFC 7231 아니오 아니오
PATCH RFC 5789 아니오 아니오

6. HTTP Status Code

서버가 클라이언트에게 전달해주는 응답의 상태를 의미한다. 어떤 응답 코드들이 있는지 알아보자. 100번대의 상태 코드는 서버와 클라이언트 사이의 정보 교환을 위해 사용한다.

  • 100 - Continue
    • 클라이언트로부터 일부 요청을 받았으니 나머지 요청 정보를 계속 보내주길 바란다.
    • HTTP 1.1에서 처음 등장하였다.
  • 101 - Switching Protocols
    • 서버는 클라이언트의 요청대로 Upgrade 헤더를 따라 다른 프로토콜로 바꿀 것이다.
    • HTTP 1.1에서 처음 등장하였다.

200번대의 상태 코드는 대부분 성공을 의미한다.

  • 200 - Ok
    • 요청에 대한 성공 응답 코드이다.
  • 204 - No Content
    • 성공했으나 응답 본문에 데이터가 없다.
  • 205 - Reset Content
    • 성공했으나 클라이언트의 화면을 새로 고침하도록 권고한다.
  • 206 - Partial Content
    • 성공했으나 일부 범위의 데이터만 반환한다.

300번대의 상태 코드는 대부분 클라이언트가 이전 주소로 데이터를 요청하여 서버에서 새 URL로 리다이렉트를 유도하는 경우이다.

  • 300 - Multiple Choices
    • 최근에 옮겨진 데이터를 요청한 것이다.
  • 301 - Moved Permanently
    • 요청한 자원이 새 URL에 존재한다.
  • 303 - See Other
    • 요청한 자원이 임시 주소에 존재한다.
  • 304 - Not Modified
    • 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고한다.

400번대 상태 코드는 대부분 클라이언트의 코드가 잘못된 경우이다. 유효하지 않은 자원을 요청했거나 요청이나 권한이 잘못된 경우 발생한다.

  • 400 - Bad Request
    • 잘못된 파라미터로 요청한 것이다.
  • 401 - Unauthorized
    • 권한 없이 요청한 것이다.
    • Authorization 헤더가 잘못된 경우이다.
  • 403 - Forbidden
    • 서버에서 해당 자원에 대해 접근 금지라는 응답이다.
  • 405 - Method Not Allowed
    • 서버에서 해당 요청 방법은 지원하지 않는다는 응답이다.
    • 동일한 경로는 존재하지만, 해당 메서드를 지원하지 않는 것이다.
  • 409 - Conflict
    • 최신 자원이 아닌데 업데이트하는 경우이다.

500번대 상태 코드는 서버 쪽에서 오류가 난 경우이다.

  • 501 - Not Implemented
    • 요청한 동작에 대해 서버가 수행할 수 없는 경우이다.
  • 503 - Service Unavailable
    • 서버가 과부하 또는 유지 보수로 내려간 경우이다.

RECOMMEND NEXT POSTS

REFERENCE

카테고리:

업데이트:

댓글남기기