2024년 2월 13일
URI는 URL(Resource Locator) 와 URN(Resource Name)을 포함하는 개념이다.
URL은 해당 리소스의 위치를 의미하고, URN은 해당 리소스의 이름을 의미한다.
위의 사진처럼 URL은 찾고자 하는 리소스의 모든 경로를 의미하지만 URN은 경로 그자체에 이름을 부여한다.
이 이름은 영구적이고, 변하지 않는 값이다.
하지만 이는 리소스 접근 방법이나, 웹상의 위치가 표기가 되어있지 않고 이름만 부여되어있다.
그렇기때문에 실제 리소스를 찾을 수 있는 방법이 보편화 되어있지 않다.
그렇기에 URN은 보통 URL로 변환하여 사용한다.
URI의 U(Uniform)은 리소스를 식별하는 통일 된 방식, R(Resource)는 자원, URI로 식별할수 있는 모든 것 (쿼리 스트링, 프로토콜 등 모든것을 포함), I(Identifier)은 다른 항목과 구분하는데에 필요한 정보를 의미한다.
scheme://[userinfo@]host[:port][/path][?query][#fragment]
https://www.google.com/search?q=hello&hl=ko
보통 URI 는 이런식으로 구성 되어있다.
scheme는 프로토콜
이라고 생각하면 된다. (http or https, ftp 등)
http 는 보통 80포트, https는 443 포트를 주로 사용한다. (포트는 생략 가능하다)
userInfo는 URL에 사용자 정보를 포함해서 인증할때 사용한다
(하지만 거의 사용하지 않는다.)
host는 호스트명이다.
보통 도메인명이나 IP주소를 직접 사용 가능하다.
포트는 말그대로 포트 번호이다.
http는 80번 포트, https 는 443번 포트를 사용한다.
path는 리소스 경로
를 의미한다. 이는 보통 계층적 구조로 되어있다.
예를 들어서 /home/file1.jpg
라는 식의 path로 구성되어있다면 home 안에 file1.jpg가 찾고자하는 리소스인것이다.
query는 보통 key=value
의 형태로 이루어진다.
?로 시작하고, &로 추가가 가능하다.
?keyA=value&keyB=valueB
이를 보통 query parameter, query string 등으로 불린다. 웹서버에 제공하는 파라미터이다.
fragment는 주로 사용하지는 않고, 서버에 전송하는 정보는 아니다.
html 내부에서 내부 북마크 등에 사용된다.
예를 들어서 한 게시글에 앵커 태그가 A, B, C 로 구성 되어있다고 가정해보자.
로 가면 post 1번 게시글의 A 앵커태그로 이동하게 되는것이다.
https://www.google.com/search?q=hello&hl=ko
위의 이 주소로 서버에게 요청을 한다고 가정해보자.
이 url의 요청 페이지는
GET /search?q=hello&hl=ko HTTP/1.1
Host : www.google.com
이런식으로 path 정보와 http 정보, 그리고 host 정보도 포함되어서 서버에게 요청한다.
그림으로 설명해보자면 1번 단계에서 웹브라우저가 HTTP 메세지를 생성하는 것이다.
그 후에 TCP/IP가 연결되어서 데이터를 패킷으로 만들고, HTTP 메세지를 포함해서 물리적인 하드웨어(LAN)을 통해 서버로 전송 된다.
요청을 받은 서버에서는 위의 사진 같은 HTTP 응답 메세지를 응답해준다.