[HTTP] URI의 개념과 웹 브라우저 요청 흐름
✏️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] | | ——————————————————— |
- scheme :
주로 프로토콜(어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙) 사용
ex) http, https, ftp
http는 80포트, https는 443포트를 주로 사용하기 때문에 포트 생략 가능 https는 http에 보안 추가 (HTTP SECURE)
- userinfo는 거의 사용하지 않음. URL에 사용자정보를 포함해서 인증해야할 때 사용한다.
- host 호스트명, 도메인명 또는 IP 주소를 직접 사용 가능
- path 리소스 경로, 계층적 구조 ex) /home/file1.jpg /members/100, /items/iphone12
- query key=value 형태 ?로 시작, &로 추가 가능 ?keyA=valueA&keyB=valueB query parameter, query string등으로 불림. 숫자를 적어도 문자형식으로 넘어가기 때문임.
- fragment html 내부의 중간 북마크에 가고 싶을 때 사용 / 서버로 전송되는 것은 아님. #getting-started-introducing
✍️웹 브라우저 요청 흐름
-
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 -
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 렌더링을 해서 결과를 보여줌.