URI와 웹 브라우저 요청 흐름

jkpapa·2023년 3월 28일
0

HTTP

목록 보기
2/5

URI가 뭘까?

평소에 자주 들어보던 용어인 URI, URL이 무슨의미일까?
두 용어에는 어떤 차이가 있을까?

URI(Uniform Resource Identifier)

  • 사람들을 식별 할 때 고유한 주민번호로 식별 할 수 있듯이 리소스를 식별 할 수 있는 고유한 IdentifierURI라고 한다.

  • URI는 리소스가 존재하는 위치, 리소스의 이름으로 분류 될 수 있으며 또는 위치와 이름을 함께 사용하여 분류하기도 한다.

    • URI는 리소스의 Locator(위치), Name(이름) 정보를 포함하고 있다.
    • Locator: Resource의 위치다. 리소스 그 자체를 의미하지는 않는다.
    • Name: Resource의 이름을 나타낸다.
  • URI는 가장 큰 개념! 리소스를 식별한다.

URI는 리소스 그 자체를 가리키고, URL은 리소스의 위치를 나타낸다.
(나름대로 이해하기 쉽게 나의 말로 바꿔보았다.)

  • URI에 대해서 좀 더 자세히 알아보자. URI는 Uniform Resource Identifier의 약자이다. 어떤 의미를 갖고 있을까?

    • Uniform: 리소스를 식별하는 통일된 방식
    • Resource: 자원, URI로 식별할 수 있는 모든 것(데이터 형식에 제한이 없다.)
      • HTML 파일, 실시간 교통정보 등 우리가 구분 할 수 있는 모든 것을 리소스라고 한다.
    • Identifier: 다른 항목과 구분하는데 필요한 정보(Location, Name)
  • URL(Uniform Resource Locator): 리소스가 있는 위치를 지정한다.

  • URN(Uniform Resource Name): 리소스에 이름을 부여한다.

URL 전체 문법

  • URL을 분석해보자

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

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

url은 위의 형태를 갖는다. 하나씩 뜯어보자

  • scheme: 주로 프로토콜 사용

    • 프로토콜: 어떤 방식으로 자원에 접근할 것인가를 결정하는 통신 규약

    • 예) http, https, ftp 등등

      • http는 80포트, https는 443 포트를 주로 사용한다.
    • 포트 번호는 url에서 생략이 가능하다.

    • https는 http에 보안 기능이 추가된것(HTTP Secure)

  • userinfo@: URL에 사용자 정보를 인증해야 할 때 사용함, 거의 쓰지 않음

  • host: 호스트명, 도메인명 또는 IP주소를 직접 입력가능하다.

  • port: 접속 포트, 일반적으로 생략한다. 특정 서버에 따로 접근해야 할 때 입력하기도 한다.

  • path: 리소스경로, 계층적인 구조로 되어있다.

    • 예) /home/index.html, /home/img/image.png ...

      💡전체 ULI에서 path부분 까지가 URL이라고 생각된다.

  • query: key=value의 형태로 들어간다.

    • ?로 시작하고, &를 이용해 query를 추가 할 수 있다.
      • key=value&keyB=valueB
    • query parameter, query string으로 불린다.
    • 웹 서버에 제공하는 파라미터, 문자열이라는 의미다.
  • fragment: html 내부 북마크 등에서 사용, 서버로 전송되는 데이터는 아니다.

    • velog 포스트 오른쪽 사이드에서 제목을 클릭 했을 때 해당 제목의 위치로 스크롤되는 것을 경험해 봤을 것이다.

웹 브라우저 요청 흐름

웹 브라우저가 데이터를 요청하면 http 메시지가 생성된다.
메시지가 생성되는 과정은 어떻게 될까?

  • 웹 브라우저에 URL을 입력한다.

  • 웹 브라우저는 입력된 host의 Domain을 DNS 서버에서 조회한다.

  • DNS 서버에서 응답 받은 IP와 URL의 Port 정보를 찾아내서 아래와 같은 HTTP 요청 메시지를 생성한다.

    • DNS 서버에서 응답 받은 IP는 접속하고자 하는 서버의 IP, ULR에서의 host부분이 되겠다.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

HTTP 메시지 전송 과정

  • 웹 브라우저가 HTTP 메시지 생성한다.

  • 웹 브라우저는 Socket 라이브러리를 통해 OS에 HTTP 메시지를 TCP/IP 계층에 전달한다.

    • 서버의 IP와 데이터를 요청 할 Port의 정보를 알고 있으므로 TCP(3 way handshake)로 서버와 클라이언트를 연결한다.
    • HTTP 메시지가 포함된 데이터를 TCP/IP 계층에 전달한다.
  • TCP/IP 패킷을 생성한다.(IP, Port, HTTP 메시지 정보 포함한다.)

    이쪽 IP의 컴퓨터로 가서 여기 Port에 접근하여 HTTP 메시지를 전송하라는 의미

  • 서버로 요청 패킷을 전송한다.

  • 서버는 TCP/IP 패킷을 열고 요청 받은 HTTP 메시지를 해석한다.

    • 접근하려는 리소스를 확인하고, 쿼리 파라미터 등을 해석한다.
  • 아래와 같은 HTTP 응답 메시지를 생성

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

<html>
  <body> ... </body>
</html>
  • 클라이언트가 요청 패킷을 보내는 같은 과정으로 클라이언트로 패킷 전송

    • HTTP 메시지를 담은 TCP/IP 패킷생성
    • 클라이언트로 전송!
  • 클라이언트, 웹 브라우저는 응답 받은 HTTP 메시지를 해석한다.

  • 응답 메시지에 담긴 HTML 문서를 웹 브라우저는 렌더링해준다.

지금 내가 작성 한 글도 이런 과정을 거쳤다.

0개의 댓글