Base64란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는
공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 말한다.
- 출처 : 위키백과
base64는 말 그대로 64진법이다.
값 |
문자 |
값 |
문자 |
값 |
문자 |
값 |
문자 |
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 |
/ |
어떤 문장을 인코딩하는데에 위 64개의 ASCII 문자가 쓰인다.
인코딩 방식은 이렇다.
"abc" 이 세 문자를 인코딩한다고 하면,
a는 아스키코드로 '97', 이진법으로 '1100001'
b는 아스키코드로 '98', 이진법으로 '1100010'
c는 아스키코드로 '99', 이진법으로 '1100011'
세 문자를 8비트 이진수로 모두 나타내면
01100001 / 01100010 / 01100011
총 24비트가 된다.
이제 이것을 6비트씩 나누어주면 된다.
011000 / 010110 / 001001 / 100011
각 6비트는 0(000000)에서 63(111111) 사이의 값이 될 것이고,
나온 값을 위에 있는 64개의 ASCII 문자 중 값이 일치하는 문자로 바꾸어 주면 된다.
그래서 "abc"의 인코딩 결과는 "YWJj"가 된다.
Text |
a |
b |
c |
|||||||||||||||||||||
ASCII |
97 |
98 |
99 |
|||||||||||||||||||||
Bit |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
Index |
24 |
22 |
9 |
35 |
||||||||||||||||||||
Encoded |
Y |
W |
J |
j |
base64의 핵심은 8비트로 된 것을 6비트로 나눈다는 것이다!
"abc"의 경우는 24비트로, 8비트와 6비트로 모두 나누어 떨어졌지만
"abcd"의 경우는 어떨까??
"abcd"를 한 문자당 8비트 이진수로 나타내면
01100001 / 01100010 / 01100011 / 01100100
총 32비트가 된다.
이것을 6비트로 나누게 되면
011000 / 010110 / 001001 / 100011 / 011001 / 00 ???
마지막에 '00'이 남게된다.
base64는 6비트를 맞추기 위해 부족한 부분을 0으로 채워 넣는다.
011000 / 010110 / 001001 / 100011 / 011001 / 000000
그렇다면 "abcd"를 base64로 인코딩하면 "YWJjZA"가 되는 걸까?
아니다!!
base64는 24비트 그룹 수를 갖는다.
따라서 문자를 이진수로 나타낸 총 비트 수가 24의 배수가 되어야한다.
011000 / 010110 / 001001 / 100011 / 011001 / 000000 / XXXXXX / XXXXXX
위 처럼 총 48비트로 맞춰져야 한다.
그럼 X에는 무엇이 들어가냐~?
X에는 '0'이 들어가게 된다.
하지만 앞에서 남은 '00'처럼 이를 A로 바꾸지 않는다.
대신 '=' 문자를 사용한다!
결국 "abcd"를 인코딩하게 되면 "YWJjZA=="이 되는 것이다.
Text |
a |
b |
c |
d |
||||||||||||||||||||||||||||||||||||||||||||
ASCII |
97 |
98 |
99 |
100 |
||||||||||||||||||||||||||||||||||||||||||||
Bit |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Index |
24 |
22 |
9 |
35 |
25 |
0 |
||||||||||||||||||||||||||||||||||||||||||
Encoded |
Y |
W |
J |
j |
Z |
A |
= |
= |
'='으로 채워지는 것을 base64 패딩이라고 한다.
우리는 '='을 보고 base64로 인코딩 됐구나! 라고 쉽게 추측할 수 있다.
하지만 이 패딩때문에 base64 디코딩하는 데에서 문제가 생긴다.
"YWJjZA=="와 "YWJjZB=="를 디코딩해보면 모두 "abcd"로 나온다!
왜일까?
디코딩을 하는 과정에서 '00' 뒤에 붙은 '0'과 패딩으로 붙은 '0'(빨간 글씨 부분)은 모두 버려지게 된다.
Text |
a |
b |
c |
d |
||||||||||||||||||||||||||||||||||||||||||||
ASCII |
97 |
98 |
99 |
100 |
||||||||||||||||||||||||||||||||||||||||||||
Bit |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Index |
24 |
22 |
9 |
35 |
25 |
1 |
||||||||||||||||||||||||||||||||||||||||||
Encoded |
Y |
W |
J |
j |
Z |
B |
= |
= |
base64 인코딩 및 디코딩 사이트