Base64
Base64ë ì´ì§ ë°ì´í°ë¥¼ 기ì-64 ííì¼ë¡ ë³ííì¬ ASCII 문ìì´ íìì¼ë¡ ëíë´ë ì ì¬í ì´ì§ ë°ì´í°ë¥¼ í ì¤í¸ë¡ ì¸ì½ë©ë°©ìì 그룹ì ëë¤. 'Base64'ë¼ë ì©ì´ë í¹ì MIME ì½í ì¸ ì ì¡ ì¸ì½ë©ìì ìê²¼ìµëë¤.
í¹ì ìê³ ë¦¬ì¦ì ííí기 ìí´ "Base64"ë¼ë ì©ì´ê° ë¨ë
ì¼ë¡ ì¬ì©ëë ê²½ì°, ì¼ë°ì ì¼ë¡ RFC 4648 ì¹ì
4ì ì¤ëª
ë Base64 ë²ì ì ëíë
ëë¤. Base64ë ìë ìíë²³ì ì¬ì©íì¬ 64ì§ì를 íííê³ =를 í¨ë© 문ìë¡ ì¬ì©í©ëë¤.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
ì¼ë°ì ì¸ ë³íì URL ê²½ë¡ ì¸ê·¸ë¨¼í¸ë 쿼리 매ê°ë³ììì 문ì 를 ì¼ì¼í¬ ì ìë 문ì를 í¼í기 ìí´ í¨ë©ì ìëµíê³ +/를 -_ë¡ ë°ê¾¸ë "Base64 URL ìì "ì
ëë¤.
Base64 ì¸ì½ë© ì²´ê³ë ì¼ë°ì ì¼ë¡ ASCII í ì¤í¸ë§ ì²ë¦¬í ì ìë 미ëì´(ëë ì¬ì í ììì ì´ì§ ë°ì´í°ë¥¼ ìì©í기ì ë¶ì¡±í ì¼ë¶ ASCII ìì ì§í©)를 íµí´ ì ì¥íê±°ë ì ì¡í기 ìí´ ì´ì§ ë°ì´í°ë¥¼ ì¸ì½ë©íë ë° ì¬ì©ë©ëë¤. ì´ë ê² íë©´ ì ì¡ ì¤ì ë°ì´í°ê° ìì ëì§ ìê³ ê·¸ëë¡ ì ì§ë©ëë¤. Base64ì ì¼ë°ì ì¸ ì í리ì¼ì´ì ì ë¤ìê³¼ ê°ìµëë¤.
ì¸ì½ë©ë í¬ê¸° ì¦ê°
ê° Base64 ì«ìë 6ë¹í¸ì ë°ì´í°ë¥¼ ëíë ëë¤. ë°ë¼ì, ì ë ¥ 문ìì´/ì´ì§ íì¼ì 8-ë¹í¸ ë°ì´í¸ 3ê°(38ë¹í¸ = 24ë¹í¸)ë 6ë¹í¸ Base64 ì«ì 4ê°(46 = 24ë¹í¸)ë¡ ííë ì ììµëë¤.
ì´ë 문ìì´ì´ë íì¼ì Base64 ë²ì ì´ ì¼ë°ì ì¼ë¡ ì본 ëë¹ 3ë¶ì1 ë§í¼ ë í¬ë¤ë ê²ì ì미í©ëë¤(ì íí í¬ê¸° ì¦ê°ë 문ìì´ì ì ë 길ì´, 길ì´ë¥¼ 3ì¼ë¡ ëë ëë¨¸ì§ ê°, í¨ë© 문ì ì¬ì© ì¬ë¶ ë± ë¤ìí ìì¸ì ë°ë¼ ë¬ë¼ì§ëë¤).
JavaScript ì§ì
ë¸ë¼ì°ì ë 기본ì ì¼ë¡ Base64 문ìì´ì ëì½ë©íê³ ì¸ì½ë©í기 ìí ë ê°ì§ JavaScript í¨ì를 ì ê³µí©ëë¤.
btoa: ì´ì§ ë°ì´í° 문ìì´ìì Base64ë¡ ì¸ì½ë©ë ASCII 문ìì´ì ìì±í©ëë¤("btoa"ë "binary to ASCII"ë¡ ì½ì´ì¼ í©ëë¤).atob: Base64ë¡ ì¸ì½ë©ë 문ìì´ì ëì½ë©í©ëë¤("atob"ë "ASCII to binary"ë¡ ì½ì´ì¼ í©ëë¤).
ì°¸ê³ :
Base64ë í
ì¤í¸ ì¸ì½ë©ì´ ìë ë°ì´ë리 ì¸ì½ë©ì´ì§ë§, ë°ì´ë리 ë°ì´í° íì
ì ì§ìí기 ì ì btoa ë° atobê° ì¹ íë«í¼ì ì¶ê°ëììµëë¤. ê²°ê³¼ì ì¼ë¡ ë í¨ìë 문ìì´ì ì¬ì©íì¬ ì´ì§ ë°ì´í°ë¥¼ ëíë´ë©°, ê° ë¬¸ìì ì½ë í¬ì¸í¸ë ê° ë°ì´í¸ ê°ì ëíë
ëë¤. ì´ë¡ ì¸í´, btoa를 ì¬ì©íì¬ ììì í
ì¤í¸ ë°ì´í°ë¥¼ ì¸ì½ë©í ì ìë¤ë ì¼ë°ì ì¸ ì¤í´ê° ìê²¼ìµëë¤. ì를 ë¤ì´, í
ì¤í¸ ëë HTML 문ìì Base64 data: URLì ìì±íë ê²ì
ëë¤.
ê·¸ë¬ë, ë°ì´í¸ ì½ë í¬ì¸í¸ ëìì 0x7f ê¹ì§ì ì½ë í¬ì¸í¸ì ëí´ìë§ ìì ì ì¼ë¡ ì ì§ë©ëë¤. ëí, 0xff ì´ìì ì½ë í¬ì¸í¸ë 1ë°ì´í¸ì ìµë ê°ì ì´ê³¼íì¬ btoaìì ì¤ë¥ë¥¼ ë°ììíµëë¤. ë¤ì ì¹ì
ììë ììì ì ëì½ë í
ì¤í¸ë¥¼ ì¸ì½ë©í ë ì´ ì í ì¬íì í´ê²°íë ë°©ë²ì ìì¸í ì¤ëª
í©ëë¤.
"ì ëì½ë 문ì "
btoaë ì
ë ¥ 문ìì´ì ì½ë í¬ì¸í¸ë¥¼ ë°ì´í¸ ê°ì¼ë¡ í´ìíë¯ë¡ 문ìì´ìì btoa를 í¸ì¶íë©´ 문ìì ì½ë í¬ì¸í¸ê° 0xff를 ì´ê³¼íë ê²½ì° "문ì ë²ì를 ë²ì´ë¬ìµëë¤" ìì¸ê° ë°ìí©ëë¤. ììì ì ëì½ë í
ì¤í¸ë¥¼ ì¸ì½ë©í´ì¼ íë ì¬ì© ì¬ë¡ì ê²½ì°, 먼ì 문ìì´ì UTF-8ì êµ¬ì± ë°ì´í¸ë¡ ë³íí ë¤ì ë°ì´í¸ë¥¼ ì¸ì½ë©í´ì¼ í©ëë¤.
ê°ì¥ ê°ë¨í í´ê²°ì±
ì TextEncoder ë° TextDecoder를 ì¬ì©íì¬ ë¬¸ìì´ì UTF-8ê³¼ ë¨ì¼ ë°ì´í¸ íí ê°ì ë³ííë ê²ì
ëë¤.
function base64ToBytes(base64) {
const binString = atob(base64);
return Uint8Array.from(binString, (m) => m.codePointAt(0));
}
function bytesToBase64(bytes) {
const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("");
return btoa(binString);
}
// Usage
bytesToBase64(new TextEncoder().encode("a Ä ð æ ð¦")); // "YSDEgCDwkICAIOaWhyDwn6aE"
new TextDecoder().decode(base64ToBytes("YSDEgCDwkICAIOaWhyDwn6aE")); // "a Ä ð æ ð¦"
ììì ì´ì§ ë°ì´í° ë³í
ì´ì ì¹ì
ì bytesToBase64 ë° base64ToBytes í¨ì를 ì¬ì©íì¬ Base64 문ìì´ê³¼ Uint8Array ê°ì ë³íí ì ììµëë¤.
ëë, 기본ì ì¼ë¡ FileReader ë° fetch API를 íµí´ ì¹ íë«í¼ ë´ìì base64 ë°ì´í° URL ê° ë¹ë기 ë³íì´ ê°ë¥í©ëë¤.
async function bytesToBase64DataUrl(bytes, type = "application/octet-stream") {
return await new Promise((resolve, reject) => {
const reader = Object.assign(new FileReader(), {
onload: () => resolve(reader.result),
onerror: () => reject(reader.error),
});
reader.readAsDataURL(new File([bytes], "", { type }));
});
}
async function dataUrlToBytes(dataUrl) {
const res = await fetch(dataUrl);
return new Uint8Array(await res.arrayBuffer());
}
// ì¬ì©ë²
await bytesToBase64DataUrl(new Uint8Array([0, 1, 2])); // "data:application/octet-stream;base64,AAEC"
await dataUrlToBytes("data:application/octet-stream;base64,AAEC"); // Uint8Array [0, 1, 2]