IT 상식/개발 상식

[Encoding] BASE64의 개념과 사용 이유

Soondo.Kwon 2022. 1. 23. 16:16

참조 :

BASE64란 무엇인가?

인코딩(Encoding)은 파일에 저장된 정보의 형태나 형식을 데이터 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태로 변환하는 처리 혹은 그 처리 방식을 말한다. 이메일 등의 전송, 동영상이나 이미지 영역에서 많이 사용되며, 반대의 의미로 디코딩(Decoding)이 있다.

BASE64는 글자 그대로 64진법이라는 뜻이며, 8비트 바이너리 데이터(예를 들어 실행 파일이나 Zip파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 문자로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 말한다.

 

BASE64 인코딩 과정은 먼저 24bit의 buffer(혼란을 줄이기 위해 6과 8의 최소공배수인 24bit)를 생성하여 위쪽(MSB)부터 바이트 데이터를 넣은 후, 버퍼 위 쪽부터 6bit 단위로 잘라서 BASE64 테이블의 ASCII 문자열로 변환한다. 다시 말해서, 원본문자열 > ASCII Binary > 전체 bit를 6bit로 cut > BASE64 encoding 순서가 된다.

예를 들어서, 아래의 그림을 보면 Man이라는 문자열을 BASE64로 encoding하는 과정이다. 
Man > 77 / 97 / 110 > 010011 / 010110 / 000101 / 101110 > TWFu

 

BASE64 Encoding 결과의 마지막에 '='가 붙어있는 경우가 많은데 그 이유는 1byte(8bit)로 되어 있는 문자열을 6bit로 나누어서 Encoding을 진행하게 되는데 혼란을 야기시키지 않기 위해 6과 8의 최소공배수인 24bit의 Buffer를 가지고 Encoding을 진행하게 된다. 때문에 Encoding이 되지 않은 빈 Buffer공간은 '='로 채우게 되어 있다. 아래는 'a'를 입력하였을 때 Encoding하는 과정이다.

직접 Encoding과 Decoding을 변환하는 테스트를 해보고 싶다면 아래의 링크에서 가능하다.
http://www.BASE64encode.org/
 

Base64 Encode and Decode - Online

Encode to Base64 format or decode from it with various advanced options. Our site has an easy to use online tool to convert your data.

www.base64encode.org

 

BASE64를 사용하는 이유

 
위의 과정대로 BASE64로 인코딩을 하게 되면 8bit의 문자열을 6bit로 나누어야 하기 때문에 2bit의 Overhead가 발생하여 전송해야 할 데이터의 크기가 약 33% 증가하게 된다. 데이터의 크기가 증가하고 Encoding / Decoding의 추가 연산이 필요한데 BASE64를 사용하는 이유가 무엇인가?
 
통신 과정에서 바이너리 데이터의 손실을 막기 위해 사용된다.
플랫폼 독립적으로 Binary Data(이미지와 오디오 같은)를 전송할 필요가 있을 때, ASCII로 Encoding하여 전송하게 되면 여러가지 문제가 발생할 수 있다.
 
대표적으로 발생할 수 있는 문제는
  • ASCII는 7bit Encoding인데 나머지 1bit를 처리하는 방식이 시스템 별로 상이하다.
  • 일부 제어문자(e.g. Line ending)의 경우 시스템 별로 다른 코드값을 가진다.

위와 같은 문제로 ASCII는 시스템 간 데이터를 전달하기에 안전하기 않다.
BASE64는 ASCII 중 제어 문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용한다.
(안전한 출력 문자란 문자 코드에 영향을 받지 않는 공통 ASCII를 의미)

즉, BASE64는 HTML 또는 Email을 통한 바이너리 데이터 전송 경우, Binary Data가 시스템 독립적으로 동일하게 전송 또는 저장되는 것을 보장하기 위해 사용된다.

BASE64는 XML, JSON, REST API 등 문자열 기반 데이터를 주고 받는 환경에서 multi-form을 다룰 경우 함께 사용된다.