이번 포스팅에서는 바이트열을 문자열로 인코딩하는 방식에 대해 알아본다. 문자열을 바이트열로 인코딩하는 방식(ex.
ASCII
, ANSI
, UTF-8
등)이 아니므로 방향성에 주의하자. 바이트열 인코딩 방식에는 여러 종류가 존재하지만, 대표적으로 Base64
만 소개한다.1. Base64 개념
Base64
는 바이트열을 문자 코드에 영향받지 않는 64개의 ASCII
문자들로만 이뤄진 문자열로 인코딩하는 방식을 말한다. 화면에 출력 가능한 ASCII
문자가 128개가 되지 않기 때문에, ASCII
문자로 표현할 수 있는 최대 진법은 64진법이다. 임의의 바이트열을 64개의 문자들만 이용해서 표현하기 때문에 64진법이라고 하는 것이며, 이러한 이유로 Base64
라는 이름이 붙게 되었다. 참고로, Base64
도 64개의 문자로 어떤 것을 사용하느냐에 따라 여러 종류가 존재한다. 그러나 대부분 처음 62개는 알파벳 A-Z
, a-z
, 그리고 숫자 0-9
로 이뤄져 있다. 나머지 2개의 문자로 어떤 것을 사용하느냐에 따라 종류가 달라지게 되는 것이다.그렇다면
Base64
인코딩은 왜 사용하는 것일까? 아래에서 알아보겠지만 임의의 바이트열을 Base64
로 인코딩하면 길이가 약간(대략 33%) 늘어난다. 따라서 이러한 단점을 상쇄할 수 있을 만한 장점이 분명히 있어야 한다. 그것은 바로, Base64
가 데이터를 안전하고 시스템 독립적인 방식으로 전달할 수 있는 수단이라는 것이다. 모든 시스템이 공통으로 알고 있는 안전한 출력 문자만을 사용하기 때문에, 통신 과정에서 데이터가 잘못 해석되는 등의 문제가 발생하지 않게 된다. 또한 HTML이나 Email과 같은 문자 기반 미디어에 바이너리 데이터를 포함해야 할 때, 해당 바이너리 데이터가 시스템과 무관한 방식으로 동일하게 표현이 되도록 할 수 있다.2. Base64 인코딩 과정
본격적으로
Base64
인코딩 알고리즘을 한 번 알아보자. 기본적인 아이디어는 8비트 단위로 이뤄져 있는 바이트열을 (MSB부터 시작하여) 6비트 단위로 쪼개서 24비트 크기의 버퍼에 차곡차곡 채워 넣는 것이다. 6비트 단위인 이유는 64개의 문자만을 사용하기 때문이고, 24비트 크기의 버퍼를 사용하는 이유는 8과 6의 최소공배수이기 때문이다. 인코딩 과정을 정리하면 다음과 같다.- MSB부터 시작하여 6비트 단위로 쪼개어 24비트 버퍼에 차곡차곡 집어넣는다.
- 마지막 덩어리가 6비트보다 작다면, 나머지 부분은
0
(= Padding bit)으로 채워서 24비트 버퍼에 집어넣는다.
- 마지막 덩어리까지 집어넣었을 때, 24비트 버퍼가 다 채워지지 않았다면 남은 6비트 공간의 개수만큼
=
문자를 추가해준다.
3. Base64 인코딩 예시
다음은 인코딩하려는 바이트의 수가 3의 배수인 경우를 나타낸다. 즉, 24비트 버퍼를 전부 꽉꽉 채워서 남는 공간이 없는 경우이다.

반면, 다음은 인코딩하려는 바이트의 수가 3의 배수가 아닌 경우를 나타낸다. 24비트 버퍼를 다 채우지 못하기 때문에 패딩 비트(
0
)와 패딩 문자(=
)가 들어가 있는 것을 볼 수 있다.