URI는 URL(locator), URN(name)로 분류될 수 있다.
URL은 리소스가 있는 위치를 지정하며 URN은 리소스에 이름을 부여한다. 위치는 변할 수 있고 이름은 변하지 않는다. 실제로 URN 이름만으로 실제 리소스를 찾을 수 있는 방법이 보편화되지 않았기에 URN방식은 매우 생소하다. 반면 URL은 프로그래머가 아니더라도 주소창에 적히는 무언가로 인식하는 경우가 많다.
실제로도 URN은 잘 사용되지 않기에 URI와 URL은 같은 의미로 사용한다.
https://www.google.com/search?q=coldplay&hl=ko
URL의 전체 문법은 다음과 같다.
scheme://[userinfo@]host[:port][/path][?query][#fragment]
• 프로토콜(https)
• 호스트명(www.google.com)
• 포트 번호(443) -> 생략되어있음(https는 기본적으로 443포트)
• 패스(/search)
• 쿼리 파라미터(q=hello&hl=ko)
https://www.google.com/search?q=coldplay&hl=ko
위와 같은 url 접속시 다음과 같은 HTTP 요청 메세지가 생성된다.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
좀 더 세부적으로,
웹 브라우저가 URL을 입력 받음
사용자가 웹 브라우저에 URL을 입력하거나 링크를 클릭, 웹 브라우저가 HTTP 메시지를 생성
HTTP 요청 메시지(메서드, URL, HTTP 버전, 헤더, 본문)를 생성, DNS 요청 (Domain Name Resolution)
입력된 도메인 이름을 IP 주소로 변환하기 위해 DNS 서버에 질의, 웹 브라우저가 로컬 DNS 캐시를 먼저 확인하고, 없으면 DNS 서버에 요청 전송
DNS 응답을 받아 해당 도메인의 IP 주소를 획득, 웹 브라우저가 Socket 라이브러리를 통해 TCP 연결 요청
IP 주소와 포트 번호(기본 HTTP 포트 80, HTTPS 포트 443)를 사용하여 TCP 소켓을 생성, TCP 연결 설정 (3-way handshake)
클라이언트(웹 브라우저)가 서버에 SYN 패킷을 전송.(3-way handshake 과정) 서버가 SYN-ACK 패킷으로 응답, 클라이언트가 ACK 패킷을 보내며, 논리적 연결 설정, 웹 브라우저가 HTTP 메시지를 소켓을 통해 전달
TCP 연결이 설정되면, 웹 브라우저는 HTTP 요청 메시지를 소켓을 통해 서버로 전송, OS에서 TCP/IP 패킷을 생성, HTTP 메시지를 포함
운영체제의 네트워크 스택이 HTTP 메시지를 TCP 세그먼트로 캡슐화하고, 이를 IP 패킷으로 캡슐화
LAN 드라이버, LAN 장비를 통해 인터넷 망에 패킷 전송
IP 패킷이 이더넷 프레임으로 캡슐화되어 로컬 네트워크를 통해 라우터로 전달, 라우터를 통해 인터넷으로 전송
패킷이 서버에 도착
인터넷을 통해 서버에 도달한 패킷이 서버의 네트워크 인터페이스로 전달
서버에서 TCP/IP 패킷을 분해, HTTP 요청 메시지 추출
서버의 네트워크 스택이 IP 패킷을 TCP 세그먼트로, TCP 세그먼트를 HTTP 메시지로 분해한다.
웹 서버가 HTTP 요청 메시지를 처리
웹 서버(예: Apache, Nginx)가 HTTP 요청을 받아 처리하고, 요청된 자원을 준비
필요한 경우 서버 애플리케이션(ex.Spring)이 동작하여 요청을 처리
서버가 HTTP 응답 메시지를 생성
HTTP 상태 코드, 헤더, 본문 등을 포함한 HTTP 응답 메시지를 생성
서버에서 응답 메시지를 TCP/IP 패킷으로 캡슐화
생성된 HTTP 응답 메시지를 TCP 세그먼트로, TCP 세그먼트를 IP 패킷으로 캡슐화
응답 패킷을 인터넷을 통해 클라이언트로 전송
IP 패킷이 인터넷을 통해 클라이언트(웹 브라우저)로 전송
웹 브라우저가 응답 패킷을 받음
클라이언트의 네트워크 인터페이스로 도착한 패킷이 운영체제의 네트워크 스택을 통해 처리됨
TCP 세그먼트가 HTTP 메시지로 분해.
웹 브라우저가 HTTP 응답 메시지를 처리
웹 브라우저가 HTTP 응답 메시지를 받아 HTML, CSS, JavaScript, 이미지 등을 렌더링
HTTPS 요청의 경우, TCP 연결 설정 후 SSL/TLS 핸드셰이크가 진행되어 보안 연결이 설정된다.
이 과정에서 클라이언트와 서버가 암호화된 통신을 위해 대칭 키를 교환한다.
클라이언트나 서버에서 캐싱된 데이터를 사용하는 경우, 요청-응답 과정이 일부 생략될 수 있다.
프록시 서버를 사용하는 경우, 요청과 응답이 프록시 서버를 경유