URI 전에 URI, URL, URN 의 차이 부터 알고 보자
"URI는 위치(Locator), 이름(Name) 또는 둘다로 분류 될 수 있다"
기본적으로 URI는 URL, URN을 포함 하는 개념이다.
URI
- Uinform : 리소스 식별하는 통일된 방식
- Rsource : 자원, URI로 식별할 수 있는 모든것(제한이 없다)
- Identifier : 구분하는데 필요한 정보
URL / URN
- URL(Locator) : 리소스가 있는 위치를 지정
- URN(Name) : 리소스에 이름을 부여
- 리소스의 위치는 변할 수 있지만, 이름은 변하지 않음
- 그래서 보통 URI를 URL로 같은 의미로 이해해도 됨
URL 구조
scheme://host[:port][/path][?query][#fragment]
만약 https://www.google.com:443/search?q=hello&hl=ko
라는 URL이 있다. 이 URL을 URL구조와 대입시켜서 생각해보자
URL의 구조를 하나씩 살펴본다면 이렇다.
scheme
https://
에 해당 하는 부분이다.
- 주로 프로토콜을 사용한다
* 프로토콜 : 어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙 (http, https, ftp 등등)
- 기본적으로 http는 80포트 , https는 443포트를 사용한다 (포트는 생략 가능)
* HTTPS 는 HTTP에 보안 요소를 추가한 프로토콜이다 (HTTP + Secure)
host
wwww.google.com
에 해당 하는 부분
- 접속할 서버의 호스트 명이다.
- 서버의 도메인명 또는 직접 서버 IP주소를 입력해서 사용 가능하다
:port
:443
에 해당 하는 부분
- 접속 포트를 나타낸다
- 일반적으로 생략, http 는 80, https는 443
/path
/search
에 해당 하는 부분
- 리소스의 경로(path)를 나타낸다
- path는 계층적 구조로 이루어져있다
_home_index.html -> home의 경로의 index.html
/member/100 -> member의 경로의 100
query
?q=hello&hl=ko
에 해당 하는부분
- key = value 형태다
- ?로 시작하고, &으로 추가 가능하다 (
?key1=value1&key2=value2
)
- query parameter, query string 등으로 불린다.
웹 브라우저 요청 흐름
우리는 웹브라우저( 크롬, 사파리, 엣지 등)의 주소창에 URL을 입력하고 엔터를 쳐서 서버에 요청을 보낸다.
그럼 이 URL이 어떤 과정을 통해서 서버에 요청을 보내고 응답을 받아 오는것일까?
애플리케이션 계층 : 웹 브라우저
OS 계층 : TCP/IP
네트워크 인터페이서 : LAN드라이버, LAN장비
이러한 흐름은 대략적으로 다음과 같다.
https://wwww.google.com/search?q=hello
라는 URL을 클라이언트가 웹브라우저를 통해 요청을 보낸다.
https://
부분을 보고 어떤 프로토콜 방식을 사용할 것인지 확인한다.
- DNS서버가
www.google.com
라는 DNS를 조회하고 해당 서버의 IP 주소를 찾는다.
- 웹 브라우저는 https 프로토콜을 사용하는걸 확인했으므로 DNS서버가 찾은 IP의 443포트로 요청하는 HTTP 요청 메시지를 생성한다.
- 만들어진 HTTP요청 메시지를 소켓 라이브러리를 통해 OS계층으로 전달 된다.
- OS계층에서 전달 받은 HTTP메시지로 TCP/IP패킷을 생성한다.
- 만들어진 TCP/IP 패킷을 LAN장비를 통해 인터넷 망으로 보낸다.
- 요청을 받은 서버는 같은 방식으로 HTTP응답 메시지를 만들어 클라이언트에게 전달한다.
- 응답 받은 HTTP메시지를 웹 브라우저가 랜더링해서 클라이언트에게 보여준다.