Base64 ๋์ฝ๋๋?
Base64๋ ์ถ๋ ฅ ๊ฐ๋ฅํ 64๊ฐ์ ASCII ๋ฌธ์(AโZ, aโz, 0โ9, +, /)๋ฅผ ์ฌ์ฉํด ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋๋ค. HTML์ ์ด๋ฏธ์ง๋ฅผ ์ง์ ์ฝ์ ํ๊ฑฐ๋, JSONยทURL๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฑฐ๋, ์ด๋ฉ์ผ ์ฒจ๋ถ ํ์ผ์ ์ธ์ฝ๋ฉํ ๋ ๋๋ฆฌ ์ฐ์ ๋๋ค. ์ด ๋์ฝ๋๋ ๊ทธ ๊ณผ์ ์ ๊ฑฐ๊พธ๋ก ๋๋๋ ค, Base64 ๋ฌธ์์ด์ ์๋์ ์ผ๋ฐ ํ ์คํธ๋ก ๋ณต์ํด ์ค๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
์ ๋ ฅ๋์ Base64 ๋ฌธ์์ด์ ๋ถ์ฌ๋ฃ๊ฑฐ๋ ์ ๋ ฅํ ๋ค ์คํํ์ธ์. ์ด ๋๊ตฌ๋ ๊ณต๋ฐฑ์ ๋ชจ๋ ์ ๊ฑฐํ ๋ค์ ๋ฌธ์๋ฅผ ๋์ฝ๋ฉํ๊ณ , ๋ณํ๋ ํ ์คํธ์ ํจ๊ป ๋์ฝ๋ฉ๋ ๋ฐ์ดํธ ์, ์ ๋ ฅ ๋ฌธ์ ์, ๊ทธ๋ฆฌ๊ณ ํจ๋ฉ ๋ฌธ์('=')๊ฐ ๋ช ๊ฐ ์์๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ ๋ ฅ๊ฐ์ Base64 ๋ฌธ์ ์งํฉ์ ์ํ์ง ์๋ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด "์ ํจํ์ง ์์" ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์๋ฆฌ ์ดํด๋ณด๊ธฐ
Base64 ๋ฌธ์ ํ๋๋ 6๋นํธ์ ๋ฐ์ดํฐ๋ฅผ ํํํฉ๋๋ค. ๋ฐ๋ผ์ Base64 ๋ฌธ์ 4๊ฐ๋ \(4 \times 6 = 24\)๋นํธ๋ฅผ ๋ด๊ฒ ๋๊ณ , ์ด๋ 8๋นํธ์ง๋ฆฌ ๋ฐ์ดํธ 3๊ฐ๋ก ๊น๋ํ๊ฒ ๋๋ฉ๋๋ค. ์๋ณธ ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ 3์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ, ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ํญ์ 4์ ๋ฐฐ์๊ฐ ๋๋๋ก '=' ํจ๋ฉ ๋ฌธ์๋ฅผ 1๊ฐ ๋๋ 2๊ฐ ๋ง๋ถ์ ๋๋ค. ๋์ฝ๋ฉํ ๋๋ ์ด ํจ๋ฉ์ ์ ๊ฑฐํ๊ณ ๋จ๋ ๋นํธ๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
$$\text{Bytes} = \left\lfloor \frac{6 \times \text{Base64 chars (no padding)}}{8} \right\rfloor$$
์์ ๋ก ์ดํดํ๊ธฐ
Base64 ๋ฌธ์์ด SGk=๋ฅผ ์ดํด๋ด ์๋ค. ๊ฐ ๋ฌธ์๋ \(S=18\), \(G=6\), \(k=36\)์ ๊ฐ์ ๋์ํ๊ณ , '='๋ ํจ๋ฉ์ ๋๋ค. ์ด์ง์๋ก ๋ํ๋ด๋ฉด \(010010\ 000110\ 100100 \to 24\)๋นํธ๊ฐ ๋์ง๋ง, ๋์ ํจ๋ฉ์ด ๋ถ์ด ์์ผ๋ฏ๋ก ์ ํจํ ๋ฐ์ดํธ๋ 2๊ฐ๋ฟ์ ๋๋ค: \(01001000\ (72 = \text{'H'})\)๊ณผ \(01101001\ (105 = \text{'i'})\). ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ Hi๊ฐ ๋ฉ๋๋ค.
Base64 ์ํ๋ฒณ ์ฐธ๊ณ
ํ์ค Base64 (RFC 4648)๋ ๋ชจ๋ 6๋นํธ ๊ฐ(0โ63)์ 64๊ฐ์ ์ถ๋ ฅ ๊ฐ๋ฅํ ASCII ๋ฌธ์ ์ค ํ๋์ ๋งคํํฉ๋๋ค. ๋์ฝ๋๋ ๊ฐ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ด ํ์์ 6๋นํธ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์ ๋ค์ ๋นํธ๋ฅผ ์ฐ๊ฒฐํ๊ณ 8๋นํธ ๋ฐ์ดํธ๋ก ๋ค์ ๊ทธ๋ฃนํํฉ๋๋ค. ์๋ ํ๋ ์ ์ฒด ์ํ๋ฒณ๊ณผ ๊ฐ ๋ฌธ์์ ํ ๋น๋ ์ธ๋ฑ์ค๋ฅผ ๋์ดํฉ๋๋ค.
| ์ธ๋ฑ์ค | ๋ฌธ์ | ์ธ๋ฑ์ค | ๋ฌธ์ | ์ธ๋ฑ์ค | ๋ฌธ์ | ์ธ๋ฑ์ค | ๋ฌธ์ |
|---|---|---|---|---|---|---|---|
| 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 | / |
65๋ฒ์งธ ๊ธฐํธ์ธ = (๋ฑํธ)๋ ๋ฐ์ดํฐ ๋ฌธ์๊ฐ ์๋๋๋ค. ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋์์ ์ ์ฒด ๊ธธ์ด๊ฐ ํญ์ 4์์ ๋ฐฐ์๊ฐ ๋๋๋ก ํ๋ ํจ๋ฉ ๋ง์ปค์ ๋๋ค. ํ๋์ =๋ ์ต์ข 4์ ๊ทธ๋ฃน์ด 2๋ฐ์ดํธ๋ฅผ ์ธ์ฝ๋ฉํจ์ ์๋ฏธํ๊ณ , ๋ ๊ฐ์ ==๋ 1๋ฐ์ดํธ๋ฅผ ์ธ์ฝ๋ฉํจ์ ์๋ฏธํฉ๋๋ค. ๋์ฝ๋๋ ํจ๋ฉ๊ณผ ์ด๊ฒ์ด ์์ํ๋ ์ด๊ณผ 0๋นํธ๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
์ถ๊ฐ ๋์ฝ๋ฉ ์์
๊ฐ Base64 ๋ฌธ์๋ 6๋นํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. 4๊ฐ์ ๋ฌธ์(24๋นํธ)๋ ์ ํํ 3๋ฐ์ดํธ๋ก ๋์ฝ๋ฉ๋๊ณ , ๋ถ๋ถ ๊ทธ๋ฃน์ ํจ๋ฉ์ ์ฌ์ฉํ๋ฏ๋ก ๋์ฝ๋๊ฐ ์ ์งํ ๋ฐ์ดํธ ์๋ฅผ ์ ์ ์์ต๋๋ค. ๋ฐ์ดํธ ๊ฐ์๋ \(\text{๋ฐ์ดํธ} = \left\lfloor \frac{6 \times n}{8} \right\rfloor\)๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ฌ๊ธฐ์ \(n\)์ ์ค์ (ํจ๋ฉ์ด ์๋) ๋ฌธ์์ ๊ฐ์์ ๋๋ค.
์์ 1 โ ํจ๋ฉ ์์: "TWFu" โ "Man"
- ์ธ๋ฑ์ค: T=19, W=22, F=5, u=46.
- 6๋นํธ ๊ทธ๋ฃน:
010011 010110 000101 101110. - ๋ฐ์ดํธ๋ก ๋ค์ ๊ทธ๋ฃนํ:
01001101 01100001 01101110= 77, 97, 110. - ASCII 77, 97, 110 = M, a, n. \(n=4\)์ผ ๋: \(\lfloor 24/8 \rfloor = 3\) ๋ฐ์ดํธ โ Man.
์์ 2 โ ํ ๊ฐ์ '=' ํจ๋: "SGVsbG8=" โ "Hello"
- ํจ๋ฉ ์ ๊ฑฐ: 7๊ฐ์ ์ค์ ๋ฌธ์ S,G,V,s,b,G,8.
- ์ธ๋ฑ์ค: S=18, G=6, V=21, s=44, b=27, G=6, 8=60.
- ๋นํธ:
010010 000110 010101 101100 011011 000110 111100(ํจ๋ ๊ทธ๋ฃน์ ๋ 2๋นํธ๋ 0 ํ๋ฌ์ด๋ฉฐ ๋ฒ๋ ค์ง๋๋ค). - ๋ฐ์ดํธ:
01001000 01100101 01101100 01101100 01101111= 72, 101, 108, 108, 111 = H, e, l, l, o. - \(n=7\)์ผ ๋: \(\lfloor 42/8 \rfloor = 5\) ๋ฐ์ดํธ โ Hello.
์์ 3 โ ๋ ๊ฐ์ '==' ํจ๋: "aGk="... ๊ทธ๋ฆฌ๊ณ "TQ==" โ "M"
- ํจ๋ฉ ์ ๊ฑฐ: 2๊ฐ์ ์ค์ ๋ฌธ์ T, Q.
- ์ธ๋ฑ์ค: T=19, Q=16.
- ๋นํธ:
010011 010000; ์ฒ์ 8๋นํธ๋ง ์ ์งํ๊ณ , ๋๋จธ์ง 4๋นํธ๋ 0 ํ๋ฌ์ ๋๋ค. - ๋ฐ์ดํธ:
01001101= 77 = M. - \(n=2\)์ผ ๋: \(\lfloor 12/8 \rfloor = 1\) ๋ฐ์ดํธ โ M.
๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์งํํ์ฌ ํ ์คํธ์์ ์ด๋ฌํ ๋ฌธ์์ด์ ์์ฑํ๋ ค๋ฉด Base64 ์ธ์ฝ๋๋ฅผ ์ฌ์ฉํ์ธ์.
์ฃผ์ ์ฉ์ด
- Base64 ์ํ๋ฒณ
- ์ด์ง ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ๋ก ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ 64๊ฐ์ ์ถ๋ ฅ ๊ฐ๋ฅํ ๋ฌธ์(AโZ, aโz, 0โ9, + ๋ฐ /)์ ๊ณ ์ ๋ ์งํฉ์ ๋๋ค. ๊ฐ ๋ฌธ์๋ 0์์ 63 ์ฌ์ด์ 6๋นํธ ๊ฐ์ ๋ํ๋ ๋๋ค.
- ํจ๋ฉ('=')
- ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋์ ์ถ๊ฐ๋๋ ๋ฑํธ๋ก, ๊ธธ์ด๊ฐ 4์์ ๋ฐฐ์๊ฐ ๋๋๋ก ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์์ผ๋ฉฐ, ํ๋์ '='๋ 2๋ฐ์ดํธ ์ต์ข ๊ทธ๋ฃน์ ํ์ํ๊ณ '=='๋ 1๋ฐ์ดํธ ์ต์ข ๊ทธ๋ฃน์ ํ์ํฉ๋๋ค.
- ์น์คํ (6๋นํธ)
- 6๋นํธ์ ๊ทธ๋ฃน โ ๋จ์ผ Base64 ๋ฌธ์๊ฐ ์ธ์ฝ๋ฉํ๋ ๋จ์์ ๋๋ค. 4๊ฐ์ ์น์คํ (24๋นํธ)์ 3๊ฐ์ ์ฅํ ๊ณผ ์ ํํ ์ผ์นํฉ๋๋ค.
- ์ฅํ / ๋ฐ์ดํธ(8๋นํธ)
- 8๋นํธ ๋จ์๋ก, ๋์ฝ๋ฉ๋ ๋ฐ์ดํฐ์ ํ ๋ฐ์ดํธ์ ํ์ค ํฌ๊ธฐ์ ๋๋ค. Base64 ๋์ฝ๋ฉ์ ์น์คํ ์ ์ฅํ ์ผ๋ก ๋ค์ ๊ทธ๋ฃนํํ๋ฉฐ, ์ด์ง์ ํ ์คํธ ๋ณํ๊ธฐ๋ ๋นํธ๋ณ๋ก ์ด๋ฅผ ์ค๋ช ํ ์ ์์ต๋๋ค.
- ๊ณต๋ฐฑ ์ ๊ฑฐ
- ๋์ฝ๋ฉ ์ ์ ๊ณต๋ฐฑ, ํญ ๋ฐ ์ค ๋ฐ๊ฟ์ ์ ๊ฑฐํฉ๋๋ค. ๋ง์ ์์คํ ์ด ๊ธด Base64(์: PEM ์ธ์ฆ์, ์ด๋ฉ์ผ MIME)์ ์ค ๋ฐ๊ฟ์ ์ฝ์ ํฉ๋๋ค. ๊ฐ๋ ฅํ ๋์ฝ๋๋ ์ด๋ฅผ ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌํ์ง ์๊ณ ์ด ๊ณต๋ฐฑ์ ๋ฌด์ํฉ๋๋ค.
- URL-์์ Base64
- +๋ฅผ -๋ก, /๋ฅผ _๋ก ๋ฐ๊ฟ ๋ฌธ์์ด์ด URL๊ณผ ํ์ผ๋ช ์์ ์์ ํ๋๋ก ํ๋ ๋ณํ(RFC 4648 ยง5)์ ๋๋ค. ํจ๋ฉ๋ ์ข ์ข ์๋ต๋ฉ๋๋ค. ํ์ค ๋์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ด๋ฌํ ๋ฌธ์๋ฅผ ๋ค์ +์ /๋ก ๋ณํํ์ธ์. ์ฃผ๋ณ URL ์์ฒด๋ URL ์ธ์ฝ๋ / ๋์ฝ๋ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ด๋๊ฐ๋ก ์ ์ก๋๋์? ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋์ฝ๋ฉ ์ฒ๋ฆฌ๋ ์๋ฒ ์ธก์์ ์ด๋ฃจ์ด์ง์ง๋ง, ์ ๋ ฅ๊ฐ์ ์ ์ฅ๋์ง ์์ต๋๋ค. ๋ค๋ง ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ถ์ฌ๋ฃ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ๋ฐ์ดํธ ์๊ฐ 4๋ก ๋๋์ด๋จ์ด์ง์ง ์๋์? ์ฌ๊ธฐ์ ๋งํ๋ ๋ฐ์ดํธ ์๋ ๋์ฝ๋ฉ๋ ์ถ๋ ฅ ๋ฐ์ดํธ ์์ด์ง ์ ๋ ฅ ๋ฌธ์ ์๊ฐ ์๋๋๋ค. ์ ๋ ฅ ๋ฌธ์ 4๊ฐ๋ง๋ค ์ต๋ 3๊ฐ์ ์ถ๋ ฅ ๋ฐ์ดํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
ํจ๋ฉ์ ๋ฌด์์ ์๋ฏธํ๋์? '='๊ฐ 1๊ฐ๋ฉด ๋ง์ง๋ง ๊ทธ๋ฃน์์ 2๋ฐ์ดํธ๊ฐ ๋ง๋ค์ด์ก๋ค๋ ๋ป์ด๊ณ , 2๊ฐ๋ฉด 1๋ฐ์ดํธ๊ฐ ๋ง๋ค์ด์ก๋ค๋ ๋ป์ ๋๋ค. ํจ๋ฉ์ด ์์ผ๋ฉด ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ ์ด๋ฏธ 3์ ๋ฐฐ์์๋ค๋ ์๋ฏธ์ ๋๋ค.