HTTP(HyperText Transfer Protocol)

6 분 소요


서버 개발자라면 가장 많이 접하게 되는 프로토콜입니다. 클라이언트(브라우저)가 서버로 웹 페이지를 요청하여 서버로부터 응답을 받을 때 사용합니다. 단순히 데이터를 주고 받는 REST API 통신도 HTTP 프로토콜을 사용합니다. 해당 프로토콜에 대한 이해도를 높이고자 포스트로 정리하면서 공부해보도록 하겠습니다.

HTTP(HyperText Transfer Protocol) 란?

Wiki
HTTP(HyperText Transfer Protocol)는 WWW(W3) 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다.

정의를 읽어보니 HTML(HyperText Markup Language), 프로토콜(Protocol)에 대한 정의도 알아야겠습니다.

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

HTTP는 클라이언트와 서버가 HTML 문서를 주고 받는데 사용하는 프로토콜이라고 합니다. 대표적으로 HTML 문서를 주고 받지만 HTML 문서만 가능한 것은 아닙니다. 경우에 따라서 JSON, Plain Text, XML 등의 형태로도 데이터를 주고 받습니다. 이번 포스트에서는 이해를 돕기 위해 HTML 문서 송수신을 예시로 정리하였습니다.

사용자는 다음과 같은 일련의 과정을 거쳐서 웹 페이지를 볼 수 있습니다.

  • 사용자가 브라우저에 URL 주소를 작성
  • 브라우저는 해당 URL에 대응하는 서버(호스트)로 사용자의 요청을 전달
  • 서버는 전달 받은 요청에 대해 적절한 처리 후 응답
  • 서버의 응답을 전달 받은 브라우저는 사용자가 볼 수 있도록 HTML 문서를 화면으로 시각화(rendering)
브라우저가 웹 페이지를 보여주기까지 과정

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)


HTTP 특징

HTTP 통신은 어떤 특징이 있는지 알아보겠습니다.

비연결성(Connectionless)

클라이언트와 서버가 연결을 맺은 후 서버가 응답을 마치면 맺은 연결을 끊어버리는 것을 의미합니다. 서버는 불특정 다수의 클라이언트를 위해 서비스를 제공합니다. 한번 요청한 클라이언트와 연결을 계속 유지하는 것은 리소스 사용 측면에서 서버에게 많은 부담을 줍니다. 그렇기에 서버는 클라이언트의 요청에 대한 응답 후 연결을 유지하지 않습니다.

클라이언트 입장에서 생각하면 조금 불편함이 있습니다. 비연결성 특징은 클라이언트가 아직 필요한 요청이 더 있음에도 불구하고 매 요청마다 새로운 연결/해제 과정을 수행시킵니다.

무상태(Stateless)

HTTP 통신의 비연결성으로 인해 발생하는 특징입니다. 서버는 클라이언트의 요청에 대해 응답 후 연결을 유지하지 않기 때문에 클라이언트의 상태를 모릅니다. 서버 입장에서는 항상 새로운 클라이언트입니다. 이런 특징은 클라이언트에게 편리한 서비스를 제공하는데 제약을 주는데 이를 해결하기 위한 것이 쿠키(Cookie)와 세션(Session)입니다. 자세한 내용은 쿠키(Cookie)와 세션(Session) 포스트를 읽어보시면 좋을 것 같습니다.

HTTP 동작 과정

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

이미지 출처, http://tcpschool.com/webbasic/works


HTTP Method

클라이언트가 서버로 요청하는 방식을 의미합니다. 어떤 요청 방법들이 있는지 확인해보도록 하겠습니다.

주요 메소드

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

GET 메소드

  • 서버 측에 존재하는 자원에 대한 요청입니다.
  • 요청 파라미터가 URL에 노출되어 보안에 취약합니다.

POST 메소드

  • 새로운 자원을 생성할 때 사용합니다.
  • 클라이언트는 서버로 정보를 보낼 때 HTTP BODY에 담아서 제출합니다.
  • 새로운 자원이 생기면 Location: 헤더에 새로이 작성된 리소스의 URL 주소 정보를 담아 응답합니다.

PUT 메소드

  • 존재하는 자원에 대한 변경합니다.
  • POST 방식처럼 정보를 제출하지만 정보 갱신 위주로 사용됩니다.
  • PUT 메소드는 클라이언트가 서버 측 구현에 관여하는 것이므로 통상 세밀한 POST 메소드를 주로 사용합니다.

DELETE 메소드

  • 존재하는 자원에 대한 삭제를 요청할 때 사용합니다.
  • 서버는 요청에 해당하는 리소스를 삭제합니다.
  • 통상 동일한 구현이 가능한 POST 메소드 방식으로 대체됩니다.

기타 메소드

주로 사용되지는 않지만 알고 있으면 좋겠죠?😃 함께 정리해보겠습니다.

CONNECT 메소드

HEAD 메소드

  • 메세지 헤더(문서 정보)를 취득할 때 사용합니다.
  • GET 요청과 비슷하지만 실제 문서를 요청하는 것은 아닌 메소드입니다.

TRACE 메소드

  • 요청 리소스가 수신되는 경로를 보여줍니다.
  • 해당하는 리소스까지 이동하면서 loop-back 메세지를 전달합니다.

OPTIONS 메소드

  • 서버 측에서 제공하는 메소드가 무엇인지 확인할 때 사용합니다.
  • 서버는 헤더 정보에 Allow: GET,POST,HEAD 와 같은 방식으로 자신이 처리할 수 있는 요청을 전달합니다.

PATCH 메소드

  • 리소스의 부분만 수정하는데 사용합니다.
  • 서버가 자원을 수정하기 위해 동봉된 엔티티를 처리하는 방식에서 PUT 메소드와 차이가 있습니다.
  • https://tools.ietf.org/html/rfc5789#section-2

HTTP 요청 메소드 별 특징 요약 (출처, https://ko.wikipedia.org/wiki/HTTP)

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 아니오 아니오

HTTP Status Code

서버가 클라이언트에게 전달해주는 응답의 상태를 의미합니다. 어떤 응답 코드들이 있는지 확인해보도록 하겠습니다. 캡틴 판교님의 프런트엔드 개발자가 알아야하는 HTTP 프로토콜 Part 1 포스트를 참고하였습니다.

1xx - 정보 교환

100번대의 상태 코드는 서버와 클라이언트 사이의 정보 교환을 위해 사용합니다.

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

2xx - 성공

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

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

3xx - 리다이렉션

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

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

4xx - 클라이언트 에러

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

  • 400 - Bad Request, 잘못된 요청입니다.
  • 401 - Unauthorized, 권한 없이 요청한 것입니다. Authorization 헤더가 잘못된 경우입니다.
  • 403 - Forbidden, 서버에서 해당 자원에 대해 접근 금지라는 응답입니다.
  • 405 - Method Not Allowed, 허용되지 않은 요청 메서드입니다.
  • 409 - Conflict, 최신 자원이 아닌데 업데이트하는 경우입니다.

5xx - 서버 에러

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

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

OPINION

서버 개발자라면 필히 알아야하는 개념인 HTTP 프로토콜에 대해 3년이 지나서야 정리하다니…😩 늦어도 너무 늦었습니다. 처음 회사에 입사하여 개발자로 프로젝트를 수행하면서 프레임워크, 새로운 기술 스택 이런 부분들에만 너무 현혹되어 기본을 놓치고 있었습니다. 기본에 충실하면 프레임워크나 기술 스택에 대한 러닝 커브는 금새 극복할 수 있다는 것을 이제와서 느끼고 있습니다.

최근에 이직 준비를 하면서 주변 정보와 제가 겪은 면접 질문들을 보면 대체로 아래와 같습니다.

SI 기업
  • Spring 프레임워크 사용할 줄 아십니까?
  • React 사용할 줄 아십니까?
  • Kafka 사용해보셨나요?
IT 서비스 기업
  • HTTP 프로토콜에 대해 설명해주세요.
  • HTTPS 내부 메커니즘에 대해 이야기해주세요.
  • Java가 주 언어이니 JVM에 대해 설명해주실 수 있나요?
  • RDB와 NoSql에 차이점을 알려주실 수 있나요?
  • 스레드가 하나인 어플리케이션에서 Non Blocking IO 방식을 구현할 수 있을까요?

SI 기업들은 대체로 사용한 기술 스택을 사용할 줄 아느냐에 대한 질문이었다면 IT 서비스 기업들은 경력직 지원임에도 불구하고 정말 기본적인 것들에서부터 심오한 질문들까지 물어봅니다. 물론 정확한 답변을 못하는 제 수준도 눈물이 납니다만…😭 일단은 여유가 있으니 준비하는 이 시간을 즐기도록 하겠습니다.

REFERENCE

카테고리:

업데이트:

댓글남기기