[HTTP] 웹의 기초 - HTTP 개관

Jade·2021년 2월 28일
0

온라인 커뮤니티로 만난 개발자 분들과 함께 HTTP 스터디를 시작하였다. 700 페이지가 넘는 교재 분량에 압도되지 않기 위해, 매주 일정 분량을 학습하며 이해한 내용들을 꾸준히 정리해나갈 생각이다.

1.1 HTTP: 인터넷의 멀티미디어 배달부

  • HTTP는 전 세계의 웹 서버로부터 수십억개의 이미지, 텍스트, 동영상, 음성 파일 등의 정보를 빠르고, 간편하고, 정확하게 사람들의 PC에 설치된 웹 브라우저로 옮겨준다.
  • HTTP는 신뢰성 있는 데이터 전송 프로토콜을 사용하기 때문에, 데이터가 지구 반대편에서 오더라도 전송 중 손상되지 않음을 보장한다. 이러한 내용은 개발자에게도 이로운데 인터넷의 결함이나 약점에 대한 걱정없이 애플리케이션 개발에만 집중 할 수 있기 때문이다.

1.2 웹 클라이언트와 서버

  • 클라이언트는 서버에게 HTTP 요청을 보내고 서버는 요청된 데이터를 HTTP 응답으로 돌려준다.
  • 가장 흔한 클라이언트는 인터넷 익스플로러나 크롬 같은 웹 브라우저다. 웹 브라우저는 서버에게 HTTP 객체를 요청하고 사용자의 화면에 보여준다.

1.3 리소스

  • 웹 서버는 웹 콘텐츠의 원천인 웹 리소스를 관리하고 제공한다.
  • 가장 단순한 웹 리소스는 웹 서버 파일 시스템의 정적 파일이지만, 리소스는 반드시 정적 파일이어야 할 필요는 없다. 동적 콘텐츠 리소스 등 어떤 종류라도 리소스가 될 수 있다.

1.3.1 미디어 타입

  • 인터넷은 수 천 가지 데이터 타입을 다루기 때문에, HTTP는 웹에서 전송되는 객체 각각에 신중하게 MIME(Multipurpose Internet Mail Extensions, 다목적 인터넷 메일 확장) 타입이라는 데이터 포맷 라벨을 붙인다. 이름에서 알 수 있듯이 원래는 각기 다른 전자메일 시스템 사이에서 메시지가 오갈 때 겪는 문제점을 해결하기 위해 설계 되었으나, 후에는 HTTP에서도 멀티미디어 콘텐츠를 기술하고 라벨을 붙이기 위해 채택되었다.
  • 웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙인다. 웹 브라우저는 서버로부터 객체를 돌려받을 때, 다룰 수 있는 객체인지 타입을 통해 확인한다.
  • MIME 타입은 사선(/)으로 구분된 주 타입(primary object type)과 부 타입(specific subtype)으로 이루어진 문자열 라벨이다. 예를 들면 다음과 같다.
    • text/html: HTML로 작성된 텍스트 문서
    • image/jpec: JPEG 이미지

1.3.2 URI

  • 웹 서버 리소스는 각자의 이름을 갖고 있기 때문에 고유하게 식별하고 위치를 지정할 수 있다. 이를 URI(uniform resource identifier, 통합 자원 식별자)라고 부른다.
  • URI에는 두 가지가 있는데, URL과 URN이라는 것이다. 이 두 종류의 자원 식별자는 다음과 같다.

1.3.3 URL

  • URL(uniform resource locator, 통합 자원 지시자)는 리소스 식별자의 가장 흔한 형태로써, 특정 서버의 존재하는 한 리소스에 대한 구체적인 위치를 서술한다. 예를 들면 다음과 같다.
  • URL은 다음과 같은 세 부분으로 이루어진 표준 포맷을 따른다.
    1. 스킴(scheme): 리소스에 접근하기 위해 사용되는 프로토콜. 보통 HTTP 프로토콜(http://)이다.
    2. 서버의 인터넷 주소: www.yahoo.com
    3. 웹 서버의 리소스: /images/logo.gif

1.3.4 URN

  • URL(uniform resource name, 유니폼 리소스 네임)은 콘텐츠를 이루는 한 리소스에 대해, 그 리소스의 위치에 영향 받지 않는 유일무이한 이름 역할을 한다. 즉 리소스의 이름을 변하지 않게 유지하는 한, 여러 종류의 네트워크 접속 프로토콜로 접근해도 문제 없다.
  • 그러나 URN은 여전히 실험 중인 상태고 널리 채택되지 않았으므로, 통상적인 관례에 따라 URI와 URL을 같은 의미로 사용하는 경우가 많다.

1.4 트랜잭션

  • HTTP 트랜잭션은 클라이언트에서 서버로 보내는 요청 명령과 서버가 클라이언트에게 돌려주는 응답 결과로 구성되어 있다.

1.4.1 메서드

  • HTTP는 메서드라고 불리는 여러 가지 종류의 요청 명령을 지원한다. 모든 HTTP 요청 메시지는 한 개의 메서드를 갖는다. 메서드는 서버에서 어떤 동작이 취해져야 하는지 말해준다. 예를 들어 웹 페이지 가져오기, 파일 삭제하기 등이다.
  • 일반적으로 흔히 쓰이는 HTTP 메서드는 다음과 같다.
    • GET, PUT, DELETE, POST, HEAD

1.4.2 상태 코드

  • 모든 HTTP 응답 메시지는 상태 코드와 함께 반환된다. 상태 코드란 클라이언트에게 요청이 성공했는지 아니면 추가 조치가 필요한지 알려주는 세 자리 숫자다.
  • 일반적으로 흔히 쓰이는 상태 코드는 다음과 같다.
    • 200, 302, 404
  • HTTP는 각 숫자 상태 코드에 텍스트로 된 "사유 구절(reason phrase)"도 함께 보내는데, 이 구문은 단지 설명만을 위해 포함된 것일 뿐 실제 응답 처리에는 숫자로 된 코드가 사용된다.

1.4.3 웹페이지는 여러 객체로 이루어질 수 있다.

  • 애플리케이션은 보통 하나의 작업을 수행하기 위해 여러 HTTP 트랜잭션을 수행한다. 웹 페이지는 하나의 리소스가 아닌 리소스의 모음이므로, 각각 별개의 HTTP 트랜잭션을 필요로 한다.

1.5 메시지

  • HTTP 메시지는 다음의 세 부분으로 이루어진다.

시작줄
메시지의 첫 줄로, 요청이라면 무엇을 해야 하는지 응답이라면 무슨 일이 일어났는지 나타낸다.

헤더
시작줄 다음에 오는 0개 이상의 헤더 필드이다. 각 헤더 필드는 쌍점(:)으로 구분되어 있는 하나의 이름과 하나의 값으로 구성된다. 헤더 필드를 추가 하려면 그저 한 줄을 더하기만 하면 되며, 헤더는 빈 줄로 끝난다.

본문
빈 줄 다음에는 필요에 따라 메시지 본문이 올 수 있다. 요청의 본문은 주로 웹 서버로 데이터를 실어보내며, 응답의 본문은 클라이언트로 데이터를 반환한다.

1.6 TCP 커넥션

  • 메시지가 어떻게 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 커넥션을 통해 한 곳에서 다른 곳으로 옮겨가는지 알아보자.

1.6.1 TCP/IP

  • 애플리케이션 계층 프로토콜인 HTTP는 네트워크 통신의 핵심적인 세부 사항에 대해 신경쓰지 않는다. 대신 그 내용을 TCP/IP에게 맡긴다. TCP는 다음을 제공한다.
    • 오류 없는 데이터 전송
    • 순서에 맞는 전달(데이터는 언제나 보낸 순서대로 도착함)
    • 조각나지 않는 데이터 스트림(언제든 어떤 크기로든 전송 가능)
  • TCP/IP는 TCP와 IP가 층을 이루는, 패킷 교환 네트워크 프로토콜의 집합이다. 각 네트워크와 하드웨어의 특성을 숨기고, 어떤 종류의 컴퓨터나 네트워크든 서로 신뢰성 있는 있는 의사소통을 가능하게 해준다.

1.6.2 접속, IP 주소 그리고 포트번호

  • HTTP 클라이언트가 서버에 메시지를 전송할 수 있게 되기 전에, 인터넷 프로토콜(IP, Internet protocol)주소와 포트 번호를 사용해 클라이언트와 서버 사이에 TCP/IP 커넥션을 맺어야 한다.
  • HTTP 서버의 IP주소와 포트번호는 URL을 이용하여 알아낼 수 있다.

1.7 프로토콜 버전

  • 오늘날 쓰이고 있는 HTTP 프로토콜 버전은 다음과 같이 여러 가지 버전이 있다.
    • HTTP/0.9
    • HTTP/1.0
    • HTTP/1.0+
    • HTTP/1.1
    • HTTP/2.0

1.8 웹의 구성요소

1.8.1 프락시

  • 클라이언트와 서버 사이에 위치하여 클라이언트의 모든 HTTP 요청을 받아 (대개 요청을 수정한 뒤) 서버에 전달한다.
  • 주로 보안을 위해 사용된다. 즉, 모든 웹 트래픽 흐름 속에서 신뢰할 만한 중개자 역할을 한다.
  • 또한 요청과 응답을 필터링한다. 예를 들어 학생들에게 성인 콘텐츠를 차단할 수 있다.

1.8.2 캐시

  • 웹캐시와 캐시 프락시는 자신을 거쳐가는 문서들 중 자주 찾는 것의 사본을 저장해 두는, 특별한 종류의 HTTP 프락시 서버다. 다음번에 클라이언트가 같은 문서를 요청하면 그 캐시가 갖고 있는 사본을 받을 수 있다.
  • 클라이언트는 멀리 떨어진 웹 서버보다 근처의 캐시에서 훨신 더 빨리 문서를 다운 받을 수 있다.
  • HTTP는 캐시를 효율적으로 동작하게 하고 캐시된 콘텐츠를 최신 버전으로 유지하면서 동시에 프라이버시 보호를 위한 많은 기능을 정의한다.

1.8.3 게이트웨이

  • 다른 서버들의 중개자로 동작하는 특별한 서버. 주로 HTTP 트래픽을 다른 프로토콜로 변환하기 위해 사용된다.
  • 게이트웨이는 언제나 스스로가 리소스를 갖고 있는 진짜 서버인 것처럼 요청을 다루기 때문에 클라이언트는 자신이 게이트웨이와 통신하고 있음을 알아채지 못할 것이다.

1.8.4 터널

  • 두 커넥션 사이에서 raw 데이터를 열어보지 않고 그대로 전달해주는 HTTP 애플리케이션이다. 주로 비 HTTP 데이터를 하나 이상의 HTTP 연결을 통해 그대로 전송해주기 위해 사용된다.
  • 대표적인 예로 암호화된 SSL 트래픽을 HTTP 커넥션으로 전송함으로써 웹 트래픽만 허용하는 사내 방화벽을 통과시키는 것이 있다.

1.8.5 에이전트

  • 사용자를 위해 HTTP 요청을 만들어주는 클라이언트 프로그램이다. 웹 요청을 만드는 애플리케이션은 어떤것이든 HTTP 에이전트라고 말할 수 있다.

📌 데이빗 고울리, 브라이언 토티, 마조리 세이어, 세일루 레디, 안슈 아가왈 공저 이응준, 정상일 공역, 『HTTP 완벽 가이드: 웹은 어떻게 동작하는가』, 인사이트(2014)

profile
우당탕탕 좌충우돌 인프라 여행기

0개의 댓글