URI(Uniform Resource Identifier)는 인터넷에서 접근 가능한 자원을 나타내는 유일한 식별자(주소)입니다.
https://www.domain.com:8080/some/resource/path?filter_name=some name&age=20
URI는 문자(Character)로 구성되며, 시스템에 따라서 어떤 문자를 읽을 수 있고 어떤 문자는 읽을 수 없을 수 있습니다. 마치 아스키(ASCII, 8bit)를 사용하는 시스템에서는 유니코드(Unicode, 16bit)를 사용하는 시스템에서 표현하는 문자 모두를 읽을 수 없는 것과 같습니다.
이스케이프(Escape)
문자의 조합을 어떠한 시스템에서도 이를 읽을 수 있도록 변환하는 과정을 이스케이프라고 부릅니다. 이스케이프가 처리된 문자는 ASCII 문자셋(Character Set)으로 변환됩니다. 만약 아스키에서 표현 불가능한 문자가 존재하면, ASCII에서 표현 가능한 여러 개의 문자 조합으로 대체합니다.
URI 인코딩(URI Encoding)
URI를 표현하기 위해 사용된 모든 문자를 Escape 처리하는 과정을 의미합니다. URI 인코딩이 완료된 URI는 ASCII로 표현됩니다.
URI 인코딩의 범위는 크게 두 가지로 구분됩니다(Javascript 기준).
- 알파벳과 숫자, URI에서 특별한 의미를 갖고 사용되는 문자는 유지하고, 나머지 문자를 이스케이프
- 알파벳과 숫자를 제외하고, URI에서의 특별한 의미를 갖고 사용되는 문자까지도 이스케이프
encodeURI(), decodeURI()
Javascript에서 URI 문자열을 이스케이프합니다. 단, 알파벳과 숫자, URI에서 특별한 의미를 갖고 사용되는 문자는 유지하고, 나머지 문자를 이스케이프합니다. 이스케이프에서 제외되는 문자는 다음과 같습니다.
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
아래 예시의 URI를 Javascript에서 encodeURI()로 이스케이프하면
https://www.domain.com:8080/some/resource/path?filter_name=some name&age=20
ASCII로 다음과 같이 인코딩됩니다.
https://www.domain.com:8080/some/resource/path?filter_name=some%20name&age=20
알파벳과 숫자는 이스케이프 되지 않습니다. URI를 구성하는 특별한 문자 ? / : = 등도 이스케이프 되지 않은 것을 확인 할 수 있습니다. 쿼리 파라미터(Query parameter)에 포함된 공백 문자(filter_name=some name에서)는 %20(ASCII Hex-16진수 표현)으로 이스케이프 되었습니다.
encodeURIComponent(), decodeURIComponent()
Javascript에서 URI 문자열을 이스케이프합니다. encodeURI(), decodeURI()와의 차이는 URI에서 특별한 의미를 갖고 사용되는 문자까지도 이스케이프한다는 점입니다. 이스케이프에서 제외되는 문자는 다음과 같습니다.
비예약 문자
예약 문자는 RFC 3986 Reserved Characters에서 확인 할 수 있으며, 비예약 문자는 RFC 3986 Unreservved Characters에서 확인 할 수 있습니다.
위의 예시 encodeURI()와 동일한 URI를 encodeURIComponent()로 이스케이프하면
https://www.domain.com:8080/some/resource/path?filter_name=some name&age=20
ASCII로 다음과 같이 인코딩됩니다.
https%3A%2F%2Fwww.domain.com%3A8080%2Fsome%2Fresource%2Fpath%3Ffilter_name%3Dsome%20name%26age%3D20
HTTP 요청 중 GET과 POST 구성을 위해서는 URI에서 특별한 문자로 처리하는 '&', '+', '='의 이스케이프가 필요합니다. 따라서 REST API를 구축하거나 HTTP GET, POST 사용을 위해서는 encodeURIComponent()를 사용하여 URI 인코딩을 진행하면 됩니다.
'Deprecated > HTTP' 카테고리의 다른 글
[Web/HTTP] MIME 타입과 MIME 스니핑 (0) | 2022.04.19 |
---|---|
[Web/HTTP] URL 및 URI 구문 분석 (0) | 2022.04.19 |
[Web/HTTP] URL, URN 그리고 URI의 차이점과 Path Variable, Query Parameter (0) | 2022.04.19 |
[Web/HTTP] HTTP/0.9, HTTP/1.x 그리고 HTTP/2 (0) | 2022.04.19 |
[Web/HTTP] HTTP 간단 정리 (0) | 2022.04.18 |