Uniform resource identifier 의 약자로 통합 자원 식별자를 나타냄
정보 리소스를 고유하게 식별하고 위치를 지정하는 것
URL과 URN으로 나뉨
✔️ URL vs URN
- URL은 리소스가 어디 있는지 설명해서 리소스 식별 (주소로 찾기)
- URN은 현재 리소스의 위치에 상관없이 그 이름만으로 리소스를 식별 (이름으로 찾기)
📌 URL과 URN에 대한 자세한 개념은 아래 포스팅을 참고해주세요.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
- 스킴
- 리소스를 가져오려면 어떤 프로토콜을 사용해 서버에 접근해야 하는지
- 사용자 이름
- 몇몇 스킴은 리소스 접근을 위해 사용자 이름이 필요
- 기본값 : anonymous
- 비밀번호
- 사용자의 비밀번호
- 기본값 : 이메일 주소
- 호스트
- 리소스를 호스팅하는 서버 호스트 명이나 IP 주소
- 포트
- 서버가 열어놓은 포트번호
- 기본 포트를 열어놓은 경우 생략
- 기본값 : 스킴에따라 다름 ( HTTP의 기본 포트는 80 )
- 경로
- 서버 내 리소스의 위치
- 파라미터
- 특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용
- 질의
- 경로에서 가져온 리소스 형식의 범위를 구체적으로 좁히기 위한 컴포넌트
- 프래그먼트
- 리소스의 조각이나 일부분을 가리키는 컴포넌트
주어진 리소스에 어떻게 접근할지 알려주는 중요한 정보
알파벳으로 시작
URL의 나머지 부분들과 ':' 로 구분
대소문자를 가리지 않음
Ex. http:// == HTTP://
Ex.
- mailto - 이메일 주소
- ftp - FTP(File Transfer Protocol)
- rtsp - 스트리밍을 제공하기 위해 비디오 서버에 호스팅하고 있는 영화
Ex. 같은 주소를 나타내는 URL이 아래와 같이 있다고 할 때,
- https://www.google.com
- https://142.250.206.206:443
ㅤ
👉 차이점
- 전자는 호스트명, 후자는 IP주소로 호스트명을 가리키고 있음
- 전자는 포트번호가 없고, 후자는 포트번호 443이 존재
( 포트번호 443은 https의 기본 포트이기 때문에 생략해도 가능 )
Ex. 대표적인 예로 FTP 서버를 살펴보면,
- ftp://ftp.prep.ai.mit.edu/pub/gnu
➜ 사용자 이름이나 비밀번호가 없이 표준 스킴, 호스트, 경로만 존재
➜ 이 경우, 기본 사용자 이름으로는 기본값 anonymous를, 비밀번호는 브라우저마다 가지고 있는 기본값을 사용
ㅤ- ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
➜ 사용자 이름이 기본값인 anonymous
➜ '@'문자는 URL로부터 사용자 이름과 비밀번호 컴포넌트를 분리
ㅤ- ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu
➜ 사용자 이름(anonymous)과 비밀번호(my_passwd)를 ':' 문자로 분리하여 모두 기술
리소스가 서버의 어디에 있는지 알려줌
'/' 문자를 기준으로 경로 조각으로 나뉘어 계층적 파일 시스템 경로와 유사한 구조
( 각 경로 조각은 자체만의 파라미터 컴포넌트를 가질 수 있음 )
Ex. http://velog.io/@wnguswn7/hello 에서 /@wnguswn7/hello
많은 스킴이 객체에 대한 호스트 및 경로 정보만으로는 리소스를 찾지 못함
경로에 대한 구체적인 조건
애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용
이름/값을 쌍으로 가짐
Ex.
http://velog.io/@wnguswn7/hello;type=d
➜ 이름은 'type'이고, 값은 'd'인type=d라는 한개의 파라미터를 전달
다른 파라미터나 경로의 일부와 세미콜론(;)으로 구분하며 여러 개를 가질 수 있음
Ex.
http://velog.io/@wnguswn7/hello;sale=false/index.html;graphics=true
➜hello와index.html이라는 두개의 경로조각을 가지고 있는데,
hello는 값이 false인 sale이라는 파라미터를 가지고,
index.html은 값이 true인 graphics라는 파라미터를 가짐
Ex.
http://velog.io/@wnguswn7/top;sale=false?item=12731에서item=12731
Ex.
http://velog.io/@wnguswn7/top;sale=false?item=12731&color=blue에서item=12731와color=blue
리소스의 특정 부분을 가리킬 수 있도록 리소스의 조각이나 일부분을 가리키는 컴포넌트
URL 끝에서 '#'으로 구분
Ex.
http://velog.io/@wnguswn7/hello.html#title에서title
HTTP 서버는 객체 일부가 아닌 전체만 다루기 때문에, 서버까지는 프래그먼트를 전달하지 않음
( 브라우저가 서버로부터 전체 리소스를 내려받은 후에, 프래그먼트를 사용하여 보고자하는 리소스의 일부를 보여줌 )
Ex. 사용자가
http://velog.io/@wnguswn7/hello.html#title링크를 클릭하면,
브라우저는 프래그먼트를 제외한http://velog.io/@wnguswn7/hello.html를 서버에 요청하고,
서버가 전체 HTML 페이지를 반환하면,
브라우저가 이 응답을 받고title프래그먼트의 시작부로 스크롤을 내린 후 해당 부분을 보여줌
( 지금까지 이 글에서 다뤘던 것들은 절대 URL임 )
URL을 짧게 표기하는 방식
( 문서의 URL을 기준으로 상대경로로 표기 )
➜ 프래그먼트이거나 URL의 일부이기에 모든 정보를 담고 있지는 않음
기저(base)라고 하는 다른 URL을 사용해야함
문서의 위치를 변경하더라도, 새로운 기저 URL에 의해 해석될 것이기 때문에 잘 동작할 것
Ex.
- 기저 URL -
http://www.naver.com/hello1.html- 상대 URL -
./hello2.html
⠀
👉 새로운 절대 URL -http://www.naver.com/hello2.html
리소스에서 명시적으로 제공
Ex. HTML 문서에서 그 안에 있는 모든 상대 URL을 변경하기 위해 기저 URL을 가리키는 < BASE >HTML 태그를 사용
리소스를 포함하고 있는 기저 URL
➜ 기저 URL이 명시되지 않은 리소스에 상대 URL이 포함된 경우, 해당 리소스의 URL을 기저 URL로 쓸 수 있음
기저 URL이 없는 경우
( 절대 URL로만 이루어져있다는 의미 )
➜ 불완전하거나 깨진 URL일 수 있음
사용자가 URL을 빠르게 입력할 수 있도록 도와주는 것
( URL 전체를 입력하지 않아도 자동완성되는 것 )
호스트명 확장
Ex. 주소 입력란에 google을 입력하면,
브라우저는 호스트명에 자동으로www.과.com을 붙여서www.google.com을 만들어 줌
히스토리 확장
과거에 사용자가 방문했던 URL의 기록을 저장해놓았다가 보여주는 방법
Ex. 사용자가
http://www.goo를 입력한다고 하면,
브라우저는www.google.com을 보여줄 것.
그러면 사용자는 전체 URL을 입력하는 대신 선택만 하면 됨
URL 설계자들은 모든 인터넷 프로토콜로 URL이 가독성있게 전송되기를 바람.
따라서 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게 함
✔️ 안전한 전송
➜ 정보가 유실될 위험 없이 URL을 전송할 수 있다는 것
✔️ 이스케이프 문자열
➜ US-ASCII에서 사용이 금지된 문자들
➜ 특정 문자나 데이터를 인코딩할 수 있게 함으로써 이동성과 완성도를 높임
안전하지 않은 문자를 퍼센티지 기호(%)로 시작해, ASCII 코드로 표현되는 두개의 16진수 숫자로 이루어진 이스케이프 문자로 바꿔줌
Ex.
~문자 ➜ ASCII 코드 126(0x7E)
➜ URL에서는http://www.google.com/%7Ehello와 같이 바꿔줌
몇몇 문자들은 URL 내에서 특별한 의미로 예약되어있음
아래와 같은 문자들을 본래의 목적이 아닌 다른 용도로 사용하려면, 그 전에 반드시 인코딩 해야함
| 문자 | 선점 및 제한 |
|---|---|
| % | 인코딩된 문자에 사용할 이스케이프 토큰으로 선점 |
| / | 경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도로 선점 |
| . | 경로 컴포넌트에서 선점 |
| .. | 경로 컴포넌트에서 선점 |
| # | 프래그먼트의 구획 문자로 선점 |
| ? | 질의 문자열의 구획 문자로 선점 |
| ; | 파라미터의 구획 문자로 선점 |
| : | 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점 |
| $,+ | 선점 |
| @&= | 특정 스킴에서 특별한 의미가 있기 때문에 선점 |
| {}.~[]` | 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한 |
| <>" | URL 범위 밖에서 역할이 있는 문자이기 때문에 반드시 인코딩해야 함 |
| 0x00-0x1F, 0x7F | 인쇄되지 않는 US-ASCII 문자 |
| 0x7F보다 큰 범위 | 7비트 US-ASCII 문자가 아님 |