반응형

이번 포스팅은 바이너리 데이터 통신 시 많이 사용하는 Base64에 대하여 알아보도록 하겠습니다.

 

Base64의 개요


Base64란 Binary Data를 Text로 바꾸는 Encoding(binary-to-text encoding schemes)의 하나로써 Binary Data를 오직 공통 ASCII 영역의 문자로 Character Set에 영향을 받지 않는 이루어진 문자열로 바꾸는 Encoding입니다.

핵심은 "Base64 Encoding은 Binary Data를 Text로 변경하는 Encoding이다." 입니다.

Base64를 글자 그대로 직역하면 컴퓨터에게는 조금 특별한 64진법이라는 뜻입니다. 특별한 이유는 64가 2의 제곱수(64=2^6) 이며, 2의 제곱수에 기반한 진법 중 화면에 표시할 수 있는 ASCII 문자들로 나타낼 수 있는 가장 큰 진법이기 때문입니다. (ASCII에는 제어문자가 다수 포함되어 있기 때문에 화면에 표시되는 ASCII 문자는 128개가 되지 않습니다.)

 

Base64 변환 과정


 

Base64 색인표

문자

문자

문자

문자

0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

 

변환하는 방식을 간략하게 설명하면 Binary Data를 6 bit씩 자른 뒤 6 bit에 해당하는 문자를 위의 Base64 색인표에서 찾아 치환합니다. (실제로는 Padding을 더해주는 과정이 추가됩니다.)

1. 문자열을 ASCII로 치환

   (M -> 77)

2. 치환한 ASCII 값을 binary 데이터로 치환

  (77 -> 01001101) (01001101는 십진수로 77)

3. binary 데이터 값을 이은 후 6bit씩 자른 후 Base64 색인표에 나와 있는 데이터로 치환

  (01001101 -> 010011 01.....(다음 데이터와 이어짐)

  (010011 -> T (19)

 

아래 그림을 보시면 자세히 설명이 되어 있습니다.

 

 


Text content M a n
ASCII 77 97 110
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Index 19 22 5 46
Base64-Encoded T W F u

 

 

 

Base64 인코딩을 사용하는 이유

 


Base64 Encoding을 하게되면 전송해야 될 데이터의 양도 약 33% 정도 늘어납니다. 그 이유는 6bit당 2bit의 Overhead가 발생하기 때문입니다.  Base64 Encoding 전 대비 33%나 데이터의 크기가 증가하고, Encoding과 Decoding에 추가 CPU 연산까지 필요한데 우리는 왜 Base64 Encoding을 하는 걸까요?

문자를 전송하기 위해 설계된 Media(Email, HTML)를 이용하여 Binary Data(이미지나 오디오)를 전송 할 때, ASCII로 Encoding하여 전송하게 되면 여러가지 문제가 발생할 수 있습니다. 

ASCII는 7 bits Encoding인데 나머지 1bit를 처리하는 방식이 시스템 별로 상이

▶ 일부 제어문자 (e.g. Line ending)의 경우 시스템 별로 다른 코드값을 갖음

 

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

따라서 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용하는 Base64를 사용하는 것입니다.

(* 안전한 출력 문자는 문자 코드에 영향을 받지 않는 공통 ASCII를 의미합니다).

 

다시 말해 

 

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

 

라고 정리 할 수 있을 것 같습니다.

 

Base64 FLAG


 NO_PADDING ~ 출력 끝에서 패딩 '=' 문자를 생략하는 인코더 플래그 비트(있는 경우)

NO_WRAP ~ 모든 라인 터미네이터를 생략하는 인코더 플래그 비트(즉, 출력이 하나의 긴 라인에 있을 것입니다). 인코딩시 인코딩 된 문자열이 76자가 넘으려고 하면 "\n" 개행문자를 삽입합니다. 장문의 데이터 시에는 문제가 될 것이 없지만, 개행문자를 기반으로 한 인자 값 전달 등의 경우에 문제가 될 여지가 있습니다. 따라서 Android에서 Base64 인코딩 시에 개행문자를 삽입하지 않는 옵션은 NO_WRAP입니다.

▶ URL_SAFE ~ Base64의 "URL 및 파일 이름 안전" 변형을 사용하여 나타내는 인코더/디코더 플래그 비트입니다(RFC 3548 섹션 4 참조). 여기서 - 및 _는 + 및 / 대신 사용됩니다.

   ( '-' -------> '+',     '_' -------> '/' )

▶ DEFAULT ~ 인코더/디코더 플래그의 기본값. (PADDING  & WRAP 적용)

 

 

Reference

 

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

2. https://beankhan.tistory.com/28

반응형

+ Recent posts