도서 HTTP 완벽 가이드를 읽고 알게 된 지식을 정리한 글입니다.
HTTP가 무엇인가?
HTTP는 웹 상에서 클라이언트와 서버가 소통할 수 있도록 하는 프로토콜이다. 웹에서, 클라이언트와 서버는 HTTP라는 양식에 맞춰 리소스를 요청하고 응답한다.
리소스
- 웹 서버가 관리하고 제공하는 자원이다.
- 웹 리소스에는 정적 파일과 동적 리소스가 있다.
- 텍스트 파일, 워드 파일, 이미지 파일, HTML 파일 등은 정적 파일이다.
- 동적 리소스는 요청에 따라 각기 다른 콘텐츠를 생산한다. 이는 주식 거래, 전자 상거래, 검색엔진 등에 활용된다.
미디어 타입
웹은 수천 가지의 데이터 타입을 다룬다. 때문에 모든 HTTP 객체에는 MIME(Multipurpose Internet Mail Extensions) 타입이 필요하다. 웹 브라우저는 MIME 타입을 통해 자신이 다룰 수 있는 데이터인지 확인하고, MIME 타입에 따라 데이터를 다룬다.
MIME 타입
- 주 타입 + 부 타입
- HTML로 작성된 텍스트 문서: text(주 타입)/html(부 타입)
- plain ASCII 텍스트 문서: text/plain
- JPEG 이미지: image/jpeg
- PPT: application/vnd.ms-powerpoint
URI, URL, URN
URI
- 통합 자원 식별자
- 리소스의 위치를 고유하게 식별하고 위치를 지정할 수 있다.
- URL과 URN으로 구분된다.
URL
- 통합 자원 지시자
- 특정 서버의 한 리소스에 대한 구체적인 위치를 서술한다.
- 리소스가 정확히 어디에 있고 어떻게 접근할 수 있는지 분명히 알려준다.
- 오늘날 대부분의 URI는 URL이다.
- [https://github.com/kkumta/Puru-Board/blob/main/README.md] 라는 URL이 있다고 할 때, https는 스킴, github.com은 서버의 인터넷 주소, /kkumta/Puru-Board/blob/main/README.md는 웹 서버의 리소스를 가리킨다.
- 스킴: 리소스에 접근하기 위해 사용되는 프로토콜
- 서버의 인터넷 주소: DNS를 통해 IP로 변환되는 주소
- 웹 서버의 리소스: 리소스의 정확한 주소
URN
- 유니폼 리소스 이름
- 그 리소스의 위치에 영향을 받지 않는 유일무이한 이름 역할을 한다. 때문에 리소스의 이름을 변경하지 않는 한, 리소스의 위치를 옮기거나, 여러 종류의 네트워크 접속 프로토콜로 접근하더라도 문제없이 동작한다.
- 아직 널리 사용되지 않는다.
HTTP 트랜잭션
- 클라이언트가 서버에게 보내는 요청과 서버가 클라이언트에게 돌려주는 응답으로 이루어져 있다.
- HTTP 메세지라는 정형화된 데이터 덩어리를 이용해 이루어진다.
메서드
- 모든 HTTP 요청 메시지는 하나의 메서드를 가진다.
- 서버에게 어떤 동작이 필요한지 알려준다.
- GET, PUT, DELETE, POST, HEAD, PATCH 등이 있다.
상태 코드
- 서버가 클라이언트에게 요청 성공 여부를 알려줄 때 필요한 세 자리 숫자이다.
- 요청이 실패했을 경우, 원인이나 해결 방법을 알려준다.
- 숫자 상태 코드와 함께 텍스트로 된 사유 구절도 함께 보낸다.
- 200 OK, 403 Forbidden 등이 있다.
HTTP 메서드와 상태 코드에 관해 더 자세한 내용은 HTTP 메시지에 기록 예정이다.
웹 페이지 == 리소스의 모음
웹 브라우저가 복잡한 웹 페이지를 가져올 때는 여러 번의 트랜잭션이 수행된다. 그 순서는 다음과 같다.
- 페이지 레이아웃을 서술하는 뼈대를 가져오는 데 트랜잭션을 1번 수행한다.
- 가져온 페이지에 첨부된 이미지, 다른 파일 등을 가져오기 위해 파일 수만큼 추가로 트랜잭션을 수행한다.
HTTP 메시지
- 단순한 줄 단위의 문자열로, 일반적인 텍스트로 이루어져 있기 때문에 사람이 읽고 쓰기 쉽다.
- 요청 메시지와 응답 메시지가 있다.
더 자세한 내용은 HTTP 메시지에 기록 예정이다.
웹 브라우저 연결의 기본 절차
- 웹 브라우저는 서버의 URL에서 호스트 이름을 추출한다.
- 웹 브라우저는 서버의 호스트 이름을 DNS를 통해 IP 주소로 변환한다.
- 만약 URL에 포트 번호가 있다면, 웹 브라우저는 포트 번호를 추출한다.
- 웹 브라우저는 서버의 IP 주소와 포트 번호를 가지고 TCP 커넥션을 맺는다.
- TCP 커넥션을 맺은 후, 웹 브라우저는 서버에 HTTP 요청을 보낸다.
- 서버는 웹 브라우저에 HTTP 응답을 돌려준다.
- 커넥션이 닫히면, 웹 브라우저는 응답으로 받은 문서를 보여준다.
프로토콜 버전
HTTP/0.9
- HTTP의 프로토타입
- 심각한 디자인 결함이 다수 있고 구식 클라이언트에서만 사용할 수 있다.
- 오직 GET 메서드만 지원하고, 멀티미디어 콘텐츠는 지원하지 않는다.
- 원래 간단한 HTML 객체만을 받아오기 위해 설계되었다.
HTTP/1.0
- 처음으로 널리 쓰이기 시작한 HTTP 버전
- 버전 번호, HTTP 헤더, 멀티미디어 객체 처리를 추가했다.
- 웹을 시각적으로 발전시켰다.
- 웹을 대세로 만들었다.
- 잘 정의된 명세라기보다는 잘 동작하는 사용 예 모음에 가깝다.
HTTP/1.1
- 현재 많이 사용되는 HTTP 버전
- HTTP 설계의 구조적 결함을 교정하고, 성능을 최적화하고, 잘못된 기능을 제거했다.
- 더 복잡한 웹 애플리케이션을 지원한다.
HTTP/2.0
- HTTP/1.1의 성능 문제를 개선하기 위해 설계되었다.
웹의 구성요소
프락시
- 클라이언트와 서버 사이에 위치해서, 클라이언트의 모든 HTTP 요청을 받아 서버에 전달한다. 즉, 사용자를 대신해서 서버에 접근한다.
- 요청과 응답을 필터링할 수 있다.
- 인터넷에서 무언가 다운받을 때, 바이러스를 검출한다.
- 유해한 사이트로의 접속을 차단한다.
더 자세한 내용은 프락시에 기록 예정이다.
캐시
- 서버와 클라이언트 사이에 위치하며, 자주 요청되는 문서의 사본을 저장한다. 클라이언트가 같은 문서를 반복해서 요청하면, 캐시가 가지고 있는 사본을 받을 수 있다.
- 일종의 HTTP 프락시 서버이다.
- 클라이언트 입장에서, 멀리 떨어진 웹 서버보다 근처의 캐시에서 문서를 받는 것이 속도가 훨씬 빠르다.
더 자세한 내용은 캐시에 기록 예정이다.
게이트웨이
- 주로 HTTP 트래픽을 다른 프로토콜로 변환하기 위해 사용된다.
- 언제나 자신이 리소스를 가지고 있는 진짜 서버인 것처럼 요청을 다루기 때문에, 클라이언트는 자신이 게이트웨이와 통신하고 있다는 것을 알아채지 못한다.
더 자세한 내용은 게이트웨이에 기록 예정이다.
터널
- 두 커넥션 사이에서 raw 데이터를 열어보지 않고 그대로 전달해주는 HTTP 애플리케이션
- 주로 HTTP 데이터가 아닌 일반 데이터를 하나 이상의 HTTP 연결을 통해 그대로 전송해주기 위해 사용된다.
- 암호화된 SSL 트래픽을 HTTP 커넥션으로 전송함으로써 HTTP 트래픽만 허용하는 사내 방화벽을 통과시킬 수 있다.
에이전트
- 사용자를 위해 HTTP 요청을 만들어주는 클라이언트 프로그램
- 웹 브라우저, 스파이더, 웹 로봇 등이 있다.
- 스파이더의 경우 검색엔진의 데이터베이스를 만드는 데 사용된다.
'CS > Network' 카테고리의 다른 글
HTTP: 웹 서버 (0) | 2023.03.13 |
---|---|
HTTP: HTTP 메시지 (0) | 2023.03.06 |
HTTP: URL과 리소스 (0) | 2023.02.26 |
쿠키와 세션, 그리고 JWT (0) | 2022.11.07 |
네트워크: 주소창에 특정 URL을 입력하면 일어나는 일 (0) | 2022.07.14 |