👨🏻💻 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
- 사용자 정보
- 해당 리소스에 접근할 때 이용할 사용자 이름과 패스워드
- 이름과 패스워드는 ‘:’로 구분
- yohei:pass
- 호스트명
- 사용자 정보와 호스트명 사이는 ‘@’로 구분
- blog.example.com
- 포트번호
- 프로토콜이 사용할 TCP의 포트번호
- 생략할 경우 각 프로토콜의 디폴트 값을 사용
- 80
- 패스
- 쿼리 파라미터
- 쿼리 파라미터 앞에 구분문자 ‘?’가 오고, 이름=값 형식으로된 쿼리 사용
- 쿼리가 여러 개일 때 ‘&’로 연결
- 검색 서비스에 검색 키워드를 전달할 때 등 클라이언트에서 동적으로 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을 이용하면 리소스에 도메인명과는 독립된 이름을 붙일 수 있다.