[웹 개발자를 위한 웹을 지탱하는 기술] - URI 스펙

김성혁·2022년 3월 14일
0

👨🏻‍💻 URI란?

  • 리소스를 통일적으로 식별하는 ID
  • 웹상에 존재하는 리소스를 표현하는 방식

👨🏻‍💻 URI 구문

간단한 URI의 예

📝 http://blog.example.com/entries/1
  • URI Scheme
    • URI가 이용하는 프로토콜을 나타내는 것이 일반적
    • URI 스키마와 그 뒤에 이어지는 부분은 ‘://’로 구분
    • http
  • 호스트 명
    • DNS에서 이름을 해석할 수 있는 도메인명이나 IP 어드레스로 인터넷에서 반드시 일의성을 가짐
    • blog.example.com
  • 패스
    • 호스트 안에서 오로지 하나의 리소스를 가리키는 계층화를 나타내는 경로
    • /entries/1

복잡한 URI의 예

📝 http://yohei:pass@blog.example.com:80/search?q=test&debug=true#n10
  • URI Scheme
    • http
  • 사용자 정보
    • 해당 리소스에 접근할 때 이용할 사용자 이름과 패스워드
    • 이름과 패스워드는 ‘:’로 구분
    • yohei:pass
  • 호스트명
    • 사용자 정보와 호스트명 사이는 ‘@’로 구분
    • blog.example.com
  • 포트번호
    • 프로토콜이 사용할 TCP의 포트번호
    • 생략할 경우 각 프로토콜의 디폴트 값을 사용
    • 80
  • 패스
    • /search
  • 쿼리 파라미터
    • 쿼리 파라미터 앞에 구분문자 ‘?’가 오고, 이름=값 형식으로된 쿼리 사용
    • 쿼리가 여러 개일 때 ‘&’로 연결
    • 검색 서비스에 검색 키워드를 전달할 때 등 클라이언트에서 동적으로 URI를 생성할 때 사용
    • q=test&debug=true
  • URI 프래그먼트
    - # 앞에 문자열로 표현한 URI가 가리키는 리소스 내부에서 더 세세한 부분을 특정할 때 이용
    - #n10

👨🏻‍💻 절대 URI와 상대 URI

  • 파일 시스템의 경우, 커맨드 라인에서 디렉터리나 파일의 위치를 지정할 때 현재 디렉터리부터의 상대 경로로 나타내는 것이 일반적
  • 현재 디렉터리는 ‘.’ 그 상위 디렉터리는 ‘..’
  • 상대 URI는 URI 스키마와 호스트명을 생략하고, 경로만으로 표현

Base URI

  • 상대 URI의 기준이 되는 URI가 어디인지 알 수 없다.

  • 기점이 되는 URI를 지정하는 것을 Base URI

  • ‘/’ 로 시작하는 상대 URI는 호스트 명부터 시작되는 경로로 해석

  • 리소스의 URI를 Base URI로 하는 방법

    • 상대 URI가 출현하는 리소스의 URI를 Base URI로 부여하는 것
    • 직관적이고 이해하기 쉽다
    • 다만, Base URI가 되는 리소스의 URI를 클라이언트 측에서 가지고 있어야 한다.
  • Base URI를 명시적으로 지정하는 방법

    • HTML과 XML 안에서 명시적으로 Base URI를 지정하는 방법
    • HTML의 경우, 요소 안에 요소를 삽입
    • XML의 경우, xml:base 속성 이용

👨🏻‍💻 URI와 문자


URI에서 사용할 수 있는 문자

  • 알파벳 : A-Za-z
  • 숫자 : 0-9
  • 기호 : -.~:@!$&’()
  • ASCII 이외의 문자를 URI에 넣을 때는 %인코딩 방식을 이용


%인코딩

  • UTF-8 문자를 구성하는 각 바이트를 ‘%xx(xx는 16진수)’로 기술하여 URI에 사용할 수 없는 문자를 표현
  • URI에서는 알파벳 대소문자를 구분하지만, %인코딩에서는 대소문자 모두 같은 의미를 가짐.
    - URI 스펙에서는 대문자 사용 권장

%인코딩의 문자 인코딩

  • 서버가 제공하는 URI를 그대로 다루는 경우는 서버가 %인코딩하고 있으므로 문제가 없지만, 클라이언트 쪽에서 폼을 사용해 URI를 생성하는 경우 인코딩 방식을 클라이언트가 판단할 수 없다.

👨🏻‍💻 URI의 길이 제한

  • 스펙상으로는 URI 길이에 제한이 없지만 구현상으로는 존재

👨🏻‍💻  다양한 스키마

  • URI 스키마는 공식과 비공식을 합하면 170개 이상이 존재
  • 특정 네임스페이스 전용으로 URI 스키마를 새로 발명하지 말 것.
  • URI 스키마를 새로 등록해야만 하는 경우가 있다면 프로토콜 발명했을 때 정도..

👨🏻‍💻 URI 구현에서 주의할 점들

  • 웹 서비스와 웹 API를 구현함에 있어서 URI의 스펙상 주의해야 할 것은 상대 URI의 해석과 %인코딩
  • 가능한 절대 URI를 사용하는 편이 클라이언트에게 도움
  • 가능한 UTF-8을 이용하는 것이 바람직
  • URI = URL + URN
  • URN을 이용하면 리소스에 도메인명과는 독립된 이름을 붙일 수 있다.

0개의 댓글