Buffer 이해하기 02 - Buffer와 Base64
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 로 인코딩 하였습니다.
조금더 이해를 돕기위해 구체적으로 어떻게 변환되는지 살펴보면 좋을 것 같습니다.
순서대로 살펴보겠습니다.
- hi => Buffer 객체를 통해 binary 변환
68 69 => 01101000 01101001
- Binary를 base64 형식으로 인코딩
6비트씩 인코딩
011010 000110 100100 ——
26 6 36 null (코드표 참조)
a G k =
보시는 바와 같이 base64 는 24비트(6과 8의 최대공배수) 씩 끊어서 결과를 표시합니다. 하지만 위의 예에서 마지막 6비트는 존재하지 않기 때문에 null 값이란 뜻으로 =
로 표시해줍니다.