[REST API] 9. Base64

문정준's avatar
May 09, 2025
[REST API] 9. Base64
 
Base64 실습
Base64 실습

1. Base64

  • Base64는 사진 등의 파일을 문자로 변환하기 위해 사용하는 인코딩 기법
    • 문자로 변환 → JSON에 담아서 보낼 수 있음
    • JSON에 문자로 변환해서 담는 이유 : JSON은 바이트 자체를 담을 수 없고, 해석할 수 없음
 

2. Base64 인코딩 방법

  • 사진을 예로 들었을 때에, 단순히 사진의 픽셀(pixel)의 좌표에 1, 0을 넣는다고 가정한다면 흑백 사진을 구현 가능
    • 색이 있는 구간을 1 (검정색), 색이 없는 구간을 0 (흰색)으로 표현
  • 100 x 100 크기의 흑백 사진을 표현하기 위해서 총 10000 바이트가 필요함 (약 10KB)
    • 색이 칠해지지 않은 픽셀을 제외할 경우 용량은 더욱 낮아질 수 있음
 
  • 컬러 사진의 경우, 색을 표현하기 위한 RGB 코드가 추가됨
    • 이때는 검정색, 흰색도 전부 표기해야 하므로 픽셀의 제외가 불가능함
  • 한 픽셀의 x, y, R, G, B의 값을 전부 표현하기 위해 5 바이트가 필요
    • 100 x 100 크기의 사진을 전부 표현하기 위해선 50000 바이트가 필요 (약 50KB)
notion image
notion image

3. Base64 → ASCII (통신 방법)

  • 컬러 사진을 JSON에 담아서 보내야 할 때의 문제가 발생
    • ASCII는 7비트로 글자를 표현하고, 마지막 1비트는 오류 검출용 패리티 비트
    • 8비트이더라도 0 ~ 127까지의 수밖에 표현할 수 없음
  • RGB 값은 하나 당 0 ~ 255 까지 표현 가능하므로, ASCII 코드로 전부 전환할 수 없음
    • 이때, Base64를 활용하여 통신을 진행
notion image
  • 위 그림처럼,
01101110 10001000 11011000 11110000 10010000
의 5비트 데이터가 들어왔을 때에 Base64를 활용하여 글자로 변환해야 함
 

1. Base64 Encoding

  • 우선, 5비트 데이터를 전부 일렬로 나열시킨 후, 6글자(6비트)씩 끊어 인코딩을 준비
    • 마지막의 ‘=’ 기호는 데이터를 채우기 위한 padding
011011/101000/100011/011000/111100/001001/0000==
 
  • 6자씩 끊은 2진수를 10진수로 변환하여, 해당하는 문자로 치환
문자
문자
문자
문자
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
/
27 40 35 24 60 9 0 b o j Y 8 J A
 

2. 해당하는 문자열을 ASCII 문자에서 찾아 치환

  • ‘bojY8JA’ 라는 문자열이 Base64를 통해 생성되었으니, 이를 전송하기 위해 ASCII 코드로 치환해야 함
notion image
98 111 106 89 56 74 65
  • 변환한 ASCII 코드를 2진수로 다시 치환 후 전송
01100010 01101111 01101010 01011001 00111000 01001010 01000001
 

3. Base64 Decoding

  • 전송 받은 숫자를 ASCII 코드에서 찾아 문자열을 찾은 후, 동일한 문자열을 Base64에서 찾음
  • 찾은 문자열의 코드를 디코딩하여 일렬로 이어붙임
  • 붙인 문자열을 다시 8자씩 끊어서 파싱 후 해석
 
Share article

sxias