'인코딩(Encoding)'이란 데이터로 저장되어 있는 정보는 유지하면서 데이터의 형태를 바꾸는 과정을 의미한다. 데이터의 표현을 다른 형태로 변경하는 것을 인코딩이라고하며, 반대로 원상태로 되돌리는 것을 '디코딩(Decodning)'이라고 한다. 동영상을 특정 포맷으로 변환하는 것처럼 데이터의 표현 방식을 변환하는 것을 '인코딩'이라고 한다.
Base64 인코딩
Base64는 바이너리 데이터를 텍스트 형태로 변환해주는 인코딩 알고리즘이다.
Base64를 그대로 직역하면 64진법이라는 뜻이다. 바이너리 데이터를 64진법으로 변환한 다음 64개의 숫자에 64개의 문자(A-Z, a-z, 0-9 등)를 대응해서 텍스트로 만드는 인코딩 방식이다.
Base64 인코딩은 다음과 같이 진행된다.
- 3바이트 바이너리를 24비트 버퍼에 집어넣는다
- 24비트를 6비트씩 자른다.
- 6비트씩 자른 값을 Base64 인코딩 표에 있는 문자로 대치한다.
- 필요하다면 패딩 문자를 추가한다.
그림으로 살펴보자. 예제는 Base64 위키에 있는 예제로 하겠다. 위키 예제에서는 위키 슬로건 텍스트를 다뤘다. 텍스트의 첫 3바이트인 "Man"이라는 문자열을 Base64 인코딩한다.
우선 3바이트(24비트) 데이터를 버퍼에 집어 넣는다. 바이너리의 마지막 부분이라 인코딩해야하는 값이 3바이트가 안된다면 0을 채워 넣는다. "Man"이라는 문자열은 ASCII 코드로 표현이 가능하며, 각각 77, 97, 110 이라는 숫자와 대응된다. 이를 비트형태로 표현한다.
1바이트는 8비트로 구성된다. 따라서 3바이트는 24비트로 표현가능하다. 이를 앞에서부터 6비트씩 잘라서 4개의 덩어리로 만든다. 77, 97, 110 이라는 ASCII 값들은 6비트씩 잘라서 19, 22, 5, 46이 된다.
이 값에 해당하는 문자를 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 | / |
문자열 표의 62번, 63번 문자는 약간씩 다를 수도 있다. (위키에 나와있는 치환표다)
"Man"을 6비트씩 쪼개서 얻은 19, 22, 5, 46라는 숫자를 인코딩 표에서 찾아 치환하면 "TWFu"가 된다.
텍스트의 마지막 부분이 3바이트로 딱 떨어지지 않는 경우를 생각해보자. 'M' 문자 하나만 남은 경우 위와 같이 인코딩 된다. 우선 77이라는 숫자 하나를 버퍼에 올린다.
마찬가지로 6비트씩 쪼갠다. 이 때, 두 번째 6비트 덩어리에서는 비트가 모자라기 때문에 0을 뒤에 채워넣는다. 2개의 숫자를 얻게 되고, 인코딩 표에서 문자로 치환한다.
마지막으로 패딩문자인 '=' 문자를 남은 공간에 채워넣어 4배수를 맞춰준다. (따라서 Base64 인코딩 결과에는 '=' 문자가 없거나 1개 혹은 2개가 포함된다)
Base64 인코딩을 사용하는 이유
위키에서 소개된 예제를 보면 알겠지만 3바이트짜리 문자열을 Base64 인코딩 할 경우 4바이트가 된다. Base64 인코딩을 하면 데이터의 양이 33% 정도 늘어난다. 데이터의 양도 늘어나고 변환과정에서 리소스도 잡아먹는데 Base64 인코등인 왜 하는걸까?
여기서 소개한 예제에서는 텍스트 데이터를 Base64 인코딩 했지만 대부분은 바이너리 데이터를 대상으로 한다. 바이너리 데이터를 문자 전송을 위해 설계된 HTML이나 이메일을 통해 전송하고 싶을 때 사용한다.
댓글