1. URI ( Uniform Resource Identifier )

URI이란, 웹 서버가 리소스를 고유하게 식별할 수 있도록 하는 것으로써, URL과 URN 두 가지가 있는데 일반적으로 URL을 사용합니다.

  • URL은 특정 서버의 한 리소스에 대해 구체적인 위치를 서술합니다.
  • URN은 리소스가 어디에 위치해 있든 찾을 수 있는 방식을 말합니다. 

흔히 URI와 URL을 혼용해서 사용하기도 하며, 이글은 URL에 대해 자세히 다룰 것입니다.

URN에 대한 개념은 링크를 참고하시길 바랍니다.





2. URL 구조 ( Uniform Resource Locator )

URL은 스킴에 따라 문법이 모두 다르지만, 아래의 구조를 기반으로 선택적으로 사용합니다.


<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>?<질의>#<프레그먼트>


  • 스킴 ( scheme )
    • 사용할 프로토콜을 말하며, 리소스에 어떻게 요청, 접근할 것인지를 명시합니다.
    • 웹에서 주로 HTTP 프로토콜을 사용합니다.
      • 그 밖에 ftp, mailto(이메일), rtsp(스트리밍)과 같은 프로토콜을 사용할 수도 있습니다.
  • 사용자 이름과 비밀번호
    • 어떤 서버들은 자신이 가지고 있는 데이터에 접근하기 위해서 사용자의 이름과 비밀번호를 요구합니다.
      • ex) ftp://victolee:12345@호스트/asd.xls
    • 만약 웹 서버에서 사용자이름과 비밀번호를 요구하는 URL 스킴을 사용함에도 클라이언트가 이를 명시하지 않고 URL에 접근한다면, 기본값으로 "사용자 이름 : anonumous , 비밀번호는 브라우저에서 제공하는 기본 값"을 따르게 됩니다.
  • 호스트와 포트
    • 하나의 Host( 컴퓨터 )에는 여러 개의 Process( 프로그램 )이 각각의 Socket( 소켓 )을 사용하여 데이터 통신을 하고 있기 때문에, 각각의 소켓을 구분할 필요가 있습니다.
    • 이 때 소켓을 구분하는 역할을 하는 것이 Port( 포트 )입니다.
      • 톰캣을 다뤄보셨다면, 로컬에서 개발을 했을 때 접근하는 URL은 localhost:8080 일 것입니다.
      • 이처럼 서버에는 포트에 따라 소켓이 연결되어 있고, 포트 번호에 따라 다른 프로토콜이 사용될 수 있습니다.
    • HTTP 프로토콜에서 포트 번호를 명시하지 않으면, 80번 포트를 기본 값으로 사용합니다. ( Well-known port - 링크 )
      • ex) http://www.google.com:80
  • 경로
    • 호스트에서 제공하는 자원의 경로를 의미합니다.
    • ex) https://movie.naver.com/movie/running/current.nhn
  • 질의
    • Query String( 쿼리 스트링 )이라고도 합니다.
    • 클라이언트가 자원을 GET 방식으로 요청할 때, 필요한 데이터를 함께 넘겨 줄 목적으로 사용합니다.
      • 개발할 때 함수를 호출하면 파라미터를 던져주는데, 이와 비슷하다고 보면 됩니다.
      • ex) http://localhost:3000/index?id=3&page=1
  • 프래그먼트
    • HTML에는 각각의 요소에 id 속성을 부여할 수 있는데요, URL에 프래그먼트를 전달하면 페이지가 해당 id가 있는 곳으로 스크롤이 이동하게 됩니다.
    • 이 글의 URL에 프래그먼트를 추가하면, 가장 마지막으로 이동할 것입니다.
      • ex) http://victorydntmd.tistory.com/287#bottom





3. URL 허용 문자

안전한 전송이란 클라이언트의 요청 URL 문자열이 손실되지 않고 서버측으로 전송되는 것을 말합니다.


안전한 전송을 위해 초기 URL 설계자들은 알파벳( 정확히는 ASCII )만으로 URL을 작성하도록 권장을 했습니다.

그런데 웹이 커짐에 따라 세계적으로 웹을 사용하게 되었고, 이에 따라 비영어권 나라에서 URL에 알파벳만을 사용하는 것은 문제가 있다고 판단하게 되었습니다.

이에 ASCII 외의 문자들을 이스케이프 처리를 하여, ASCII 문자가 아닌( 안전하지 않은 ) 문자를 안전하도록 인코딩 하고 있습니다.


인코딩을 통해 안전하지 않은 문자( 비 ASCII )를 %기호로 시작하고 ASCII 코드로 표현되는 이스케이프 문자로 바꿉니다.

다음은 URL에서 안전하지 않은 문자를 입력했을 때, 인코딩된 예시입니다.

  • 빈 문자열
    • %20
  • ~ 기호
    • %7

 

실제로 아래와 같이 한글에 포함된 URL을 복사하고 붙여넣기 해보면,


다음과 같이 이스케이프 처리되는 것을 확인할 수 있습니다.

https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4


때문에 웹 개발 시, URI를 인코딩하고 디코딩하는 작업이 빈번하게 일어납니다.





이상으로 HTTP 프로토콜 구성 요소로서, 자원에 목적지를 알려주는 URL에 대해 알아보았습니다.

댓글 펼치기 👇
  1. Favicon of https://xiyo.tistory.com 엽기토끼이요 2020.11.26 10:15 신고

    선생님 좋은 문서 감사합니다.

    "2. URL 구조" 에서 이 부분에 컬러 하이라이트를 해주셨는데,
    이 부분 -> "<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>?<질의>#<프레그먼트>"
    마지막 부분에 "<경로>?<질의>#<프레그먼트>" 이 부분 하이라이트가 잘못된게 아닐까요?

    "?<질의>"가 한 세트로 되는거고,
    "#<프레그먼트>"가 한 세트가 아닐까요?

    질의가 없다면 "?"는 넣을 이유도 없을거고, 프레그먼트가 없다면 "#"을 넣을 이유도 없을 테니까요.