Buffer 이해하기 02 - Buffer와 Base64

Buffer 이해하기 02 - Buffer와 Base64

2018, Dec 03    

Buffer의 시리즈로 함께 쓰게 되었지만, 사실 대부분 Base64 에 관한 설명이 될 것 같습니다.


Base64 란?

Base64 는 바이너리 데이터를 6비트 단위로 끊어 인코드, 디코드 하는 인코딩 기법입니다.
이름에서도 알 수 있듯이 64 란 말 자체가 6비트 를 뜻합니다.

64 = 2의 6승 = 6비트

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 /


위에서 볼 수 있듯이 Base64 는 총 64개의 문자코드를 가집니다. 모드 Ascii 코드 안에 포함된 문자들 이기 때문에 문자열로 데이터가 전송되는 인터넷 환경에서 깨짐없이 안전하게? 데이터를 전송할 수 있게 됩니다.


Base64의 인코딩과 디코딩

버퍼를 함께 사용하여 인코딩과 디코딩을 알아보겠습니다.

전시간에도 예를 들었던 ‘hi’ 문자열을 가지고 알아보겠습니다.

Base64는 바이너리 => Base64 인코딩 으로 사용되기 때문에 먼저 Binary Data가 필요합니다.

// 문자열을 바이너리로 변환
var hiBinary = Buffer.from('hi', 'utf-8')
console.log(hiBinary) // <Buffer 68 69>

// 변환한 바이너리를 Base64 로 인코딩
var hiBase64 = hiBinary.toString('base64')
console.log(hiBase64) // 'aGk='

hi 문자열을 바이너리로 변환 후, 버퍼 객체의 toString() 함수를 사용하여 base64 로 인코딩 하였습니다.
조금더 이해를 돕기위해 구체적으로 어떻게 변환되는지 살펴보면 좋을 것 같습니다.

순서대로 살펴보겠습니다.

  1. hi => Buffer 객체를 통해 binary 변환

    68 69 => 01101000 01101001

  2. Binary를 base64 형식으로 인코딩

    6비트씩 인코딩
    011010 000110 100100 ——
    26 6 36 null (코드표 참조)
    a G k =

보시는 바와 같이 base64 는 24비트(6과 8의 최대공배수) 씩 끊어서 결과를 표시합니다. 하지만 위의 예에서 마지막 6비트는 존재하지 않기 때문에 null 값이란 뜻으로 = 로 표시해줍니다.