본문 바로가기
프로그래밍 기초

Base64란?

by ez.pang 2023. 1. 31.

인코딩이란?

- 어떠한 정보/데이터의 형태나 형식을 다른 형태나 형식으로 변환하는 것

 

Base64는 인코딩 방식 중 하나이다.

 

Base64

- 8비트 2진 데이터(실행파일, ZIP 파일 등의 텍스트가 아닌 파일 )를 ASCII 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념

더보기

ASCII(아스키, American Standard Code for Information Interchange)란?

- 미국 국립 표준 협회(ANSI, American National Standards Institute)에서 표준화한 정보교환용 7비트 부호체계

- 7비트로 문자표현, 1비트의 패리티 비트 추가

(패리티 비트 : 정보의 전달 과정에서 오류가 생겼는지 검사하기 위한 비트)

ASCII 표

- 0~255까지 표현가능한 방식 (8비트 2진수, 00000000 ~ 11111111)

- 0~32 : 컴퓨터 단말기 TTY에 사용되는 제어문자 33가지

- 33~127 : 영문 소문자, 대문자, 특수문자

- 128~255 : 사용x, 0~127번 글자들의 비트 맨 앞자리는 항상 0(그래서 7비트문자)

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

 

Base64 코드표

- A-Z, a-z, 0-9, +, =, / 로 구성

=는 padding 문자 (부족한 bit 수를 =로 채움)

 

위의 문자 64개로 모든 문자열을 표현하고자 하면 (0~63 : 총 64개 = 2^6) 6비트가 필요하다.

하지만 일반적인 컴퓨터 데이터나 보편적으로 쓰이는 ASCII 문자는 모두 8비트 ( = 1 바이트) 로 구성되어 있다.

Base64인코딩을 위해 문자열 2진 데이터를 6비트씩 묶어야 하는데 여기서 6과 8의 최소공배수 = 24 비트( = 3 바이트)씩 끊어서 묶도록 한다. 

문자열 -> ASCII -> 6비트 자르기 -> Base64 변환

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

= 패딩문자를 통해 총 24비트를 맞춘다.

Base64로 인코딩된 4개의 글자를 디코딩하게되면 3개의 문자로 바뀌고, padding 기호 덕분에 Base64 인코딩된 문자열의 길이는 항상 4로 나누어 딱 떨어진다.

위와 같은 변환 과정때문에 Base64로 인코딩한 파일의 사이즈가 원본보다 더 커지게 된다. 

 

사이즈가 커짐에도 Base64를 사용하는 이유?

아스키 코드가 맨처음 소개되었을 땐 영어 텍스트만 있었다. 그리고 시간이 지나면서 아스키 코드가 확장되었고, 나중에 어 및 국가에 따라서 아스키 코드중에서 확장된 부분은 다르게 되었다. 즉 시스템간 데이터를 전달하기에 오류가 발생할 수도 있는 부분이기에 문자 코드에 영향을 받지않는 공통 ASCII인 64개의 안전한 출력 문자만 사용해서 인코딩해 전달하는 것이다.

댓글