Base64 ์ธ์ฝ๋ฉ / ๋์ฝ๋ฉ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Q: Base64 ์ธ์ฝ๋ฉ์ด๋ ๋ฌด์์ด๋ฉฐ ์ด๋ค ์ฉ๋๋ก ์ฌ์ฉ๋๋์?
A: Base64๋ 64๊ฐ์ ๋ฌธ์(A-Z, a-z, 0-9, +, /)๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ASCII ๋ฌธ์์ด ํ์์ผ๋ก ๋ณํํ๋ ์ด์ง-ํ ์คํธ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋๋ค. ์ฃผ๋ก HTTP, SMTP์ ๊ฐ์ ํ ์คํธ ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ด๋ JSON ํ์ด๋ก๋๋ฅผ ํตํด ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ก๋ MIME์ ํตํ ์ด๋ฉ์ผ ์ฒจ๋ถ ํ์ผ, ๋ฐ์ดํฐ URL๋ก HTML ๋ฐ CSS์ ์ด๋ฏธ์ง ์๋ฒ ๋ฉ, JSON Web Token(JWT)์ ํ์ด๋ก๋ ์ธ์ฝ๋ฉ, ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์ ์ด์ง ๋ฐ์ดํฐ ์ ์ฅ ๋ฑ์ด ์์ต๋๋ค.
Q: Base64๋ ์ํธํ์ธ๊ฐ์? ์์ ํ๊ฐ์?
A: ์๋๋๋ค. Base64๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด์ง ์ํธํ๊ฐ ์๋๋๋ค. Base64๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ๋๊ตฌ๋ ์ง ํค, ๋น๋ฐ๋ฒํธ, ๋น๋ฐ ์ ๋ณด ์์ด๋ ์ฆ์ ์๋ ๋ฐ์ดํฐ๋ก ๋์ฝ๋ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ฐ์ฑ, ๋ฌด๊ฒฐ์ฑ, ์ธ์ฆ ๊ธฐ๋ฅ์ ์ ํ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ์์ผ๋ก ํํํ๋ ๋ฐฉ์์ผ ๋ฟ์ ๋๋ค. ์์ด๋ฅผ ๋ชจ์ค ๋ถํธ๋ก ๋ฒ์ญํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํด์ผ ํ๋ค๋ฉด ๋จผ์ ์ ์ ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ(์: AES)์ ์ฌ์ฉํ ํ, ์ ํ์ ์ผ๋ก ์ํธํ๋ ๋ฐ์ดํธ๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ ์ ์กํ ์ ์์ต๋๋ค.
Q: Base64๊ฐ ๋๋๋ก = ๋๋ == ๊ธฐํธ๋ก ๋๋๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
A: = ๋ฌธ์๋ ํจ๋ฉ์
๋๋ค. Base64๋ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ 3๋ฐ์ดํธ(24๋นํธ) ๊ทธ๋ฃน์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๊ทธ๋ฃน๋น 4๊ฐ์ Base64 ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค. ์
๋ ฅ ๊ธธ์ด๊ฐ 3๋ฐ์ดํธ์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ, ์ธ์ฝ๋ฉ ๊ฒฐ๊ณผ์ ํจ๋ฉ = ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ฌ ์ถ๋ ฅ์ด 4์์ ๋ฐฐ์๊ฐ ๋๋๋ก ํฉ๋๋ค. 2๋ฐ์ดํธ๊ฐ ๋จ์ผ๋ฉด = ํ๋๊ฐ ์ถ๊ฐ๋๊ณ , 1๋ฐ์ดํธ๋ง ๋จ์ผ๋ฉด = ๋ ๊ฐ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, "Man"(3๋ฐ์ดํธ)์ ํจ๋ฉ ์์ด "TWFu"๋ก ์ธ์ฝ๋ฉ๋์ง๋ง, "Ma"(2๋ฐ์ดํธ)๋ "TWE="๋ก, "M"(1๋ฐ์ดํธ)์ "TQ=="๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
Q: Base64๋ ๋ฐ์ดํฐ๋ฅผ ๋ ํฌ๊ฒ ๋ง๋ค๊น์? ์ผ๋ง๋ ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋์?
A: ๋ค, Base64 ์ธ์ฝ๋ฉ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ฝ 33% ์ฆ๊ฐ์ํต๋๋ค. 3๋ฐ์ดํธ์ ์ด์ง ์ ๋ ฅ๋ง๋ค 4๋ฐ์ดํธ์ ์ถ๋ ฅ์ด ์์ฑ๋๋ฉฐ, ์ฌ๊ธฐ์ ์ ํ์ ํจ๋ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ 3MB ์ด์ง ํ์ผ์ Base64๋ก ์ธ์ฝ๋ฉํ๋ฉด ์ฝ 4MB๊ฐ ๋ฉ๋๋ค. ์ด๋ ํ ์คํธ ์ ์ฉ ์ฑ๋์ ํตํด ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ฐ์ ๋๋ค. ๋ค๋ฅธ ์ด์ง-ํ ์คํธ ์ธ์ฝ๋ฉ ๋ฐฉ์๊ณผ ๋น๊ตํ๋ฉด Base64๋ ์๋์ ์ผ๋ก ํจ์จ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด 16์ง์ ์ธ์ฝ๋ฉ์ 100%์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Q: ํ์ค Base64์ Base64url์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
A: ํ์ค Base64๋ ์ํ๋ฒณ์ +์ /๋ฅผ ์ฌ์ฉํ๊ณ =๋ฅผ ํจ๋ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. Base64url(URL ์์ Base64)์ +๋ฅผ -๋ก, /๋ฅผ _๋ก ๋์ฒดํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํจ๋ฉ์ ์๋ตํฉ๋๋ค. ์ด๋ก ์ธํด Base64url์ ์ถ๊ฐ์ ์ธ ํผ์ผํธ ์ธ์ฝ๋ฉ ์์ด URL, ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์, ํ์ผ ์ด๋ฆ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. Base64url์ RFC 4648์ ์ ์๋์ด ์์ผ๋ฉฐ JSON Web Token(JWT), OAuth ํ ํฐ, ์น API์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ค Base64 ๋ฌธ์์ด Pj4+Pz8/Pw==๋ Base64url์์ Pj4-Pz8_Pw๊ฐ ๋ฉ๋๋ค.
Q: Base64 ๋ฐ์ดํฐ URL์ด๋ ๋ฌด์์ด๋ฉฐ HTML๊ณผ CSS์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์?
A: ๋ฐ์ดํฐ URL์ ์น ๋ฌธ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์๋ฒ ๋ฉํ๋ URI ์คํด์
๋๋ค. ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ํ์์ data:image/png;base64,iVBORw0KGgo...์
๋๋ค. HTML <img> ํ๊ทธ์ CSS background-image ์์ฑ์์ ํ์ผ URL ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ URL์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ธฐ ์ํ ๋ณ๋์ HTTP ์์ฒญ์ด ํ์ํ์ง ์์ผ๋ฏ๋ก ์์ ์ ์
(์ผ๋ฐ์ ์ผ๋ก 10KB ๋ฏธ๋ง)์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ HTML/CSS ํ์ผ ํฌ๊ธฐ๊ฐ ์ฝ 33% ์ฆ๊ฐํ๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์บ์ํ ์ ์๊ฒ ๋ฉ๋๋ค.
Q: ๋ชจ๋ ํ์ผ์ Base64๋ก ๋ณํํ ์ ์๋์?
A: ๋ค โ ํ ์คํธ, ์ด๋ฏธ์ง, ์ค๋์ค, ๋น๋์ค, PDF, ์์ถ ์์นด์ด๋ธ ๋ฑ ๋ชจ๋ ์ด์ง ๋ฐ์ดํฐ๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ ์ ์์ต๋๋ค. ํ๋ก์ธ์ค๋ ๋์ผํฉ๋๋ค. ํ์ผ์ ์์ ๋ฐ์ดํธ๋ฅผ ์ฝ๊ณ Base64 ์ธ์ฝ๋ฉ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค. Base64 ๋ฌธ์์ด์ ๋์ฝ๋ฉํ๋ฉด ์ ํํ ์๋ ๋ฐ์ดํธ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ด๋ฉ์ผ ์ฒจ๋ถ ํ์ผ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ์ด์ง ํ์ผ์ด SMTP๋ฅผ ํตํด ์ ์ก๋๊ธฐ ์ ์ Base64๋ก ์ธ์ฝ๋ฉ๋๊ณ , ์์ ์ธก์์ ์๋ ํ์ผ๋ก ๋ค์ ๋์ฝ๋ฉ๋ฉ๋๋ค.
Q: JavaScript์์ Base64๋ฅผ ์ธ์ฝ๋ฉํ ๋ ์ ๋์ฝ๋ ๋ฌธ์(์ด๋ชจ์ง๋ ํ์ ๋ฑ)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์?
A: ๋ด์ฅ btoa() ํจ์๋ Latin-1 ๋ฌธ์(๋จ์ผ ๋ฐ์ดํธ ๋ฌธ์)๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ชจ์ง, ํ์ ๋๋ ๊ธฐํ ๋ฉํฐ๋ฐ์ดํธ ๋ฌธ์๊ฐ ํฌํจ๋ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๊ฒฝ์ฐ, TextEncoder API๋ฅผ ์ฌ์ฉํ์ฌ ๋จผ์ ๋ฐ์ดํธ๋ก ๋ณํํด์ผ ํฉ๋๋ค:
function unicodeToBase64(str) {
const bytes = new TextEncoder().encode(str);
const binaryString = String.fromCharCode(...bytes);
return btoa(binaryString);
}
function base64ToUnicode(base64) {
const binaryString = atob(base64);
const bytes = Uint8Array.from(binaryString, c => c.charCodeAt(0));
return new TextDecoder().decode(bytes);
}
Node.js์์๋ Buffer ํด๋์ค๊ฐ ์ ๋์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ฒ๋ฆฌํฉ๋๋ค: Buffer.from('Hello ไฝ ๅฅฝ ๐').toString('base64')๋ ํน๋ณํ ์ฒ๋ฆฌ ์์ด๋ ์๋ํฉ๋๋ค.