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의 배수였다는 의미입니다.