
AES256 알고리즘 등으로 암호화된 키를 쿼리스트링으로 전달할 때,
브라우저나 서버가 이를 유효하지 않은 URL로 인식하는 경우가 있습니다.
이는 암호화된 문자열에 URL에서 허용되지 않는 문자가 포함되어있기 때문입니다
이번 글에서는 웹에서 유효한 URL을 구성하는 방법과 URL 인코딩(퍼센트 인코딩)에 대해 정리하겠습니다
서버가 URL을 올바르게 해서갛려면, 표준 형식에서 변환하는 URL 인코딩 과정이 필요합니다
RFC 3986 문서에 따르면 URL은 ASCII 인코딩을 표준으로 사용하며, ASCII에 포함되지 않은
문자는 반드시 변환해야 합니다
만약 ASCII 문자 코드에 없는 문자가 포함되어 있는데 URL인코딩을 적용하지 않는다면,
앞서 언급한 것처럼 URL이 유효하지 않다는 오류가 발생할 수 있습니다
허용하는 URL문자란 ASCII 문자 코드에 포함되어 있으면서 예약되지 않은 특수문자를 의미합니다
대표적으로 다음과 같습니다
이외의 예약된 특수문자나 ASCII에 없는 문자는 반드시 URL인코딩을 적용해야 합니다
이때 사용하는 방법이 바로 URL 인코딩, 다른 말로는 퍼센트 인코딩이라고 합니다
퍼센트 인코딩은 특정 문자를 ASCII값의 16진수 표현으로 변환하는 방식입니다
각 문자는 %기호와 함께 16진수 코드로 치환됩니다
예를들어, :은 %3A, /는 %2F로 변환됩니다
다음은 URL에서 반드시 인코딩해야하는 주요 특수 문자 목록입니다
| 문자 | 인코딩 |
|---|---|
| : | %3A |
| / | %2F |
| ? | %3F |
| # | %23 |
| [ | %5B |
| ] | %5D |
| @ | %40 |
| ! | %21 |
| $ | %24 |
| & | %26 |
| ' | %27 |
| ( | %28 |
| ) | %29 |
| * | %2A |
| + | %2B |
| , | %2C |
| ; | %3B |
| = | %3D |
| % | %25 |
| 공백 | %20 또는 + |
| " | %20 |
| < | %3C |
| > | %3E |
| % | %25 |
| | | %7C |
위 특수문자가 옆에 있는 인코딩 문자열로 변경되며,
대상이 아닌 특수문자도 인코딩을 할 수는 있지만 권장되지는 않습니다
공백은 + 또는 %20으로 변환되는데,
+는 쿼리 스트링에서 공백을 의미하지만, 경로에서는 %20을 사용해야합니다
한국에서 서비스한다면 입력값으로 URL에 한글이 포함될 수 있습니다
예를들어, 어떤 검색사이트에서 한글로 검색하면 URL이 길어지는 것을 볼 수 있는데,
이는 한글이 URL 인코딩되어 있기 때문입니다.
아래와 같은 한글 입력값이 있다고 가정해보겠습니다
"백엔드개발자"
URL 인코딩을 적용하면 아래와 같은 결과가 나옵니다
%EB%B0%B1%EC%97%94%EB%93%9C%EA%B0%9C%EB%B0%9C%EC%9E%90
반대로 URL 디코딩을 적용하면 원본 한글 문자열로 복원됩니다
URL 인코딩은 전달받은 서버가 URL을 정상적으로 해석하기 위해 반드시 필요합니다
특히 다음과 같은 경우에는 반드시 URL 인코딩을 적용해야 합니다
ASCII에 없는 경우, URL에 표현될 수 없기 때문에 변환이 필요하며,
URL에서 ?나 # 같이 특정한 의미를 가지는 경우 인코딩하지 않으면 잘못 해석될 수 있기 때문에 반드시 URL인코딩이 필요합니다