URL과 리소스

2022. 4. 6. 02:57Studying/네트워크프로그래밍

Notion으로 보기  (더 깔끔합니다!)

1. URL이란?

URL은 Uniform Resource Locator의 약자로, 인터넷의 리소스를 가리키는 표준이름이다. URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리킨다. 이를 통해 애플리케이션/사람이 HTTP 및 다른 프로토콜을 통해 리소스에 접근할 수 있다.

URI은 URL와 URN으로 구성되어 있지만 대부분의 경우 URI는 URL을 가리킨다.

  • URN : 현재 그 리소스가 어디에 존재하든 상관없이 그 이름만으로 리소스를 식별한다.
  • URL : 리소스가 어디 있는지 설명해서 리소스를 식별

 

URL을 사용하면 리소스를 다음과 같은 일관된 방식으로 지칭할 수 있다.

스킴://서버위치/경로

더 자세히 나타내면 다음과 같다.

스킴 :// 사용자 이름 : 비밀번호 @ 호스트 : 포트 / 경로 ; 파라미터 ? 질의 #프래그먼트

각각 컴포넌트는 다음과 같은 의미를 갖는다.

 

각 컴포넌트들의 자세한 설명 (클릭)


1. 스킴 : 사용할 프로토콜

  • 어떤 프로토콜을 이용하여 리소스를 요청해야 하는지 알려줌
  • 알파벳으로 시작해야하고, 대소문자는 가리지 않는다

 

2. 호스트와 포트

  • 호스트는 리소스를 호스팅하는 서버의 호스트명/IP주소를 알려준다.
  • 포트는 서버가 열어놓은 네트워크 포트번호이다.
  • 호스트와 포트 컴포넌트는 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알려준다.
  • 많은 스킴이 기본 포트를 가지고 있다.

 

3. 사용자 이름과 비밀번호

  • 필수는 아니다.
  • 몇몇 스킴은 리소스에 접근하기 위해 사용자 이름을 요구한다.

 

4. 경로

  • 리소스가 서버의 어디에 있는지 알려준다.
  • 문법은 서버와 스킴에 따라 다르다.
  • 경로 컴포넌트는 경로조각으로 나눌 수 있다.

 

5. 파라미터

  • 애플리케이션이 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용함
  • 이름,값을 쌍으로 가지고, 여러 개를 가질 수 있다.
  • 각 경로 조각은 자체 파라미터를 가질 수 있다.
  • ex) 스킴://호스트/hammers;sale=false/index.html;graphic=true

 

6. 질의 문자열

  • 데이터베이스 같은 서비스들은 검색 범위를 좁히기 위해 질문이나 질의를 받을 수 있다.
  • ?의 오른쪽에 값을 쓰는 방식이다.
  • ex) http://호스트/inventory-check.cgi?item=12731

 

7. 프래그먼트

  • 리소스의 특정 부분, 리소스 내의 조각을 가리킬 수 있다.
  • 클라이언트는 서버에 프래그먼트를 전달하지는 않는다.
  • 브라우저가 서버로부터 전체 리소스를 내려받은 후, 프래그먼트를 사용하여 보고자 하는 리소스의 일부를 보여주는 방식으로 작동한다.
  • URL끝에 #문자로 구분

 

 

2. 단축 URL

URL은 상대 URL과 절대 URL 두 가지로 나뉜다. 두 가지 종류에 대해 각각 살펴보겠다.

(1) 절대 URL

지금까지 우리가 본 것들은 다 절대 URL이다.

절대 URL은 리소스에 접근하는데 필요한 모든 정보를 가지고 있다.

https://호스트/hammers;sale=false/index.html;graphic=true

 

(2) 상대 URL

상대 URL은 URL을 짧게 표기하는 방식으로 리소스에 접근하는데 필요한 모든 정보를 가지고 있지는 않다.

따라서, 상대 URL로 리소스에 접근하기 위해서는 기저(base)라고 하는 다른 URL을 사용해야한다.

 

상대 URL은 프래그먼트이거나 URL 일부이다. 따라서, URL을 처리하는 애플리케이션은 상대 URL과 절대 URL간에 상호 변환을 할 수 있어야 한다.

 

  • 상대 URL의 장점상대 URL을 사용하면 리소스 집합을 쉽게 변경할 수 있다.또한, 문서 집합의 위치를 변경하더라도, 새로운 기저 URL에 의해서 해석될 것이기 때문에 위치를 변경하더라도 잘 동작할 것이다.
  • → 절대 URL인 경우, 기저 URL이 바뀌게 되면, 모든 리소스를 하나하나 다 바꿔줘야한다.

 

(3) 상대 URL 변환 과정

1. 기저 URL 찾기

  1. 리소스에서 명시적으로 제공: 어떤 리소스들은 기저 URL을 명확하게 기술한다.
  1. 리소스를 포함하고 있는 기저 URL: 상대 URL이 기저 URL이 명시되지 않은 리소스에 포함된 경우, 해당 리소스의 URL을 기저 URl로 쓸 수 있다.
  1. 기저 URL이 없는 경우: 보통 이런 경우는 절대 URL이지만, 불완전하거나 깨진 URL일 수도 있다.

 

2. 상대 참조 해석하기

  • 상대 URL과 기저 URL을 각각의 컴포넌트 조각으로 나눈다. → URL 분해하기

3. 다음 알고리즘 사용

출처 : https://feel5ny.github.io/2019/08/09/HTTP_002/

기저 URL과 상대 URL을 이용한 절대 URL 변환 예시 (클릭)

 
상대 URL : ./hammers.html
기저 URL : http://www.joes-hardware.com/tools.html
  1. 상대 URL의 스킴이 비어있다 → 기저 URL의 스킴인 HTTP를 상속받는다.
  1. 적어도 한 개의 컴포넌트는 비어있지 않다 → 호스트 & 포트 컴포넌트를 상속받는다.
  1. 상대 URL과 상속 받은 컴포넌트들을 합치면 새로운 절대 URl을 얻을 수 있다.
http://www.joes-hardware.com/hammers.html

 

 

 

(3) URL 확장

어떤 브라우저들이 지원하는 기능을, 사용자가 URL을 입력한 다음이나 입력하는 중에 자동으로 URL을 확장하여, 사용자가 URL을 빠르게 입력하게 도와준다.

프락시를 사용할 경우 URL 자동확장 기능은 다르게 동작할 수 있다.

 

  • 호스트 명 확장단순한 휴리스틱만을 사용해서 입력한 호스트 명을 전체 호스트 명으로 확장할 수 있다.
    • 휴리스틱?

      불충분한 시간이나 정보로 인하여 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있게 보다 용이하게 구성된 간편추론의 방법 (위키백과)

    • 장점 : 사용자의 시간을 절약하고 혼란을 막아주는 기능
    • 단점 : 프락시와 같은 다른 HTTP 애플리케이션에 문제 발생 가능
  • ex) 주소 입력란에 ‘naver’를 입력하면 자동으로 ‘www.’과 ‘co.kr’을 붙여 ‘www.naver.com’을 만든다.
  • 히스토리 확장과거에 사용자가 방문했던 URL의 기록을 저장해놓고, 사용자가 URL을 입력할 때, 앞부분이 일치하는 URL을 선택하게 한다.
  • ex) ‘http://www.joes-’를 입력하면 ‘http://www.joes-hardware.com’을 보여주고, 사용자는 이를 선택하면 된다.

 

 

3. 안전하지 않은 문자

어떤 인터넷 프로토콜을 통해서든 안전하게 전송될 수 있도록 URL을 설계하는 것은 중요하다.

이 때, 안전한 전송이란 정보가 유실될 위험이 없다는 것이다.

따라서, URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함되도록 허락한다.

하지만, 사용자들은 알파벳 외의 문자도 포함하려고 할 때가 있기 때문에, 이스케이프라는 기능을 추가하여, 안전하지 않은 문자를 안전한 문자로 인코딩 할 수 있게 하였다. 이를 통해 이동성과 완성도를 높였다.

클라이언트 어플리케이션에서 안전하지 않거나 제한된 문자를 변환하는 것이 좋다. 이를 통해 애플리케이션 간에 공유할 수 있는 URL의 원형을 유지할 수 있기 때문이다.

 

(1) 인코딩 체계

인코딩은 안전하지 않은 문자를 %로 시작해 ASCII 코드로 표현되는 두 개의 16진수 숫자로 이루어진 ‘이스케이프’ 문자로 바꾼다.

ex) ~ → 0x7E

http://www.joes-hardware.com/%7Ejoe (~joe)

 

(2) 문자 제한

몇몇 문자는 URL 내에서 특별한 의미로 예약되어 있다. 따라서 해당 문자들을 사용하기 위해서는 반드시 인코딩을 해야한다.

ex) % (인코딩된 문자에 사용할 이스케이프 토큰)

/ (경로 컴포넌트에 있는 경로 세그먼트를 나누는 용도)

? (질의 문자열의 구획 문자로 선점)