MIME Base64를 만드는 방법
- 입력 · 텍스트에 텍스트를 붙여넣으세요. 줄 바꿈은 76 (MIME, LF) 로 미리 설정되어 있습니다.
- 메시지가 다른 문자 인코딩을 선언하지 않는다면 문자 인코딩을 UTF-8로 두고,
Content-Type헤더에도 같은 값을 쓰세요. - 출력 · Base64에서 줄 바꿈한 Base64를 복사하거나 다운로드로
base64.txt를 받으세요. - 인증서나 키 본문이라면 줄 바꿈을 64 (PEM) 로 바꾸세요. HTTP, JSON 등 한 줄이 필요한 곳에는 없음을 고르세요.
MIME Base64란
MIME(RFC 2045)은 이메일이 첨부 파일, 영어 외의 텍스트, HTML을 담을 수 있게 해 주는 표준입니다. 파트의 본문이 바이너리이거나 비 ASCII 바이트로 가득하면 보내는 쪽이 이를 Base64로 인코딩하고 Content-Transfer-Encoding: base64로 표시합니다. RFC 2045는 일반 Base64에 줄 길이 규칙을 더합니다. 인코딩된 줄은 최대 76자입니다. 76자 한 줄에는 입력 57바이트가 들어갑니다.
이렇게 인코딩한 텍스트 파트는 다음과 같습니다. 두 줄의 Base64는 아래 인용한 문장에 대한 이 도구의 출력입니다.
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
Q2Fmw6kgbWVudTogY3LDqG1lIGJyw7tsw6llLCBqYWxhcGXDsW8sIHNtw7ZyZ8Olc2JvcmQuIFRo
aXMgbGluZSBpcyBsb25nIGVub3VnaCB0byB3cmFwIGFmdGVyIDc2IGNoYXJhY3RlcnMu
원래 텍스트는 Café menu: crème brûlée, jalapeño, smörgåsbord. This line is long enough to wrap after 76 characters.이며 UTF-8로 108바이트입니다. Base64 디코더로 두 줄을 함께 디코딩하면 원래 문장이 나오고, 줄 바꿈은 무시됩니다.
줄 바꿈, CRLF, 크기
줄 바꿈에는 76열 변형이 두 가지 있습니다. 76 (MIME, LF) 는 줄 바꿈 문자(\n)로 줄을 나누고, 76 (MIME, CRLF) 는 \r\n을 씁니다. 실제로 전송되는 이메일은 CRLF를 쓰지만 메일 라이브러리가 메시지를 직렬화할 때 줄 끝을 변환하므로, 코드에서는 LF로 충분합니다. 출력을 원시 .eml 파일이나 SMTP 세션에 바로 붙여넣는다면 CRLF 변형을 고르세요.
줄 바꿈은 일반적인 33%에 약간의 공간을 더 씁니다.
| 출력 | 입력 57바이트당 문자 수 | 오버헤드 |
|---|---|---|
| 한 줄, 줄 바꿈 없음 | 76 | 33.3% |
| LF로 나눈 76자 줄 | 77 | 35.1% |
| CRLF로 나눈 76자 줄 | 78 | 36.8% |
메일 크기 제한은 인코딩된 메시지에 적용되므로, 10 MB 첨부 파일은 제한 중 약 13.7 MB를 차지합니다. 정확한 수치는 크기 계산기가 알려 주고, 파트가 어떻게 구성되는지는 이메일 속 Base64에서 설명합니다.
헤더용 인코딩 워드
Subject나 From 같은 헤더에는 Content-Transfer-Encoding을 쓸 수 없습니다. 비 ASCII 헤더 텍스트에는 RFC 2047 인코딩 워드 =?charset?B?base64?=를 씁니다. 만들려면 줄 바꿈을 없음으로 두고 텍스트를 인코딩한 뒤 결과를 직접 감싸세요.
Subject: =?UTF-8?B?R3LDvMOfZSBhdXMgQmVybGlu?=
이것은 Grüße aus Berlin으로 디코딩됩니다. 인코딩 워드 하나는 최대 75자이며, 더 긴 제목은 공백으로 구분한 여러 인코딩 워드로 나눕니다. 대부분이 ASCII인 텍스트에는 메일 소프트웨어가 quoted-printable 기반의 ?Q? 형식을 쓰는 경우가 많습니다.
코드와 명령줄에서 MIME Base64
Python의 base64.encodebytes는 76자에서 \n으로 줄을 바꾸므로 이 도구와 같은 줄이 나옵니다.
import base64
text = "Café menu: crème brûlée, jalapeño, smörgåsbord. This line is long enough to wrap after 76 characters."
print(base64.encodebytes(text.encode("utf-8")).decode("ascii"))
메시지 전체라면 email 패키지가 인코딩, 헤더, CRLF를 알아서 처리합니다. Linux에서 GNU base64는 기본으로 76자에서, openssl base64는 64자에서 줄을 바꿉니다.
base64 attachment.pdf > attachment.b64
openssl base64 -in attachment.pdf -out attachment.pem.b64
반대로 원시 이메일을 분해하려면 본문과 첨부 파일을 꺼내 주는 이메일(EML) 디코더에서 여세요.
자주 묻는 질문
MIME Base64가 76자 줄을 쓰는 이유는 무엇인가요?
RFC 2045가 이메일의 줄 길이 제한인 998자(RFC 5322)보다 충분히 낮은 76자로 제한을 정했기 때문입니다. 76은 4의 배수라서 한 줄에 정확히 57바이트가 들어갑니다.
MIME Base64는 일반 Base64와 다른가요?
알파벳과 패딩은 같습니다. 유일한 차이는 줄 바꿈이며, 디코더는 줄 바꿈을 무시해야 하므로 줄 바꿈한 버전과 하지 않은 버전은 같은 바이트로 디코딩됩니다.
이메일 제목 줄의 Base64도 줄 바꿈해야 하나요?
아닙니다. 헤더는 =?UTF-8?B?R3LDvMOfZQ==?= 같은 RFC 2047 인코딩 워드를 쓰며, 여기에는 줄 바꿈이 들어가면 안 됩니다. 줄 바꿈을 없음으로 두고 제목을 인코딩하되, 인코딩 워드 하나는 75자 이하로 유지하세요.
openssl은 왜 64자 줄을 주나요?
openssl base64는 PEM 관례인 64자에서 줄을 바꾸고, GNU base64와 대부분의 메일 라이브러리는 76자에서 바꿉니다. 디코딩 결과는 같습니다. openssl과 똑같은 출력이 필요하면 여기서 64를 고르세요.