Base64 인코딩이란? 정확하게 이해하기
본문 바로가기
겅부합시다

Base64 인코딩이란? 정확하게 이해하기

by 쏠수있어ㅤ 2022. 8. 16.
반응형

 

 

base64 인코딩을 알아보기 전에 "인코딩, Encoding" 이란 무엇인지 간략하게 알면 더 좋을 것 같다. 

 

인코딩이란?

어떠한 정보/데이터의 형태나 형식을 다른 형태나 형식으로 변환하는 것을 말한다. 왜 굳이 잘 있는 데이터를 다른 형식으로 변환할까? 그 이유로는 데이터의 표준화, 처리 속도 향상, 저장 공간 절약, 보안 등이 있다. 

 

아래 포스팅에 인코딩과 디코딩의 종류, 처리 프로세스 등을 자세하게 적어 놓았다. 

👉 인코딩 vs 디코딩에 대한 자세한 포스팅 바로가기

 

 

 

Base64 인코딩이란? 

Base64는 64진법의 의미를 가지고 있는데 2의 6제곱 (2^6=64) 64 으로 ASCII 문자들로 표시할 수 있는 가장 큰 진법이다. 덕분에 데이터 교환에 많이 쓰인다. 

 

 => Base64란 Binary data (이진 데이터) 를 ASCII 문자로만 이루어진 Text로 변환시키는 인코딩이다. 

 

여기서 ASCII 문자로만 이루어진 Text라 함은 아래 기호들로 구성된 것을 말한다. ASCII 문자 코드 중 제어문자가 상당해서 아래의 64개 기본적인 문자로 Base64인코딩이 진행된다.

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= "

Base64로 인코딩된 문자들은 위에서 보여진바와 같이 A-Z, a-z, 0-9, +, =, / 로 구성된다. 이 중에서 "=" <- 요 기호를 잘 봐둘 필요가 있다.  "="는 부족한 bit수를 =으로 채워 나타내는 padding 문자이기 때문이다. 인코딩된 문자열이 "~~~==" 또는 "~~~~=" 이렇게 끝난다면 적용된 인코딩이 Base64라고 유추할 수 있다. 부족한 bit수 ? 왜 굳이 채워야하지 ? 에 대한 의문은 아래 base64 변환 과정에서 답을 찾을 수 있다. 

 

Base64 인코딩 방식은 binary-to-text encoding schemes 의 한 종류이다. 이는 binary data(더 정확하게는 8-bit bytes의 연속인 데이터) 를 4개의 6-bit Base64 숫자로 나타낼 수 있는 24bits의 연속으로 변환한다. 

 

 

 

 

Base64 변환 과정 

 

위의 문자 64개로 모든 문자열을 표현하고자 하면 (0~63 : 총 64개 = 2^6) 6비트가 필요하다. 하지만 일반적인 컴퓨터 데이터나 보편적으로 쓰이는 Ascii 문자는 모두 8비트 ( = 1 byte) 로 구성되어 있다. 이제 Base64인코딩을 위해 문자열 2진 데이터를 6비트씩 묶어야 하는데 여기서 6과 8의 최소공배수 = 24 비트씩 끊어서 묶도록 한 것 이다. 

 

그럼 원래 3 바이트 (3x 8 = 24 bytes) 였던 문자열이 6비트 단위 4개로 바뀐다.  (4 x 6 = 24 bytes) 즉, 사실 같은 bytes 의 수인데 몇개의 바이트를 하나로 묶는지가 다를뿐이다.

 

아래 표를 보면 글보다 Ascii 문자인 "Man"가 Base64 인코딩되어 변환되는 과정을 더 잘 이해할 수 있다. 

위의 원리는 아래와 같다.

문자열 -> Ascii binary -> 6 bit cut -> base64 encod 

위의 예시에서는 M a n 과 같이 문자 3개 x 8 bits = 24 bits % 6 bits => 4 로 딱 ! 떨어지게 계산이 된다. 만약 글자가 2개이거나 1개일 경우는 어떻게 base64로 인코딩이 될까? 여기에서 바로 위에서 언급한 =, padding 기호가 나온다 ! 

 

Ma 의 경우 8bits x 2 = 16 bits 가 나온다. 이제 6 bits로 잘라 base64 인코딩을 해야하는데 16 % 6 = 몫2, 나머지 4 가 나온다. 온전한 6bits로 채워진 몫 2개는 그대로 인코딩을 해주고 나머지 4bits는 온전한 6bits로 만들기 위해 그냥 "0"을 붙여준다. 그럼 그렇게 만들어진 6bits로 총 3개의 글자가 나오고 완성되어야할 24 Bits 중 18bits 중 6bits (한 글자 or 한 자리) 가 남게 된다. 이 때 요 6bits에 "=" 문자로 padding, 채워 넣는 것이다. 

같은 방식으로 문자열 M의 경우는 아래와 같다. 

 

 

이렇게 변환 과정까지 쭉 보고나니 base64 에 대해 조금 이해가 된 것 같다. 일반적인 8Bits를 사용하는 문자를 6bits 로 잘라 변환시키는 base64, 그리고 빈 자리는 "="으로 채운다. 또 base64로 인코딩된 4개의 글자를 decode 하게되면 3개의 문자로 바뀌는 것, padding 기호 덕분에 encode64 인코딩된 문자열의 길이는 항상 4로 나누어 딱 떨어진다는 것, 그리고 위와 같은 변환 과정때문에 base64로 인코딩한 파일의 사이즈가 원본보다 더 커진다는 것 (약 33%) 을 알게되었다. 

 

 

 

사이즈가 더 커지는데 왜 굳이 base64를 사용할까? 

 

Ascii는 7bits encoding인데 나머지 1bit를 처리하는 방식이 시스템별로 상이하고 일부 제어문자 (ex. line ending 등) 의 경우도 시스템 별로 다른 코드 값을 갖는다. 이러한 문제로 ascii를 직접 시스템간 전달하기에 문제가 생길 수도 있어 base64의 안전한 64개의 출력문자로 인코딩하여 사용하게 되었다. 이렇게 되면 문자 코드에도 영향받지않고 시스템 간에 전달도 문제없이 가능하기 때문이다. 

 

또한 base64는 www(World Wide Web)에서 널리 쓰이고 있는데 HTML과 CSS 파일과 같은 텍스트 자산 안에 이미지 파일 또는 다른 binary 자산을 넣는 기능을 가지고 있다. SMTP 자체가 7-bit ASCII 문자만 사용하도록 디자인되어 이메일을 통한 binary data 전송에도 널리 쓰인다. 

 

 

 

 

아직 100%까진 아니지만 base64에 대해 조금 안 것 같다! 앞으로 "=" 로 끝나는 문자열을 보면 아 이건 base64 인코딩된 거 구나 ! 감을 잡을 수 있을 것 같다. 

 

 

 

 

 

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

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

https://arabiannight.tistory.com/entry/IT%EC%9A%A9%EC%96%B4-Base64-%EB%9E%80

 

반응형

댓글