TL;DR
- Base64 ๋ 8๋นํธ ์ด์ง ๋ฐ์ดํฐ๋ฅผ 64๊ฐ์ ์์ ํ ASCII ๋ฌธ์๋ก ๋ณํํ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์.
- 24๋นํธ(3๋ฐ์ดํธ) ๋จ์๋ก 6๋นํธ์ฉ ์๋ผ 4๊ฐ์ Base64 ๋ฌธ์๋ก ๋งคํ. ์ธ์ฝ๋ฉ ๊ฒฐ๊ณผ๋ ์๋ณธ ๋๋น ์ฝ ํฌ๊ธฐ ์ฆ๊ฐ.
- ํ ์คํธ ์ ์ฉ ์ฑ๋์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ฝ๊ฒ ํด์ค๋ค. ๋จ, URLยทํ์ผ๋ช ์๋
+,/๊ฐ ๋ฌธ์ ๋ ์ ์์ด base64url ๋ณํ์ด ๋ณ๋๋ก ์กด์ฌ (RFC 4648).
Base64๋?
Base64(๋ฒ ์ด์ค64) ๋ 8๋นํธ ์ด์ง ๋ฐ์ดํฐ(Binary Data)๋ฅผ ๋ฌธ์ ์ฝ๋์ ์ํฅ์ ๋ฐ์ง ์๋ ๊ณตํต ASCII ์์ญ์ ๋ฌธ์๋ค๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด๋ค.
์ปดํจํฐ ์์คํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋, ์ผ๋ถ ์์คํ ์ 8๋นํธ ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฑฐ๋ ์ ์ด ๋ฌธ์๋ก ์คํดํ์ฌ ๋ฐ์ดํฐ๊ฐ ์์๋ ์ ์๋ค. Base64๋ ๋ฐ์ดํฐ๋ฅผ 64๊ฐ์ ์์ ํ(Printable) ๋ฌธ์๋ก๋ง ๋ณํํ์ฌ ์ด๋ฌํ ํต์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๋ค.
Base64 ์์ธํ (Character Set)
Base64๋ 64๊ฐ์ ASCII ๋ฌธ์๋ฅผ ์ํ๋ฒณ์ผ๋ก ์ฌ์ฉํ๋ binary-to-text ์ธ์ฝ๋ฉ์ด๋ค. A-Z, a-z, 0-9, +, / ์ด 64๊ฐ์ ๋ฐ์ดํฐ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
| ๊ฐ (Value) | ๋ฌธ์ (Char) | ๊ฐ (Value) | ๋ฌธ์ (Char) | ๊ฐ (Value) | ๋ฌธ์ (Char) |
|---|---|---|---|---|---|
| 0 ~ 25 | A ~ Z | 26 ~ 51 | a ~ z | 52 ~ 61 | 0 ~ 9 |
| 62 | + | 63 | / | (Padding) | = (65๋ฒ์งธ ๋ฌธ์, ๋ฐ์ดํฐ ์๋) |
๋ณํ ๋ฐฉ์ (How it works)
Base64 ์ธ์ฝ๋ฉ ๊ณผ์ ์ 24๋นํธ(3๋ฐ์ดํธ) ๋จ์๋ก ์ด๋ฃจ์ด์ง๋ค.
- ์ ๋ ฅ (Input): ์๋ณธ ๋ฐ์ดํฐ๋ฅผ 3๋ฐ์ดํธ(8๋นํธ ร 3 = 24๋นํธ)์ฉ ๋ฌถ๋๋ค.
- ๋ถํ (Split): ๋ฌถ์ 24๋นํธ๋ฅผ 6๋นํธ์ฉ 4๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ค. (์ด๋ฏ๋ก 6๋นํธ๋ก 64๊ฐ ๋ฌธ์๋ฅผ ํํ ๊ฐ๋ฅ)
- ๋งคํ (Mapping): ๊ฐ 6๋นํธ ๊ฐ์ 10์ง์๋ก ๋ณํํ ๋ค, Base64 ์์ธํ์์ ํด๋นํ๋ ๋ฌธ์๋ก ์นํํ๋ค.
- ํจ๋ฉ (Padding): ์๋ณธ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ 3๋ฐ์ดํธ์ ๋ฐฐ์๊ฐ ์๋๋ผ๋ฉด, ๋ถ์กฑํ ์๋ฆฌ๋ฅผ = ๋ก ์ฑ์ 4๊ธ์ ๋จ์๋ฅผ ๋ง์ถ๋ค.
์์: ๋ฌธ์์ด โManโ ์ธ์ฝ๋ฉ
ASCII ๋ฌธ์์ด "Man"์ Base64๋ก ๋ณํํ๋ค.
-
ASCII ๊ฐ ๋ณํ:
M: 77 (01001101)a: 97 (01100001)n: 110 (01101110)
-
๋นํธ ๋์ด (24๋นํธ):
01001101+01100001+01101110
โ010011010110000101101110 -
6๋นํธ์ฉ ์๋ฅด๊ธฐ:
010011(19)010110(22)000101(5)101110(46)
-
๋ฌธ์ ๋ณํ:
- 19:
T - 22:
W - 5:
F - 46:
u
- 19:
โ ๊ฒฐ๊ณผ: TWFu
ํจ๋ฉ(Padding) ๊ท์น
์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ 3๋ฐ์ดํธ์ฉ ๋ฑ ๋จ์ด์ง์ง ์์ ๋ = ๋ฅผ ์ฌ์ฉํ๋ค.
- 1๋ฐ์ดํธ ๋จ์ ๋ (์: โAโ)
- ์๋ณธ: A (ASCII 65, 01000001) - ์ด 8๋นํธ
- 6๋นํธ ๊ทธ๋ฃนํ:
- ์ฒซ ๋ฒ์งธ ๊ทธ๋ฃน: 010000 (16) โ Q
- ๋ ๋ฒ์งธ ๊ทธ๋ฃน: 01 + 0000 (๋ถ์กฑํ 4๋นํธ๋ฅผ 0์ผ๋ก ์ฑ์) โ 010000 (16) โ Q
- ํจ๋ฉ: 4๊ธ์ ํ ๋ฌถ์์ ์ฑ์ฐ๊ธฐ ์ํด ๋ถ์กฑํ ๋ ์๋ฆฌ๋ฅผ = ๋ก ์ฑ์ด๋ค.
- ๊ฒฐ๊ณผ:
QQ==
- 2๋ฐ์ดํธ ๋จ์ ๋ (์: โBCโ)
- ์๋ณธ: B (ASCII 66, 01000010), C (ASCII 67, 01000011) - ์ด 16๋นํธ
- 6๋นํธ ๊ทธ๋ฃนํ:
- ์ฒซ ๋ฒ์งธ ๊ทธ๋ฃน: 010000 (16) โ Q
- ๋ ๋ฒ์งธ ๊ทธ๋ฃน: 100100 (36) โ k
- ์ธ ๋ฒ์งธ ๊ทธ๋ฃน: 0011 + 00 (๋ถ์กฑํ 2๋นํธ๋ฅผ 0์ผ๋ก ์ฑ์) โ 001100 (12) โ M
- ํจ๋ฉ: 4๊ธ์ ํ ๋ฌถ์์ ์ฑ์ฐ๊ธฐ ์ํด ๋ถ์กฑํ ํ ์๋ฆฌ๋ฅผ = ๋ก ์ฑ์ด๋ค.
- ๊ฒฐ๊ณผ:
QkM=
Key Concepts to Clarify
Q: ASCII๋ 128๊ฐ()์ธ๋ฐ ์ Base128์ด ์๋ Base64()๋ฅผ ์ฌ์ฉํ๋๊ฐ?
ํ์ค ASCII๋ 7๋นํธ(128๊ฐ ๋ฌธ์)๋ฅผ ์ง์ํ์ง๋ง, Base64๋ ๋ฐ์ดํฐ ์ ์ก์ ์ ๋ขฐ์ฑ(Reliability) ๊ณผ ํธํ์ฑ(Interoperability) ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฌธ์ ์งํฉ์ (64๊ฐ)์ผ๋ก ์ ํํ๋ค.
-
์ ์ด ๋ฌธ์(Control Characters) ๋ฐฐ์ ASCII ์ฝ๋์ 0~31๋ฒ๊ณผ 127๋ฒ์ ํ๋ฉด์ ์ถ๋ ฅ๋์ง ์๋ ์ ์ด ๋ฌธ์(Null, Line Feed, Bell ๋ฑ)์ด๋ค. ์ด๋ฌํ ๋ฌธ์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ํฌํจ๋ ๊ฒฝ์ฐ, ๋ผ์ฐํฐ๋ ์ด๋ฉ์ผ ๊ฒ์ดํธ์จ์ด ๊ฐ์ ์ ์ก ์์คํ ์ด ์ด๋ฅผ ํต์ ์ ์ด ๋ช ๋ น์ผ๋ก ์ค์ธํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋จํ๊ฑฐ๋ ์ธ์ ์ ์ข ๋ฃํ ์ํ์ด ์๋ค.
-
์์คํ ๋ ๋ฆฝ์ ์ธ ์์ ์ฑ ํน์ ์์คํ ์ด๋ ๋ ๊ฑฐ์ ์ฅ๋น์์๋ ASCII์ ์ผ๋ถ ํน์๋ฌธ์(์:
<,>,&)๋ฅผ ์์ฝ์ด๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ณ์กฐํ ์ ์๋ค. Base64๋ ์๋ฌธ ๋์๋ฌธ์, ์ซ์, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ธฐํธ 2๊ฐ(+,/)๋ง์ ์ฌ์ฉํ์ฌ ๋๋ถ๋ถ์ ํ ์คํธ ์ ์ฉ ์ฑ๋์์ ์์ ํ ์ ์ก์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋จ,+,/๋ URL์ด๋ ํ์ผ๋ช ์์ ํน์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฏ๋ก, ์ด ๊ฒฝ์ฐ base64url ๋ณํ(RFC 4648 ยง5)์ ์ฌ์ฉํ๋ค.
Q: โ8๋นํธ ์ด์ง ๋ฐ์ดํฐโ๋ ์ ํํ ๋ฌด์์ ์๋ฏธํ๋๊ฐ?
ํ๋ ์ปดํจํ ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ค ๋จ์๋ ๋ฐ์ดํธ(Byte) ์ด๋ฉฐ, 1๋ฐ์ดํธ๋ 8๊ฐ์ ๋นํธ(Bit) ๋ก ๊ตฌ์ฑ๋๋ค. ๋นํธ๋ 0 ๋๋ 1์ ์ํ๋ฅผ ๊ฐ์ง๋ ์ต์ ๋จ์์ด๋ฏ๋ก, 8๋นํธ ๋ฐ์ดํฐ๋ ๊ฐ์ง์ ์ํ๋ฅผ ํํํ ์ ์๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
-
๋ฐ์ดํฐ์ ๋ฒ์ฉ์ ํํ ํ ์คํธ(UTF-8), ์ด๋ฏธ์ง(PNG/JPG), ์คํ ํ์ผ(Binary) ๋ฑ ๋ชจ๋ ํํ์ ๋์งํธ ์ ๋ณด๋ ๊ฒฐ๊ตญ 8๋นํธ ๋ฐ์ดํธ์ ์ฐ์๋ ๋์ด์ด๋ค. ์ด๋ฅผ โ์ด์ง ๋ฐ์ดํฐโ๋ผ๊ณ ์นญํ๋ ์ด์ ๋ ํน์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ด๋ ํ์์ ๊ตญํ๋์ง ์์, ๋ก์ฐ(Raw) ๋ ๋ฒจ์ ๋นํธ ์คํธ๋ฆผ ๊ทธ ์์ฒด๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
Base64 ์ฒ๋ฆฌ์ ๊ธฐ์ค Base64 ์ธ์ฝ๋ฉ์ ์๋ณธ ๋ฐ์ดํฐ์ ํ์์ ๋ฌป์ง ์๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ 8๋นํธ ๋จ์์ ๋นํธ ์คํธ๋ฆผ์ผ๋ก ๊ฐ์ฃผํ๊ณ , ์ด๋ฅผ ์ ์ก์ ์ ํฉํ 6๋นํธ ๋จ์๋ก ์ฌ๋ถํ (Regrouping) ํ์ฌ ๋ฌธ์๋ก ๋งคํํ๋ค. ์ฆ, โ8๋นํธ ์ด์ง ๋ฐ์ดํฐโ๋ผ๋ ํํ์ Base64๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋ฒ์ฉ์ฑ์ ์๋ฏธํ๋ค.
Connections
- ASCII (American Standard Code for Information Interchange) โ ASCII 95๊ฐ ์ถ๋ ฅ ๊ฐ๋ฅ ๋ฌธ์ ์ค 64๊ฐ๋ฅผ ์ ๋ณํ์ฌ Base64 ์์ธํ ๊ตฌ์ฑ
- UTF-8 โ UTF-8 ํ ์คํธ๋ ๋ฐ์ด๋๋ฆฌ๋ก ์ทจ๊ธํ์ฌ Base64 ์ธ์ฝ๋ฉ ๊ฐ๋ฅ
- NDJSON (Newline Delimited JSON) โ NDJSON์ ํ ์คํธ JSON์ ์ค ๋จ์๋ก ์ ์ก, Base64๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ํ ์คํธ๋ก ๋ณํ. JSON ๋ด ๋ฐ์ด๋๋ฆฌ ํ๋๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ NDJSON์ ์ค์ ์ ์๋ค.
Source Trail
- ์๋ณธ: ์ํค๋ฐฑ๊ณผ โ ๋ฒ ์ด์ค64
- ๊ธฐ๋ฐ ํ์ค: RFC 4648 (Base Encodings)
Discussion
Comments
๋๊ธ์ ์น์ธ ํ ๊ณต๊ฐ๋ฉ๋๋ค.