✊ 필오의 개발일지
Back to Posts
2019년 8월 3일

HTTP 개관

HTTP 개관

개요 / 클라이언트와 서버의 전체 흐름 보기

웹 어플리케이션은 사용자에게 어플리케이션을 보여주기 위해, 사용자가 어플리케이션에 입장할 시점에 서버에서 데이터(소스)를 받아와야한다.

어플리케이션은 서버에게 어떻게 데이터를 받아오는지 http를 모른다고 생각하고 상상해보자.

  1. 우선 데이터가 존재하는 서버의 위치부터 파악 해야한다.

Host 2. 위치를 파악했다면 클라이언트와 서버의 연결이 필요하다.

TCP/IP 커넥션, port 3. 연결이 이루어졌다면, 서버에게 원하는 바를 요청해야한다.

HTTP: HTTP 프로토콜을 통해 요청/응답메세지를 보낸다. 4. 요청이나 응답에서 어떤 데이터를 보내고, 받았는지 데이터의 위치, 종류를 알아야, 클라이언트에서 해석할 수 있다.

Content-Type, URI 5. 특정상황에선 통신을 원할하게 해주는 다른 요소들이 필요하다.

HTTP의 기반 시스템의 구성요소

이 모든 과정에 필요한 HTTP에 대해서 알아보고, 과정 순서대로 톺아보려고한다.



HTTP의 개념

HTTP (HyperTest Transfer Protocaol)

HTTP는 WWW 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. TCP와 UDP를 사용하며, 80번 포트를 사용한다.

프로토콜이란? 사람과 사람이 통신할 때 서로 이해할 수 있는 언어, 공용된 언어를 사용해 전세계 모든 사람과 대화 할수 있다라고 하면, 컴퓨터와 컴퓨터도 서로 이해 할 수 있는 언어, 공용된 언어를 사용 해야 한다는 것인데 이것이 바로 프로토콜(Protocol) 입니다.



클라이언트 입장에서 생각해보기

  1. 원하는 데이터가 있는 서버의 위치를 알아야한다.
  2. 위치를 파악했다면 연결이 필요하다.
  3. 연결이 이루어졌다면, 서버에게 원하는 바를 요청해야한다.
  4. 어디에있는 어떤 데이터인지를 알려줘야한다.

1. 원하는 데이터가 있는 서버의 위치를 알아야한다.

데이터를 갖고 있는 서버의 위치를 알기 위해서 해당 서버의 주소, 즉 ip주소와 포트번호를 알아야한다.


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

뒤에 나올 TCP/IP 커넥션에 필요한 IP주소와 포트번호에 대한 내용이다.

http://207.200.83.29:80 http://www.netscape.com:80/index.html http://www.netscape.com/index.html

1.2 단순한 HTML리소스를 사용자에게 보여주는 순서

1. 웹 브라우저는 서버의 URL에서 호스트 명을 추출한다. 2. 웹 브라우저는 서버의 호스트 명을 IP로 변환한다. 3. 웹 브라우저는 URL에서 포트번호 (있다면) 을 추출한다. 4. 웹 브라우저는 웹 서버와 TCP 커넥션을 맺는다. 5. 웹 브라우저는 서버에 http 요청을 보낸다. 6. 서버는 웹브라우저에 http 응답을 돌려준다. 7. 커넥션이 닫히면, 웹 브라우저는 문서를 보여준다.

1번부터 4번까지 알아보았다.


2. 위치를 파악했다면 연결이 필요하다.

TCP 커넥션을 통해서 어떻게 데이터가 넘어가는지 알아보자.

TCP/IP (Transmission Control Protocol / Internet Protocol)


TCP가 제공하는 것


텔넷을 이용한 예시

telnet feel5ny.github.io 80 👈👩‍💻 Trying 185.199.108.153... Connected to feel5ny.github.io. Escape character is '^]'. GET /index.html HTTP/1.1 👈👩‍💻 Host: feel5ny.github.io 👈👩‍💻 HTTP/1.1 301 Moved Permanently Server: GitHub.com Content-Type: text/html Location: https://feel5ny.github.io/index.html X-GitHub-Request-Id: D618:10D7:EA3B81:F6E706:5D445B26 Content-Length: 178 Accept-Ranges: bytes Date: Fri, 02 Aug 2019 15:47:51 GMT Via: 1.1 varnish Age: 0 Connection: keep-alive X-Served-By: cache-itm18822-ITM X-Cache: MISS X-Cache-Hits: 0 X-Timer: S1564760871.463728,VS0,VE108 Vary: Accept-Encoding X-Fastly-Request-ID: 092f039231a1abe8f0a17ae484a57d8d54cf5810 <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx</center> </body> </html>


3. 연결이 이루어졌다면, 서버에게 원하는 바를 요청해야한다. ( 트랜젝션, 메세지 )

서버와 대화하는 방식을 알아야한다.

3.1 트랜젝션

3.1.1 메서드

클라이언트는 사용자의 요청에 따라 데이터를 처리하기위해 서버에게 특정 액션을 설명해줘야한다.

HTTP 에서 흔히 쓰이는 5가지 메서드

  1. GET (서버 ⇒ 클) 보내라. 서버에서 클라이언트로 지정한 소스를
  2. PUT 저장하라. 클라이언트에서 서버로 보낸 데이터를 지정한 이름의 리소스로
  3. DELETE 삭제하라. 지정한 리소스를 서버에서
  4. POST (클 ⇒ 서버) 보내라. 클라이언트 데이터를 서버 게이트웨이 어플리케이션으로
  5. HEAD 보내라 지정한 리소스에 대한 응답에서, HTTP 헤더 부분만 보내라.

3.1.2 상태코드

흔히 쓰이는 상태 코드 몇가지.

  1. 200 문서가 바르게 반환되었다. 사유구절 http는 각 숫자 상태 코드에 텍스트로 된 사유구절 (reason phrase)도 함께 보낸다.
  2. 200 OK
  3. 200 Document attached
  4. 200 Success
  5. 200 All’s cool, dude
  6. 302 다시 보내라. 다른 곳에 가서 리소스를 가져가라.
  7. 404 리소스를 찾을 수 없다.

3.2 메세지

HTTP 메세지

출처 

  1. 시작줄 요청이라면 무엇을 해야 하는지 응답이라면 무슨 일이 일어 났는지 나타낸다.
  2. 요청헤더 헤더 필드는 : 구분되어 있는 하나의 이름과 하나의 값으로 구성된다. 빈 줄로 끝난다.
  3. 본문 본문은 필요에 따라 올 수 있다. 문자열이며, 임의의 이진 데이터를 포함할 수 있다. (이미지, 비디오, 오디오 트랙, 응용소프트웨어)

4. 어디에있는 어떤 데이터인지를 알려줘야한다. ( 리소스 )

이제 서버와 어떻게 대화하는지를 알게 되었다. 특정 데이터를 특정 액션(메서드)을 해달라는 요청을 하는 방법을 알게되었는데, 특정 데이터라는 건 어떻게 서버가 알게 해야할까.

우선 데이터가 1. 어디에 있는 어떤 컨텐츠인지. 2. 해당 컨텐츠가 어떤 타입인지를 알야아한다.

어디에 있는 어떤 컨텐츠인지를 어떻게 알까. URI개념을 이용하면 된다.

4.1 URI

Uniform Resource Identifier = 통합 자원 식별자

아래 URI를 분석해보면, https://feel5ny.github.io/2019/07/07/Joylog_003/

1. https:// http 프로토콜을 사용하라 2. feel5ny.github.io 으로 이동하라 3. /2019/07/07/Joylog_003 라고 불리는 리소스를 가져와라.

URI에는 2가지가 있다.

  1. URL (locator)
  2. URN (name)

4.1.1 URL (locator)

Uniform Resource locator = 통합 자원 지시자

4.1.2 URN (name)

잘 모르겠다.

Uniform Resource name = 통합 자원 이름

어디에 있고, 어떤 이름을 갖는 파일인지를 알아보는 방법을 알아봤으니, 해당 컨텐츠가 어떤 종류의 타입인지를 알야아한다.

4.2 미디어 타입

인터넷은 수천 가지 데이터 타입을 다루기 때문에 HTTP는 웹에서 전송되는 객체 각각에 신중하게 MIME 타입이라는 데이터 포맷 라벨을 붙인다.

4.2.1 MIME

MIME = multipurpose Internet Mail Extensions = 다목적 인터넷 메일 확장

왜 MIME?
HTTP에서 MIME 타입은?

웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙인다.

MIME은 어떻게 표시되나?

MIME 타입은 사선 /으로 구분된 주 타입과 부타입으로 이루어진 문자열 라벨이다.

주타입/부타입 (primary object type / specific subtype)

종류

HTTP의 종류

HTTP/0.9

1991년 HTTP 프로토타입 HTTP/0.9

문제점

상황

HTTP/1.0

처음으로 널리 쓰이기 시작한 HTTP 버전

HTTP/1.0+

상황

지원

HTTP/1.1

HTTP 설계의 구조적 결함 교정, 두드러진 성능 최적화, 잘못된 기능제거에 집중했다.

HTTP/2.0

1.1 성능 문제를 개선하기 위해 구글의 SPDY 프로토콜을 기반으로 설계가 진행중인 프로토콜이다.


@2021-02-12 추가

HTTP 기반 시스템의 구성요소 ( 인터넷 곳곳에 설치된 )

특정상황에 효율적인 처리를 위해 만들어진 HTTP 구성 요소 개념

1. 프락시

클라이언트와 서버 사이에 위치한 HTTP 중개자

서버와 클라이언트 사이에 중계자로서 대리로 통신을 수행하는 것을 가리켜 ‘프록시’, 그 중계 기능을 하는 것을 ‘프록시 서버’라고 부른다.

예시

2. 캐시

많이 찾는 웹페이지를 클라이언트 가까이에 보관하는 HTTP 창고

3. 게이트웨이

다른 어플리케이션과 연결된 특별한 웹 서버

예시

4. 터널

HTTP 통신을 전달하기만 하는 특별한 프락시

예시

5. 에이전트

자동화된 HTTP 요청을 만드는 준지능적 semi-intelligent 웹클라이언트

예시


참고링크

  1. https://bignet.tistory.com/73 
PreviousURL과 리소스
Next2019 상반기 회고 + 하반기 다짐 (feat. 글또)

Related

© 2025 Felix