웹 서버 구현기 1-1 URL

Plato·2023년 6월 3일
0

웹서버 구현기

목록 보기
2/11

서론

사용자는 많은 시간을 웹 브라우저를 사용하며 보낸다. 어느 통계에 따르면 컴퓨터 사용 시간의 n%를 브라우저가 차지한다고 한다. 이토록 우리는 웹 브라우저를 통해 많은 자원을 획득하고 소비한다. 그런데 브라우저는 어느 자원을 요청할 것인지 어떻게 표현하고 서버는 어느 자원을 보내야할지 어떻게 판단할까? 이를 위해 쓰이는 URL에 대해 알아보자.

본론

URL의 구조

URL은 아래와 같은 구조를 갖는다.

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

  1. 스킴(Scheme)
    a. 어떤 프로토콜을 사용하여 자원을 요청할지 명시한다.
    b. http, https, ftp 등의 다양한 프로토콜이 존재한다.
  2. 사용자 이름
    a. 해당 자원을 요청할 때, 서버가 사용자를 식별할 수 있도록 사용자 이름을 제공할 수 있다. 모든 URL에 사용자 이름이 포함돼야하는 건 아니다.
  3. 비밀번호
    a. 사용자 이름과 동일하게, 서버가 사용자를 식별할 수 있도록 돕는다.
  4. 호스트
    a. 자원을 요청할 서버를 나타낸다. 도메인 이름이나 ip 주소이다.
  5. 포트
    a. 서버의 어느 포트를 통해 통신할지 나타낸다.
  6. 경로
    a. 서버는 여러 개의 자원을 가질 수 있다. 그 중에서 어디에 위치한 자원을 요청하는 것인지 나타낸다.
    b. 경로는 스킴에 따라 다른 형태를 갖는데, 경로를 하위 컴포넌트로 나눌 수 있고 각각의 경로 컴포넌트는 아래에서 설명할 파라미터를 가질 수 있다.
  7. 파라미터
    a. 자원의 위치 정보만으로는, 서버가 적절한 자원을 제공할 수 없는 경우가 존재할 수 있다. 이 경우, 추가적인 정보를 제공할 수 있는데 이를 파라미터라 부른다.
    b. <이름>=<값>의 형식을 사용하고 ;으로 다른 경로 컴포넌트 혹은 파라미터와 구분한다.
    c. ex) https://www.naver.com/beautiful;bot=false/index.html;text=true 이 예시에서 beautiful이라는 경로 컴포넌트의 파라미터로 bot=false가 주어지고 index.html 경로 컴포넌트의 파라미터로 text=true가 주어진 것이다.
  8. 질의
    a. 파라미터와 비슷하게 자원에 대한 추가 정보를 표현하는 부분이다. 정확히 어느 상황에서 질의가 파라미터보다 나은지 파악하기 힘들었다. 질의로는 구현할 수 있지만 파라미터로는 구현을 못하거나 그 역의 경우가 존재하는 것처럼 보이지는 않는다.
    b. 질의 문자열은 ?로 시작한다. 정해진 형식은 없지만 일반적으로 &로 나뉜 <이름>=<값> 형태를 사용한다.
  9. 프래그먼트
    a. 자원 내부의 특정 부분을 나타내는 컴포넌트다. 이는 서버로 전달되지 않고, 웹 브라우저와 같은 유저 에이전트가 사용한다.

상대 URL

URL은 크게 절대 URL과 상대 URL로 나뉜다. 절대 URL은 생략돼있는 정보가 없는 URL을 말하고 상대 URL은 생략돼있는 정보가 있어서 이를 파악하여 절대 URL로 바꿔야하는 URL을 말한다.

기저 URL

기저 URL은 상대 URL에 생략돼있는 정보를 파악하는데 쓰이는 URL을 일컫는 말이다. 기저 URL을 정하는 방법은 아래와 같다.

  1. 리소스가 명시적으로 기저 URL을 표현하는 경우 이를 기저 URL로 사용한다.
    a. ex) html의 경우 <BASE> 태그를 사용해서 기저 URL을 명시할 수 있다.
  2. 상대 URL이 다른 리소스에 포함돼있고 해당 리소스가 명시적으로 기저 URL을 표현하지않는 경우, 상대 URL을 포함하는 리소스의 URL을 기저 URL로 사용할 수 있다.
    a. html 문서에서 <BASE> 태그를 사용하지 않은 채 상대 URL을 사용하면 해당 html 문서의 URL이 기저 URL이 될 수 있다.
  3. 기저 URL이 없는 경우
    a. 기저 URL이 없으면 절대 URL만 존재하는 것이다. 만약 상대 URL처럼 보이는 URL이 있다면, 상대 URL을 절대 URL로 변환하는데 필요한 기저 URL이 없기 때문에, 해당 URL은 불완전한 절대 URL이 된다.

상대 URL 변환 알고리즘

해당 책에서는 상대 URL을 어떻게 변환하는지 도표를 통해 나타낸다. 하지만 이 도표를 읽어서는 이해하기 쉽지 않다. 웹 서버가 상대 URL을 파싱할 필요는 없는 것이니 중요하지 않은 내용이라 판단하여 넘어가기로 했다. 도표를 읽어서 이해하기보다는 RFC2396의 "5.2. Resolving Relative References to Absolute Form" 부분을 읽는 것이 더 도움이 될지도 모르겠다.

안전하지 않은 문자

URL은 기본적으로 US-ASCII 문자 집합을 사용한다. 해당 문자 집합의 모든 문자를 URL에서 사용할 수 있는 것은 아니고, "안전한 문자"만 사용할 수 있다. 여기서 "안전한 문자"란 출력 가능한 문자이면서 특별한 의미로 예약되지않은 문자이거나 특별한 의미로 예약된 문자를 해당 의미로 쓴 문자를 의미한다. 특별한 의미로 예약된 문자를 해당 의미와 다른 의미로 사용하면 "안전하지 않은 문자"로 취급해야한다. "안전하지 않은 문자"는 %로 시작해서 ASCII 코드로 표현되는 두 개의 16진수 숫자로 나타낼 수 있다.

ex.) 문자 ~ 를 표현하기 위해서 ~의 ASCII 코드인 126(0x7E)을 사용한다. http://www.joes-hardware.com/%7Ejoe. 여기에서 %7E가 안전하지 않은 문자 ~를 인코딩한 것이다.

참고자료

HTTP 완벽 가이드 웹은 어떻게 동작하는가

0개의 댓글