본문으로 바로가기

Base64 인코딩 (Base64 인코딩 이유)

category Program/Etc 2019. 3. 19. 19:15


개요


인코딩(encoding)이란 정보의 형태나 형식을 여러가지 목적에 따라 ( 저장 공간 ,데이터 표준화,  보안, 퍼포먼스,등)을 위해서 다른 형태나 형식으로 변환하는 처리 혹은 그 처리 방식을 뜻하는 개념입니다.


Base64는 Binary Data를 텍스트로 변경하는 인코딩 방식중 하나로 바이너리 데이터를 문자 코드에 영향을 받지 않는 공통 64개의 ASCII 영역의 문자들로 이루어진 문자열로 변경합니다.

(글자 그대로 64진법이란 뜻으로 ASCII 문자가 128개가 되지 않기 때문에 ASCII 문자로 표현할 수 있는 최대의 진법)


 Base64는 어떤 문자와 기호를 쓰느냐에 따라 다양한 변종이 있지만, 대부분 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있습니다.


 Base64 Encoding


base64인코딩 과정은 먼저 24bit의 buffer를 생성하여 위쪽(MSB)부터 바이트 데이터를 넣은 뒤,

버퍼의 위쪽부터 6bit 단위로 잘라 Base64 테이블의 ASCII 문자로 변환합니다. 


예를들어 바이트로 구성되어 있는 텍스트 3글자를 인코딩 할 경우 4개의 문자열 얻을 수 있습니다. 

Ex)  Man TWFu


 Padding


인코딩 과정중 남은 바이트가 3바이트(24bit) 미만 이라면 버퍼의 남은 부분에 패딩 비트(0)가 추가되며 
인코딩 아웃풋에 ASCII 테이블에 없는 = 문자가 생성된 것을 확인할 수 있습니다.  

이는 비트수를 맞춰 원본 바이너리 데이터가 없던 비트가 생기는 것을 방지하기 위함입니다. 



Why do we use Base64?


약 33%의 오버헤드가 발생하는 Base64는 왜 사용하는 걸까요?


Base64의 목적은 모든 가능한 바이트값(EX - 이미지)을 신뢰할 수없는 통신 채널을 통해 바이너리 데이터를 안전하게 전송할 수 있게 하는 것입니다. 

최초에는 이진 데이터를 다목적 인터넷 메일 확장의 일부로 전자 메일에 첨부 할 수있는 방법으로 고안되었습니다


과거에는 서로 다른 응용 프로그램마다 각각 다른 요구 사항이 있었기 때문에 조금씩 다른 방식으로 기본 인코딩이 구현되는 경우가 많았는데

ASCII 유형의 데이터를 바로 전송받아 처리하는 것은 프로토콜,시스템마다 다르게 해석되어 데이터가 왜곡될 여지가 있기 때문에 적합하지 않았습니다.


그리고 이기종 시스템간 이진 데이터를 전송할때 문자셋과 상관없는 ASCII 문자열로만 구성함으로써 위와 같은 이슈를 해결할 수 있습니다.

우리가 자주 사용하는 메일의 MIME(Multipurpose Internet Mail Extensions) 표준에서도 content transfer encoding 중 하나로 정의 되어 사용되고 있습니다.


부수적으로 XML이나 HTTP프로토콜에서도 특수문자 파싱 문제를 해결할 수 있는 수단중 하나로도 사용됩니다.

만약 바이너리 데이터를 Stream을 통해 직접 안전하게 주고 받을 수 있는 환경이라면 굳이 오버헤드를 발생시키면서 사용할 필요는 없어 보이네요.


Reference

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

https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464

https://stackoverflow.com/questions/3538021/why-do-we-use-base64

https://www.base64decode.org/