Base64 인코딩의 기본 개념
Base64 인코딩은 이진 데이터를 ASCII 문자열로 변환하는 방법입니다. Base64는 암호화 또는 압축 기술이 아닙니다. Base64 인코딩을 사용하면 데이터 크기가 약 33% 증가합니다. Base64는 Base16, Base32와 함께 가장 널리 사용되는 인코딩 방식 중 하나입니다.
Base64 인코딩 작동 방식
텍스트 문자열을 Base64로 변환하는 과정은 다음과 같습니다:
- 입력 텍스트의 8비트 이진 표현을 계산합니다.
- 8비트 데이터를 6비트 블록으로 재구성합니다.
- 각 6비트 블록의 십진 값을 구합니다.
- Base64 변환표를 사용하여 각 십진 값에 해당하는 Base64 문자를 찾습니다.
예를 들어 "Go win" 문자열을 Base64로 변환해 보겠습니다. 먼저 문자열을 이진 표현으로 변환합니다:
01000111 01101111 00100000 01110111 01101001 01101110
G o w i n
각 문자는 8비트로 표현됩니다. Base64는 이 8비트 데이터를 6비트 블록으로 다시 나눕니다:
010001 110110 111100 100000 011101 110110 100101 101110
각 블록의 십진 값을 계산합니다:
이진 십진
010001 17
110110 54
111100 60
100000 32
011101 29
110110 54
100101 37
101110 46
Base64 변환표를 사용하여 각 십진 값을 Base64 문자로 변환합니다. 17은 'R', 54는 '2'에 해당하므로 "Go win"은 "R28gd2lu"로 인코딩됩니다.
Base64 인코딩 사용 이유
모든 시스템이 이진 데이터를 처리할 수 있는 것은 아닙니다. 반면 ASCII 문자는 대부분의 시스템에서 쉽게 처리됩니다. 예를 들어 이메일 서버는 텍스트 데이터를 필요로 하므로, 이미지나 바이너리 파일을 전송하려면 Base64로 인코딩해야 합니다.
Node.js에서 Base64 문자열 인코딩
Node.js에서 Buffer 객체를 사용하면 Base64 인코딩을 간단히 수행할 수 있습니다. 전역 객체인 Buffer는 추가 require 문 없이 사용 가능합니다.
'use strict';
let inputStr = 'stackabuse.com';
let bufferObj = Buffer.from(inputStr);
let encodedStr = bufferObj.toString('base64');
console.log('"' + inputStr + '"를 Base64로 변환: "' + encodedStr + '"');
실행 결과:
$ node encode-text.js
"stackabuse.com"를 Base64로 변환: "c3RhY2thYnVzZS5jb20="
Node.js에서 Base64 문자열 디코딩
디코딩은 인코딩과 유사합니다. Buffer.from()에 Base64 데이터와 'base64' 인자를 전달한 후, toString() 메서드로 ASCII 형식으로 변환합니다.
'use strict';
let encodedData = 'c3RhY2thYnVzZS5jb20=';
let bufferObj = Buffer.from(encodedData, 'base64');
let decodedText = bufferObj.toString('ascii');
console.log('"' + encodedData + '"를 Base64에서 ASCII로 변환: "' + decodedText + '"');
이진 데이터를 Base64 문자열로 인코딩
이미지와 같은 이진 데이터를 Base64로 변환하는 예제입니다:
'use strict';
const fs = require('fs');
let imageBuffer = fs.readFileSync('stack-abuse-logo.png');
let encodedImage = imageBuffer.toString('base64');
console.log('이미지 Base64 인코딩 결과:\n\n' + encodedImage);
Base64 문자열을 이진 데이터로 디코딩
역과정으로 Base64 문자열을 원본 이진 파일로 복원합니다:
'use strict';
const fs = require('fs');
let base64ImageData = `iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVUTUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5DaWb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTFiSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHhVdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5GK4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZNtFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxSbAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII=`;
let buffer = Buffer.from(base64ImageData, 'base64');
fs.writeFileSync('stack-abuse-logo-out.png', buffer);
console.log('Base64 이미지 데이터가 파일로 변환되었습니다: stack-abuse-logo-out.png');
참고 자료: stackabuse.com