[CS] Base64 인코딩에 대해 - 컴퓨터 내부의 언어 체계

2021. 7. 31. 19:40Computer Science

반응형

 

인코딩(Encoding) 이란

문자 인코딩(영어: character encoding), 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 넓은 의미의 컴퓨터는 이러한 신호를 입력받고 처리하는 기계를 뜻하며, 신호 처리 시스템을 통해 이렇게 처리된 정보를 사용자가 이해할 수 있게 된다.

 

Base64 인코딩

컴퓨터 분야에서 쓰이는 Base 64란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.

원래 Base 64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다.

그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다.

Base64 인코딩이란, binary data(2진 데이터)를 텍스트로 변경하는 인코딩이다. 이 텍스트들은 공통 ASCII 코드 영역의 문자로만 이루어진 문자열이다. 

 

출처: 위키피디아 

 

Base64 를 사용하는 이유

통신과정에서 바이너리 데이터의 손실을 막기 위해 사용된다.

플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 Encoding 하여 전송하게 되면 여러 가지 문제가 발생할 수 있다.

 

예를 들어 아래와 같은 문제들.

  • ASCII는 7비트 인코딩인데 나머지 1비트를 처리하는 방식이 시스템 별로 상이하고
  • 일부 제어 문자 (e.g. Line ending)의 경우 시스템 별로 다른 코드값을 가진다 

 

위와 같은 문제로 ASCII는 시스템 간 데이터를 전달하기에 안전하지 않다고 한다. 

Base64는 ASCII 중 제어 문자와 일부 특수문자를 제외한 64개의 안전한(문자 코드에 영향을 받지 않는 공통 ASCII를 의미) 출력 문자만 사용하기 때문에 이를 사용하는 것.

 

🧤 한줄 요약

Base64는 HTML 또는 Email과 같이 문자를 위한 Media에 Binary Data를 포함해야 될 필요가 있을 때, 포함된 Binary Data가 시스템 독립적으로 동일하게 전송 또는 저장되는 걸 보장하기 위해 사용한다.

 

인코딩 과정 및 방법

Base64 는 3바이트(24비트) 데이터를 4문자로 표현한다.

3바이트 데이터의 24비트를 네 가지 6비트 덩어리로 나누고, 각 덩어리의 6비트값에 출력 가능한 문자를 할당해 표현한다.

 

 

예를 들어, 아래 문장을 base64 인코딩을 통해 변환하고 싶다면?

Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

 

결과값 👇

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0 aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1 c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0 aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdl LCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

 

그럼 어떻게 이렇게 변환되는가? 위에서 가장 첫 단어인 "Man" 을 인코딩 하는 과정은 아래와 같다.

  • 각 문자에 대응하는 아스키코드 값으로 변환 ->
  • 이럴 8비트로 표현 
  • 3개의 문자니까 총 24비트가 되고(한 문자당 8비트로 표현했으니까) 이를 6비트 씩 나눠서 4개의 덩어리로 만든다
  • 각 덩어리에 해당하는 값을 계산하고(아래에서 Index에 해당하는 값)
  • 이를 위에 있는 Base64 색인표에서 해당하는 문자를 pick! 

출처: 위키피디아 

 

이 인코딩은 모든 3바이트 조합을 4바이트 조합으로 변환할 수 있다. 하지만 원본 데이터 길이가 3바이트의 배수라는 보장은 없다. 패딩(padding) 문자를 도입해 이런 문제를 해결한다. 원본 데이터가 2바이트 남으면 끝에 =를 붙이고, 1바이트 남으면 끝에 ==를 붙인다.

 

 

생각보다 쉽다 ㅎㅎ 재밌군 !!! 

 

 

 

반응형