안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

기타 IT 지식 (Etc)

[바이트열 인코딩] Base64

피그브라더 2020. 6. 17. 10:36

이번 포스팅에서는 바이트열을 문자열로 인코딩하는 방식에 대해 알아본다. 문자열을 바이트열로 인코딩하는 방식(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의 최소공배수이기 때문이다. 인코딩 과정을 정리하면 다음과 같다.

 

  1. MSB부터 시작하여 6비트 단위로 쪼개어 24비트 버퍼에 차곡차곡 집어넣는다.
  2. 마지막 덩어리가 6비트보다 작다면, 나머지 부분은 0(= Padding bit)으로 채워서 24비트 버퍼에 집어넣는다.
  3. 마지막 덩어리까지 집어넣었을 때, 24비트 버퍼가 다 채워지지 않았다면 남은 6비트 공간의 개수만큼 '=' 문자를 추가해준다.

 

3. Base64 인코딩 예시

다음은 인코딩하려는 바이트의 수가 3의 배수인 경우를 나타낸다. 즉, 24비트 버퍼를 전부 꽉꽉 채워서 남는 공간이 없는 경우이다.

 

 

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