

데이터는 100% 비공개로 유지됩니다. Base64 인코딩과 디코딩은 모두 사용자의 기기에서 직접 수행됩니다.
Base64는 바이너리 데이터를 64개의 ASCII 문자(A–Z, a–z, 0–9, 그리고 + 와 /)만으로 이루어진 일반 텍스트로 표현하는 방법입니다. 이미지, 키, 이메일 첨부파일 같은 바이너리를 텍스트용으로 만들어진 시스템에서도 안전하게 전송할 수 있게 해줍니다. 이는 암호화가 아니라 인코딩입니다.
Base64는 64개 문자로 이루어진 고정된 알파벳을 사용합니다. 0부터 63까지의 각 값이 그중 정확히 한 문자에 대응하며, 이를 통해 임의의 3바이트 바이너리가 4개의 읽을 수 있는 문자가 됩니다:
| 값 | 문자 | |
|---|---|---|
| 0–25 | A–Z | 대문자 26개 |
| 26–51 | a–z | 소문자 26개 |
| 52–61 | 0–9 | 숫자 10개 |
| 62–63 | + / | 기호 2개 |
"=" 기호만은 예외입니다. 이것은 64개의 값 중 하나가 아니라 패딩이며, 마지막 블록을 채우는 용도로만 쓰입니다.
거의 틀림없이 이미 본 적이 있을 것입니다. Base64는 바이너리를 텍스트 안에 실어 보내야 하는 곳이라면 어디에나 등장합니다:
그 data URI 기법은 이렇게 생겼습니다. 긴 문자열이 이미지 전체입니다:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />초기 네트워크 프로토콜은 원시 바이트가 아니라 텍스트를 위해 만들어졌습니다. ASCII는 7비트와 128개 문자를 사용했는데, 영어에는 충분했지만 바이너리에는 그렇지 않았습니다. 일부 시스템은 제어 문자를 망가뜨리거나 줄바꿈 문자를 바꿔(LF를 CR + LF로) 전송 중에 이미지와 오디오를 조 용히 손상시켰습니다.
Base64는 모든 시스템이 이미 공통으로 인정하는 문자만 내보냄으로써 이런 문제를 전부 피해 갑니다. Base16과 Base32도 더 작은 알파벳으로 같은 일을 하지만, Base64는 안전성을 유지하면서 문자당 더 많은 데이터를 담습니다. 그래서 널리 쓰이게 되었습니다.
전체 방식은 하나의 아이디어를 반복하는 것입니다. 3바이트(24비트)를 가져와 6비트씩 4개의 그룹으로 다시 나누고, 각 그룹을 알파벳에서 찾는 것이죠. "Logto"라는 단어를 손으로 직접 인코딩해 보겠습니다.
1단계. 각 문자를 8비트 2진수로 바꿉니다:
| 문자 | ASCII 코드 | 2진수 |
|---|---|---|
| L | 76 | 01001100 |
| o | 111 | 01101111 |
| g | 103 | 01100111 |
| t | 116 | 01110100 |
| o | 111 | 01101111 |
2단계. 처음 3바이트 "Log"를 가져와 그 같은 24비트를 6비트씩 4개의 그룹으로 다시 나눕니다:
3단계. 각 6비트 그룹을 숫자로 읽고, 그 숫자를 알파벳에서 찾습니다:
| 6비트 그룹 | 값 | Base64 문자 |
|---|---|---|
| 010011 | 19 | T |
| 000110 | 6 | G |
| 111101 | 61 | 9 |
| 100111 | 39 | n |
"Logto"는 5바이트로 3의 배수가 아닙니다. 마지막 두 바이트 "to"는 6 + 6 + 4로 나뉩니다. 마지막 4비트를 0으로 채워 6비트 그룹을 만들고, "="를 하나 더해 4문자 블록을 완성합니다:
블록을 이어 붙이면:
"Logto" → TG9ndG8=모든 언어에 기본으로 내장되어 있습니다. Node.js에서는:
const text = 'Logto';
const base64 = Buffer.from(text).toString('base64');
console.log(base64); // TG9ndG8=이 과정에서 기억해 둘 만한 세 가지 규칙이 나옵니다:
바이너리가 텍스트만 다루는 경로를 지나야 할 때 Base64를 사용하세요:
그 대가로 얻는 것:
표준 Base64는 URL, 쿼리 문자열, 파일 이름의 동작 방식과 충돌하는 세 문자, 즉 +, /, 그리고 = 패딩에 의존합니다. 일반 Base64 문자열을 그대로 링크에 넣으면 눈에 띄지 않게 깨질 수 있습니다:
퍼센트 인코딩으로 처리할 수도 있지만(+는 %2B, /는 %2F, =는 %3D), 문자열이 길어지고 실수로 이중 인코딩하기 쉽습니다.
Base64URL(RFC 4648 §5)은 이 문제를 근본에서 해결합니다. +를 -로, /를 _로 바꾸고 = 패딩을 없앱니다. 그 결과 아무것도 이스케이프하지 않고 URL, 쿼리 파라미터, 파일 이름에 그대로 넣을 수 있습니다. URL과 파일 이름, 많은 웹 API에서 볼 수 있습니다.
const base64 = 'TG9ndG8=';
const urlSafe = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
console.log(urlSafe); // TG9ndG8Base64는 표현 방식일 뿐, 공짜 점심이 아닙니다. 세 가지를 기억하세요:
아니요. 공개된 알파벳을 쓰는 가역적 인코딩이므로 누구나 즉시 디코딩할 수 있고, 기밀성은 전혀 더해지지 않습니다. 민감한 데이터는 암호화하세요.
Base64는 3바이트마다 4문자로 바꾸기 때문에, 인코딩된 형태는 항상 원본 바이트보다 약 3분의 1 큽니다.
출력을 4문자의 배수로 유지하는 패딩입니다. "=" 하나는 입력에 남은 바이트가 2개였음을, "=" 둘은 1개였음을, "=" 없음은 길이가 이미 3바이트의 배수였음을 뜻합니다.
Base64URL은 URL과 파일 이름에 안전한 알파벳을 쓰는 같은 인코딩입니다. -와 _가 +와 /를 대신하고, = 패딩은 보통 생략됩니다. URL과 파일 이름, 많은 웹 API에서 흔히 쓰입니다.
모든 바이너리가 가능합니다. 이미지, PDF, 키, 실행 파일 등. Base64는 원시 바이트를 다루므로 원래 콘텐츠 유형은 상관없습니다.
아니요. 인코딩과 디코딩은 전적으로 브라우저 안에서 실행됩니다. 붙여 넣은 내용은 업로드되거나 기록되지 않습니다.