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 ~ 25A ~ Z26 ~ 51a ~ z52 ~ 610 ~ 9
62+63/(Padding)= (65๋ฒˆ์งธ ๋ฌธ์ž, ๋ฐ์ดํ„ฐ ์•„๋‹˜)

๋ณ€ํ™˜ ๋ฐฉ์‹ (How it works)

Base64 ์ธ์ฝ”๋”ฉ ๊ณผ์ •์€ 24๋น„ํŠธ(3๋ฐ”์ดํŠธ) ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  1. ์ž…๋ ฅ (Input): ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ 3๋ฐ”์ดํŠธ(8๋น„ํŠธ ร— 3 = 24๋น„ํŠธ)์”ฉ ๋ฌถ๋Š”๋‹ค.
  2. ๋ถ„ํ•  (Split): ๋ฌถ์€ 24๋น„ํŠธ๋ฅผ 6๋น„ํŠธ์”ฉ 4๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. (์ด๋ฏ€๋กœ 6๋น„ํŠธ๋กœ 64๊ฐœ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ ๊ฐ€๋Šฅ)
  3. ๋งคํ•‘ (Mapping): ๊ฐ 6๋น„ํŠธ ๊ฐ’์„ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค, Base64 ์ƒ‰์ธํ‘œ์—์„œ ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•œ๋‹ค.
  4. ํŒจ๋”ฉ (Padding): ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ 3๋ฐ”์ดํŠธ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, ๋ถ€์กฑํ•œ ์ž๋ฆฌ๋ฅผ = ๋กœ ์ฑ„์›Œ 4๊ธ€์ž ๋‹จ์œ„๋ฅผ ๋งž์ถ˜๋‹ค.

์˜ˆ์‹œ: ๋ฌธ์ž์—ด โ€œManโ€ ์ธ์ฝ”๋”ฉ

ASCII ๋ฌธ์ž์—ด "Man"์„ Base64๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

  1. ASCII ๊ฐ’ ๋ณ€ํ™˜:

    • M: 77 (01001101)
    • a: 97 (01100001)
    • n: 110 (01101110)
  2. ๋น„ํŠธ ๋‚˜์—ด (24๋น„ํŠธ): 01001101 + 01100001 + 01101110
    โ†’ 010011010110000101101110

  3. 6๋น„ํŠธ์”ฉ ์ž๋ฅด๊ธฐ:

    • 010011 (19)
    • 010110 (22)
    • 000101 (5)
    • 101110 (46)
  4. ๋ฌธ์ž ๋ณ€ํ™˜:

    • 19: T
    • 22: W
    • 5: F
    • 46: u

โ†’ ๊ฒฐ๊ณผ: TWFu

ํŒจ๋”ฉ(Padding) ๊ทœ์น™

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ 3๋ฐ”์ดํŠธ์”ฉ ๋”ฑ ๋–จ์–ด์ง€์ง€ ์•Š์„ ๋•Œ = ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  1. 1๋ฐ”์ดํŠธ ๋‚จ์„ ๋•Œ (์˜ˆ: โ€œAโ€)
    • ์›๋ณธ: A (ASCII 65, 01000001) - ์ด 8๋น„ํŠธ
    • 6๋น„ํŠธ ๊ทธ๋ฃนํ™”:
      • ์ฒซ ๋ฒˆ์งธ ๊ทธ๋ฃน: 010000 (16) โ†’ Q
      • ๋‘ ๋ฒˆ์งธ ๊ทธ๋ฃน: 01 + 0000 (๋ถ€์กฑํ•œ 4๋น„ํŠธ๋ฅผ 0์œผ๋กœ ์ฑ„์›€) โ†’ 010000 (16) โ†’ Q
    • ํŒจ๋”ฉ: 4๊ธ€์ž ํ•œ ๋ฌถ์Œ์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋ถ€์กฑํ•œ ๋‘ ์ž๋ฆฌ๋ฅผ = ๋กœ ์ฑ„์šด๋‹ค.
    • ๊ฒฐ๊ณผ: QQ==
  2. 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๊ฐœ)์œผ๋กœ ์ œํ•œํ•œ๋‹ค.

  1. ์ œ์–ด ๋ฌธ์ž(Control Characters) ๋ฐฐ์ œ ASCII ์ฝ”๋“œ์˜ 0~31๋ฒˆ๊ณผ 127๋ฒˆ์€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ์ œ์–ด ๋ฌธ์ž(Null, Line Feed, Bell ๋“ฑ)์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์— ํฌํ•จ๋  ๊ฒฝ์šฐ, ๋ผ์šฐํ„ฐ๋‚˜ ์ด๋ฉ”์ผ ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ์ „์†ก ์‹œ์Šคํ…œ์ด ์ด๋ฅผ ํ†ต์‹  ์ œ์–ด ๋ช…๋ น์œผ๋กœ ์˜ค์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ๋‹จํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜์„ ์ข…๋ฃŒํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค.

  2. ์‹œ์Šคํ…œ ๋…๋ฆฝ์ ์ธ ์•ˆ์ „์„ฑ ํŠน์ • ์‹œ์Šคํ…œ์ด๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์žฅ๋น„์—์„œ๋Š” ASCII์˜ ์ผ๋ถ€ ํŠน์ˆ˜๋ฌธ์ž(์˜ˆ: <, >, &)๋ฅผ ์˜ˆ์•ฝ์–ด๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋ณ€์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. Base64๋Š” ์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ธฐํ˜ธ 2๊ฐœ(+, /)๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ํ…์ŠคํŠธ ์ „์šฉ ์ฑ„๋„์—์„œ ์•ˆ์ „ํ•œ ์ „์†ก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ๋‹จ, +, /๋Š” URL์ด๋‚˜ ํŒŒ์ผ๋ช…์—์„œ ํŠน์ˆ˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ, ์ด ๊ฒฝ์šฐ base64url ๋ณ€ํ˜•(RFC 4648 ยง5)์„ ์‚ฌ์šฉํ•œ๋‹ค.

Q: โ€˜8๋น„ํŠธ ์ด์ง„ ๋ฐ์ดํ„ฐโ€™๋ž€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?

ํ˜„๋Œ€ ์ปดํ“จํŒ…์—์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ํ‘œ์ค€ ๋‹จ์œ„๋Š” ๋ฐ”์ดํŠธ(Byte) ์ด๋ฉฐ, 1๋ฐ”์ดํŠธ๋Š” 8๊ฐœ์˜ ๋น„ํŠธ(Bit) ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋น„ํŠธ๋Š” 0 ๋˜๋Š” 1์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ์ตœ์†Œ ๋‹จ์œ„์ด๋ฏ€๋กœ, 8๋น„ํŠธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ง€์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  1. ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์šฉ์  ํ‘œํ˜„ ํ…์ŠคํŠธ(UTF-8), ์ด๋ฏธ์ง€(PNG/JPG), ์‹คํ–‰ ํŒŒ์ผ(Binary) ๋“ฑ ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋””์ง€ํ„ธ ์ •๋ณด๋Š” ๊ฒฐ๊ตญ 8๋น„ํŠธ ๋ฐ”์ดํŠธ์˜ ์—ฐ์†๋œ ๋‚˜์—ด์ด๋‹ค. ์ด๋ฅผ โ€˜์ด์ง„ ๋ฐ์ดํ„ฐโ€™๋ผ๊ณ  ์นญํ•˜๋Š” ์ด์œ ๋Š” ํŠน์ • ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์ด๋‚˜ ํ˜•์‹์— ๊ตญํ•œ๋˜์ง€ ์•Š์€, ๋กœ์šฐ(Raw) ๋ ˆ๋ฒจ์˜ ๋น„ํŠธ ์ŠคํŠธ๋ฆผ ๊ทธ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  2. 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