URI와 웹 브라우저 요청 흐름

    URI(Uniform Resource Identifier)


    URI라는 것은 Resource를 구별할 수 있는 방법을 이야기한다. 예를 들어 주민등록번호가 하나의 URI가 될 수 있다. 그 값을 보면 누구인지 식별을 할 수 있는 것이다. 여기서 말하는 Resource는 어떠한 것들도 올 수 있다. URI는 Locator와 Name으로 구별할 수 있다. 

    • URL(Uniform Resource Locator) : 리소스가 사는 곳. 내가 사는 곳으로 볼 수 있다.
      → https://google.com
    • URN(Uniform Resource Name) : 내 이름으로 볼 수 있다.
      → animal:feret:nose, ISBN 

    이름만으로는 내가 원하는 곳에 찾아갈 수 없다. 예를 들어 김서방이라는 사람을 찾고 싶은데, 김서방이라는 이름을 가진 사람은 세상에 정말 많을 것이다. 따라서, 이름만 가지고 특정한 자원을 식별하는 것은 어려워 URN으로 리소스를 식별하는 방법은 사실상 보편화 되어있지 않다.

     

    URL의 문법


    scheme://[userinfo@]host[:port][/path][?query][#fragment]

    https://google.com:443/search?q=hello&hi=ko

    1. Scheme

    • shceme은 주로 사용할 프로토콜을 가리킨다.
    • 이 때 프로토콜은 어떤 방식으로 Resource에 접근할 것인가 하는 약속과 규칙이다. (http, https, ftp 등)

    2. Host 

    • 호스트명을 기입해준다.
    • 도메인명이나 IP 주소를 직접 사용할 수 있다. 

    3. PORT

    • 접속하는 PORT. 일반적으로는 생략한다.
    • HTTPS는 80, HTTPS는 443 PORT로 주로 접속한다.

    4. PATH

    • Resoruce가 있는 경로.
    • 보통 계층적 구조로 이루어진다. 
      → /home/file1.jpg

    5. Query

    • 쿼리는 ?로 시작하고, 값은 key=value 형태로 들어간다. &로 다른 값을 추가할 수 있다.
    • ?keyA=valueA&keyB=valueB
    • 쿼리 파라메터, 쿼리 스트링으로 불리기도 한다. 보통 문자열로 넘어가기 때문에 스트링이라고 한다. 

     

    URI vs URL

    실제로 쓰일 때, URI와 URL은 다음과 같이 구분이 된다. 주로 절대 경로가 URI처럼 사용되는 것으로 보인다.

     

     

     

    Web Browser의 요청흐름


    https://www.google.com/search?q=hello&hi=ko 로 접속할 때의 요청 흐름을 살펴본다.

    1. 웹 브라우저는 먼저 구글의 서버 IP를 먼저 찾아야한다. DNS 서버를 조회하고, 여기서 Google의 IP 정보를 받아온다. 그리고 scheme이 https이고, 이에 따라 PORT는 443으로 접근해야하는 것을 알고 있다. 이를 바탕으로 HTTP 요청 메세지를 생성한다. 이 때 생성된 요청 메세지는 아래와 같다.

    GET /search?q=hello&hi=ko HTTP/1.1
    Host: www.google.com

    2. 생성된 HTTP 메세지는 SOKECT 라이브러리를 통해 OS로 전달된다. 이 때, TCP/IP를 알고 있으니 이 정보를 SOCKET 라이브러리 정보를 이용해 3 Way Handshake로 연결한다.

    3. 연결이 되면 TCP/IP에서 HTTP 메세지를 포함한 TCP 세그먼트를 만들고, IP 패킷을 씌운다.

    4. 인터넷으로 데이터를 전달한다.

     

    패킷 생성

    패킷을 생성할 때, 이 때는 출발지 IP, PORT, 도착지 IP, PORT 그리고 전송 데이터가 들어있어야 한다. 이 때 전송 데이터는 앞에서 생성한 HTTP 메세지가 된다. 

    요청 패킷은 수많은 노드를 타고 넘어가서 구글 서버에 도착한다. 구글 서버는 포트를 통해 요청 패킷을 받고, TCP/IP 패킷을 다 까서 버리고 HTTP 메세지를 꺼낸다. 그리고 이 HTTP 메세지의 요청사항이 무엇인지를 해석한다. 해석해서 관련된 데이터들을 만들고, 웹서버에서 HTTP 응답 메세지를 만든다. 

    요청 메시지

    GET /search?q=hello&hi=ko HTTP/1.1
    host: www.google.com

    응답 메세지

    HTTP/1.1 200 OK
    Content-Type: text/html:charset=UTF-8
    Content-Lenght: 3423
    
    <html>
     <body>...</body>
    </html>

    구글 역시 위의 HTTP 메세지를 응답 패킷으로 만든다. 그리고 클라이언트에게 전달해서, 동일한 과정을 거쳐서 클라이언트 역시 HTTP 메세지를 확인한다. 확인한 후, 웹 브라우저가 HTML 랜더링을 해서 우리가 볼 수 있는 결과를 얻어낸다.

     

    google.com에 접속해보자 (TCP 연결 과정) | Devkly

    'CS > 네트워크' 카테고리의 다른 글

    HTTP 메서드 활용  (0) 2021.12.06
    HTTP 상태 코드 정리  (0) 2021.12.04
    HTTP 메서드 관련 정리  (0) 2021.12.04
    HTTP의 Stateless, 비연결성  (0) 2021.12.04
    인터넷 네트워크 구조 (IP, TCP, UDP, DNS, PORT)  (0) 2021.10.11

    댓글

    Designed by JB FACTORY