HTTP란?
- HyperText Transfer Protocol 의 약자
- 하이퍼텍스트 전송용 약속(=프로토콜)이라고 할 수 있다.
- HyperText : 비선형적으로 내용들이 연결되는 매체
HTTP의 작동원리 (간단하게)
- 웹 서버를 통해서 작동한다.
- 웹 서버를 간략하게 표현하자면, 다음과 같다.
- 클라이언트는 서버에게 http 요청(request)를 보낸다.
- 서버는 요청된 데이터를 http 응답으로 돌려준다.
웹 리소스
- 웹 서버가 응답할 여러가지 콘텐츠
- 실시간으로 변화하는 콘텐츠를 동적 리소스라고 한다.
- 반면, 변화가 거의 없는 콘텐츠를 정적 리소스라고 한다.
MIME 타입
python
- http의 리소스를 구분하는 방법
- (주타입)/(부타입)
text/html # html로 작성된 텍스트
text/plain #
image/jpeg #
image/gif #
URI
python
- 통합 자원 식별자
- 종류 : URL, URN
<URL>
- uniform resource locator (통합 자원 지시자)
- 특정 서버의 리소스에 대한 주소
ex. https://www.naver.com/
URL은 /를 기준으로 다시 3개의 파트로 나눌 수 있다.
- 첫 번째 부분 : 스킴이라고 하며, 어떤 프로토콜을 써야 접근할지를 알려줌
- 두 번째 부분 : 서버의 인터넷 주소
- 세 번째 부분 : 웹 서버의 리소스
<URN>
- uniform resource name (통합 자원 지시자)
- 리소스의 위치에 영향을 받지 않는 유일무이한 이름 역할
대부분의 경우, URL = URI 라고 할 수 있음.
http 트랜잭션
- http의 응답과 요청을 묶어서 http 트랜잭션이라고 한다.
- 이는 http 메시지라는 문자열을 통해서 이뤄진다.
HTTP 요청 메시지 예시:
html
GET /example HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
HTTP 응답 메시지 예시:
html
HTTP/1.1 200 OK
Date: Sat, 01 Jan 2022 12:00:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: keep-alive
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
HTTP 메세지 설명
python
<첫번째 줄 : 시작줄>
요청 메시지의 경우, 무엇을 해야 할지를 적는다.
ex. GET /example HTTP/1.1
* GET : 메소드
* /example : 리소스의 경로
* HTTP/1.1 : 사용될 HTTP 프로토콜의 버전
응답 메시지의 경우, 무엇이 일어났는지 적는다.
ex. HTTP/1.1 200 OK
* 200 : 상태코드
* OK : 사유 구절
<두번째 줄 ~ 빈칸 : 헤더>
- 세부적인 요구사항을 담아 놓은 줄
- 콜론을 기준으로 키와 값이 담겨 있다.
<빈칸 이후 : 본문>
- 요청 메시지의 경우, 보낼 데이터를 담는다.
- 응답 메시지의 경우, 받을 데이터를 담는다.
웹페이지는 트랜잭션을 여러 번 할 수도 있다.
즉, 웹페이지는 리소스들의 모임이라고 할 수 있다.
TCP 커넥션
- HTTP는 세부적인 네트워크 전송 기법을 신경쓰지 않는다.
- 이는 HTTP의 하부에 위치한 TCP/IP가 대신 해준다.
- HTTP는 OSI 7계층 중 응용계층에 해당한다.
TCP 커넥션을 하기 위한 준비물 : 서버의 IP주소와 포트번호
URL을 분해 또는 변경해서 IP주소와 포트번호를 얻어낸다.
python
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
- 첫 번째 주소 : IP주소 + 포트번호
- 두 번째 주소 : 호스트명 + 포트번호
- DNS라는 장치를 통해 호스트명 → IP주소로 변경
- 세 번째 주소 : 호스트명
- 포트번호는 80으로 해석
TCP 커넥션의 전반적인 과정을 다음과 같다.
python
1. 웹브라우저에서는 URL에서 호스트명을 추출 (파싱)
2. 서버의 호스트명을 IP로 변환
3. URL에서 포트번호를 추출
4. 브라우저와 웹 서버 간 TCP 커넥션 맺음.
5. 서버에 요청을 보냄.
6. 서버로부터 응답을 받음.
7. 보여준다.
HTTP에서 자주 쓰는 용어
- 프록시 (proxy) : 클라이언트와 서버 사이에 위치한 서버.
- 캐시 : 프록시 서버의 일종으로, 많이 찾는 웹페이지를 보관한다.
- 게이트웨이 : 다른 앱과 연결된 특별한 웹 서버. http를 다른 프로토콜로 변환한다.
- 터널 : 두 커넥션 사이 데이터를 열어보지 않고, 전달만 하는 http 어플리케이션
- 에이전트 : 사용자를 위해 http 요청을 만들어주는 프로그램. (ex. 브라우저, 크롤러)