[Web] 인코딩/디코딩(ASCII, URL, Base64, Base62)

Encoding/Decoding

Posted by Wonyong Jang on April 30, 2022 · 4 mins read

인코딩이란, 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 처리 방식을 뜻한다.
즉, 컴퓨터가 이해할 수 있는 형식으로 바꾸어 주는 것을 말한다.
형태를 변환하는 것이지 내용을 바꾸는 것은 아니며, 암호화로는 사용이 불가능하다.

디코딩은 변환된 형태를 원래의 형태로 되돌리는 것을 말한다.

인코딩/디코딩 종류로는 ASCII, URL, Base 64, Base 62 등이 있으며, 이를 자세히 살펴보자.


1. URL 인코딩/디코딩

URL 인코딩이란 URL로 사용할 수 없는 문자 혹은 URL로 사용할 수 있지만 의미가 왜곡될 수 있는 문자들을 이스케이프 처리하여 변환하는 것을 말한다.

URL 인코딩은 퍼센트 인코딩이라고도 한다.

그리고 URL 디코딩이란 변환된 URL을 다시 원래의 형태로 되돌리는 것을 말한다.

스크린샷 2022-11-14 오후 11 09 23

그렇다면, URL 인코딩/디코딩은 왜 필요한 것일까?
이것을 이해하면, 왜 URL 인코딩/디코딩이 위 그림과 같이 이뤄지는지 이해할 수 있게 될 것이다.

첫번째로, 인터넷을 통해 전송할 수 있는 문자는 오로지 ASCII 문자이기 때문이다.
따라서, ASCII 문자가 아닌 문자는 인터넷을 통해 전송할 수 있는 형태로 변환해줘야 한다.
위 그림에서 빨간색으로 표시된 ‘피그’라는 문자와 파란색으로 표시된 ‘브라더’라는 문자가 바로 그 예시이다.
한글은 ASCII문자가 아니므로 변환이 필요하다. 그리고 이때 변환하는 규칙은 UTF-8을 따른다.
UTF-8에 따르면 한글 문자 1개는 3바이트로 인코딩 된다.
따라서 ‘피그’는 6바이트로, ‘브라더’는 9바이트로 인코딩 된 모습을 볼 수 있다.

두번째로, ASCII 문자라 하더라도 예약된 의미를 가지고 있는 문자의 경우, 그 문자 자체의 의미를 전달하고 싶은 경우에는 이스케이프 처리가 필요하기 때문이다.
이러한 문자의 대표적인 예시로는 ‘/’, ‘&’, ‘=’ 등이 있다.
‘/’은 URL의 각 레벨을 구분해주는 역할을 맡고, ‘&’는 쿼리 파라미터들을 구분해주는 역할을 맡으며, ‘=’ 은 쿼리 파라미터의 값을 지정해주는 역할을 맡는다.
이처럼 문자들은 ASCII 문자이지만 URL 내에서 특별한(예약된) 의미를 가지고 있다.
따라서 이러한 문자들을 문자 그 자체의 의미로서 전달하고 싶다면 이스케이프 처리가 필요하다.
위 그림처럼 keyword라는 쿼리 파라미터의 값으로 ‘피그&브라더’ 를 보내고 싶은 경우가 바로 그 예시이다.
여기서 ‘&’를 이스케이프 해주지 않으면 쿼리 파라미터의 구분자로 인식되어 왜곡된 의미가 전달이 될 것이다.
따라서, ‘&’를 ‘%26’ 으로 인코딩을 하여 문자 그대로의 ‘&’을 전달하고자 한다는 것을 나타내야만 한다.

참고로, URL에서는 공백 문자가 허용되지 않기 때문에 공백 문자는 ‘%20’ 또는 ‘+’로 인코딩 된다.


2. Base 64 인코딩/디코딩

Base 64를 글자 그대로 변역하여 보면 64진법이란 뜻이다.


3. Base 62 인코딩/디코딩

Base 62의 경우에는 ‘+’, ‘/’, ‘=’ 문자를 제외한 62개의 값을 표현한다.

긴 URL을 Shorten URL로 만들 때 적합하게 사용될 수 있다.
왜냐하면, URL의 예약어인 ( '/', '=' ) 등의 특수 문자를 사용하지 않기 때문이다.

알파벳 숫자 조합으로 Shorten URL 시퀀스 정보를 표현 가능하다.

https://wonyong-jang.github.io/spring/2021/02/17/Spring-UriComponentsBuilder-restTemplate.html 와 같은 긴 URL을 http://localhost/1000000와 같이 시퀀스 값으로 shorten url을 만들 수 있고, 해당 시퀀스를 base62 인코딩을 통해 더 줄일 수 있다.

1000000 은 10진수로 표현되었으니, 16진수로 표현하면 어떨까?

총 268,435,455 개를 만들 수 있고, 268배 더 만들 수 있다.

  • 1000000 -> f4240
  • 9999999 -> 98967f
  • 268435455 -> fffffff

그럼 62진수로 표현하면 같은 자릿수이지만 더욱 많은 수를 표현하여 Shorten URL을 제공할 수 있게 된다.


Referrence

https://medium.com/monday-9-pm/%EC%B4%88%EB%B3%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90-url-shortener-%EC%84%9C%EB%B2%84-%EB%A7%8C%EB%93%A4%EA%B8%B0-1%ED%8E%B8-base62%EC%99%80-%EC%B6%A4%EC%9D%84-9acc226fb7eb
https://it-eldorado.tistory.com/143