1 분 소요

✏️URI(Uniform Resource Identifier)?

URI는 아래의 약자에서 알 수 있듯이 인터넷상의 리소스를 식별하는 고유한 식별자다.

Uniform : 리소스 식별하는 통일된 방식

Resource : 자원, URI로 식별할 수 있는 모든 것. (제한 없음)

Identifier : 다른 항목과 구분하는 데 필요한 정보

크게 두 가지 유형이 있는데

URL(Uniform Resource Locator) : 위치를 기반으로 하는 식별자. 특정 리소스의 위치를 나타낸다.

URN(Uniform Resource Name) : 리소스의 이름을 기반으로 하는 식별자. 소스의 위치가 아닌, 리소스 자체의 이름에 중점을 두고 있다. 위치는 변할 수 있지만 이름은 변하지 않는다.

URI 전체 문법

| scheme://[userinfo@]host[:post][/path][?query][#fragment] | | ——————————————————— |

  1. scheme : 주로 프로토콜(어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙) 사용 ex) http, https, ftp

    http는 80포트, https는 443포트를 주로 사용하기 때문에 포트 생략 가능 https는 http에 보안 추가 (HTTP SECURE)

  2. userinfo는 거의 사용하지 않음. URL에 사용자정보를 포함해서 인증해야할 때 사용한다.
  3. host 호스트명, 도메인명 또는 IP 주소를 직접 사용 가능
  4. path 리소스 경로, 계층적 구조 ex) /home/file1.jpg /members/100, /items/iphone12
  5. query key=value 형태 ?로 시작, &로 추가 가능 ?keyA=valueA&keyB=valueB query parameter, query string등으로 불림. 숫자를 적어도 문자형식으로 넘어가기 때문임.
  6. fragment html 내부의 중간 북마크에 가고 싶을 때 사용 / 서버로 전송되는 것은 아님. #getting-started-introducing

✍️웹 브라우저 요청 흐름

  1. https://www.google.com:443/search?q=hello&hl=ko

    웹브라우저 IP:100.100.100.1 / PORT:443 DNS 조회를 통해 도메인 이름을 IP 주소로 변환하고, 웹 브라우저의 IP 주소가 100.100.100.1이라고 주어진 경우, 이 정보를 통해 패킷의 출발지 IP 주소를 설정하게 된다. 이를 기반으로 아래와같은 HTTP 요청 메시지 생성을 하게 됨.

    [HTTP 요청 메시지 구조]
    GET /search?q=hello&hl=ko HTTP/1.1
    Host : www.google.com
    
  2. HTTP 메시지 전송

    a. 애플리케이션의 웹브라우저가 HTTP 메시지 생성함.

    b. SOCKET 라이브러리를 통해 생성한 HTTP 메시지를 OS의 TCP/IP계층에 전달하며, 이때 목적지 IP 주소와 포트 정보(이 경우 Google 서버와 443 포트에 연결)를 TCP/IP 계층에 전달하며, 목적지 IP주소와 포트 정보가 함께 전달되어 데이터 패킷이 형성된다.

    c. 운영체제의 TCP/IP 계층에서는 목적지로 향하는 데이터 패킷을 생성하고, TCP프로토콜을 사용하여 핸드셰이크 수행함.

    (b)TCP/IP 패킷 생성 > 핸드셰이크 > 데이터 주고받음. 이 때, TCP/IP 패킷 안에는 HTTP가 포함된다. > TCP/IP 패킷은 HTTP 메시지와 함께 전송되며, 이 메시지에는 웹 브라우저가 구글 서버에게 보내는 요청 또는 구글 서버가 웹 브라우저에게 보내는 응답이 포함된다. > TCP/IP패킷은 인터넷을 통해 전송된다.

    d. 즉, TCP/IP 패킷에는 출발지, 목적지IP, PORT + 전송데이터 HTTP 메시지가 인터넷망으로 넘어가는 것.

    e. 구글서버는 이 요청패킷의 TCP/IP 패킷을 까서 버리고 HTTP 메시지를 해석함

    HTTP 메시지를 해석하여 해당하는 데이터를 찾음.

    f. 구글 서버에서 HTTP 응답 메시지를 만들어냄. HTTP 버전, 200 OK, Content-Type:text/html;charset=UTF-8, Content-Length:3423 (실제html의 길이) 똑같이 응답 패킷을 만들어서 전달함.

    g. 이후 웹브라우저가 이 html 렌더링을 해서 결과를 보여줌.

업데이트: