CS

Base64 인코딩이란?

Junuuu 2024. 2. 23. 00:01

개요

프로그래밍을 하다 보면 인코딩, 디코딩을 수행하게 되는데 Base64 인코딩에 대해서 알아보고자 합니다.

 

Base64 인코딩이란?

RFC 4648에 정의된 base 64 인코딩 표

바이너리 데이터 0과 1을 64개의 문자로 매핑시키는 표가 존재하고, 해당 방식으로 문자를 변환시킵니다.

64개의 문자로는 A-Z, a-z, 0-9 부호 2개(+, /) 패딩(=)을 활용합니다.

패딩이란 부족한 bit수를 채우는 과정을 뜻합니다.

 

바이너리를 보면 000000 ~ 111111로 구성된 모습을 볼 수 있습니다.

이를 통해 하나의 문자(Char)는 6개의 비트로 구성되는 것을 이해할 수 있습니다.

 

즉,  6개의 비트인 바이너리 데이터를 ASCII 문자로 혹은 ASCII 문자를 바이너리로 데이터로 변환하는 방법입니다.

 

패딩이 필요한 이유와 어떻게 변환되는지는 예시를 통해 자세하게 알아보겠습니다.

 

 

ASCII 코드표와 text의 변환과정

ASCII 코드표

 

ASCII 코드표와 함께 실제 Base64 인코딩이 어떻게 수행되는지 살펴보겠습니다.

실제 변환은 text 문자열 -> Ascii binary -> 6 비트씩 자르는 연산 -> base64 인코딩 순서로 일어납니다.

 

Ma라는 text문자열 변환과정 예시

M a  
77 (0x4d) 97 (0x61)
0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0
19 22 4 Padding
T W E =
84 (0x54) 87 (0x57) 69 (0x45) 61 (0x3D)

 

M과 a는 ASCII의 Decimal으로 변환하면 77 97로 변환됩니다.

이때 M과 a는 각각 8비트로 표현됩니다.

6비트씩 자르는 연산을 수행해보면 19 22가 되고 남아있는 2자리를 0으로 채워서 마지막은 4가 됩니다.

Ma는 Base64 인코딩을 통해  TWE=로 변환됩니다.

 

0 패딩은 6비트를 위해 하는 것 같은데 =패딩은 왜 수행하는 걸까요?

Base64 인코딩은 8비트의 바이너리 데이터를 6비트로 변환하기 때문에 6과 8의 최소공배수를 맞추어주는 작업이라고 이해하면 좋습니다.

 

8비트 바이너리 데이터는 8비트, 16비트, 24비트 등으로 표현할 수 있습니다.

하지만 6비트 바이너리 데이터는 6비트, 12비트, 18비트, 24비트로 표현할 수 있기 때문에 최소공배수인 24비트를 맞추기 위해서 0, =으로 패딩을 수행합니다.

 

=, 0 패딩을 통해 용량이 더 커지는 모습을 볼 수 있습니다.

 

오히려 크기가 늘어나는데 왜 사용하지?

지금까지는 Base64 인코딩이 어떻게 일어나는지 알아보았습니다.

하지만 근본적으로 ASCII 대신에 base64 인코딩을 사용하면 용량이 더 커지는데 왜 사용하는 걸까요?

 

아스키코드표를 보면 제어문자가 다수 포함되어 있습니다.

제어 문자는 탭, 스페이스, 이스케이프(ESC)와 같은 것들을 뜻합니다.

만약 시스템 간에 탭을 눌렀을 때 A 시스템은 4칸 들여 쓰기를 하고 B 시스템은 90이라는 문자를 입력하도록 되어있다면 동작이 달라질 수 있습니다.

반면 Base64는 제어문자와 일부 특수문자들을 제외하여 안전한 64개의 출력문자만 사용합니다.

 

예를 들어 텍스트, 이미지, 오디오 등의 문자를 전송하기 위해서는  ASCII로 인코딩시 일부 제어문자가 시스템별로 처리하는 방식이 다를 수 있기 때문에 시스템 간 전달이 안전하지 않기 때문입니다.

 

 

 

 

 

참고자료

https://en.wikipedia.org/wiki/Base64