base64 — Base16, Base32, Base64, Base85 데이터 인코딩
base64 — Base16, Base32, Base64, Base85 데이터 인코딩
(소스: Lib/base64.py)
이 모듈은 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고, 그런 인코딩을 다시 바이너리 데이터로 디코딩하는 함수를 제공해요. 여기에는 RFC 4648에 명시된 인코딩(Base64, Base32, Base16), PDF 2.0에 명시된 Base85 인코딩, 그리고 다른 곳에서 쓰이는 비표준 Base85 변형들이 포함돼요.
이 모듈은 두 가지 인터페이스를 제공해요.
- 최신 인터페이스 (modern interface): bytes-like 객체를 ASCII bytes로 인코딩하고, bytes-like 객체나 ASCII를 담은 문자열을 bytes로 디코딩해요. RFC 4648에 정의된 두 Base64 알파벳(일반, URL·파일시스템 안전)을 모두 지원해요.
- 레거시 인터페이스 (legacy interface): 문자열에서 디코딩은 지원하지 않지만, 파일 객체로 인코딩/디코딩하는 함수를 제공해요. Base64 표준 알파벳만 지원하고, RFC 2045에 따라 76자마다 개행을 추가해요. RFC 2045 지원을 찾고 있다면
email패키지를 보는 게 좋을 거예요.
버전 변경 (3.3): 최신 인터페이스의 디코딩 함수가 ASCII 전용 유니코드 문자열을 수용하게 됐어요. (3.4) 모든 인코딩/디코딩 함수가 bytes-like 객체를 수용하고, Ascii85/Base85 지원이 추가됐어요.
본문
RFC 4648 인코딩
RFC 4648 인코딩은 이메일로 안전하게 보내거나, URL의 일부로 쓰거나, HTTP POST 요청의 일부로 포함할 수 있도록 바이너리 데이터를 인코딩하기에 적합해요.
base64.b64encode(s, altchars=None): Base64로 s를 인코딩하고 인코딩된 bytes를 반환. 선택적altchars는+와/문자를 대체할 알파벳을 지정하는 길이 2의 bytes-like 객체 (URL 또는 파일시스템 안전한 Base64 문자열 생성에 사용). 기본은 None으로 표준 알파벳 사용.altchars길이가 2가 아니면 assert 또는ValueError, bytes-like가 아니면TypeError.base64.b64decode(s, altchars=None, validate=False): Base64 인코딩된 s를 디코딩해 bytes 반환. s가 잘못 패딩되면binascii.Error.validate가 False(기본)면 알파벳 밖 문자를 패딩 검사 전에 버리고, True면binascii.Error발생. 엄격한 base64 검사는binascii.a2b_base64()를 참고.base64.standard_b64encode(s)/base64.standard_b64decode(s): 표준 Base64 알파벳으로 인코딩/디코딩.base64.urlsafe_b64encode(s)/base64.urlsafe_b64decode(s): URL·파일시스템 안전한 알파벳 사용. 표준 알파벳에서+대신-,/대신_를 사용해요. 결과에 여전히=가 포함될 수 있어요.base64.b32encode(s): Base32로 인코딩해 bytes 반환.base64.b32decode(s, casefold=False, map01=None): Base32 인코딩된 s를 디코딩.casefold는 소문자 알파벳 입력 허용 여부(보안상 기본 False). RFC 4648은 숫자 0을 O로, 1을 I 또는 L로 매핑하는 것을 허용하는데,map01이 None이 아니면 숫자 1이 매핑될 문자를 지정해요(map01이 None이 아니면 0은 항상 O로). 보안상 기본은 None이라 입력에 0과 1이 허용되지 않아요. s가 잘못 패딩되거나 비알파벳 문자가 있으면binascii.Error.base64.b32hexencode(s)/base64.b32hexdecode(s, casefold=False): RFC 4648의 Extended Hex Alphabet 사용 (3.10 추가). hex 버전은 0→O, 1→I/L 매핑을 허용하지 않아요.base64.b16encode(s)/base64.b16decode(s, casefold=False): Base16으로 인코딩/디코딩.
Base85 인코딩
Base85 인코딩은 네 바이트를 다섯 개의 ASCII 문자로 표현하는 알고리즘 계열이에요. 원래 Unix btoa(1) 유틸리티에서 구현됐고, 한 버전이 Adobe가 PostScript 언어에서 채택했으며 PDF 2.0(ISO 32000-2)에 표준화됐어요. 이 버전(btoa와 PDF 변형 모두)은 a85encode()로 구현돼요. 다른 출력 문자 집합을 쓰는 별도 버전이 RFC 1924의 April Fool 농담으로 정의됐지만 지금은 Git과 다른 소프트웨어가 사용해요 (b85encode()). 마지막으로 프로그래밍 언어 문자열에 안전하게 포함되도록 설계된 또 다른 문자 집합을 쓰는 세 번째 버전이 ZeroMQ가 정의했고 여기서 z85encode()로 구현돼요.
이 모듈의 함수들은 다음을 어떻게 다루는지가 달라요. <~ ~> 마커 포함 여부, 여러 줄로 접기 여부, 인코딩에 쓸 ASCII 문자 집합, 공백과 null 바이트 시퀀스의 컴팩트 인코딩, 입력에 적용하는 zero-padding 바이트 인코딩.
base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False): Ascii85로 인코딩.foldspaces는 연속된 4개의 공백(ASCII 0x20) 대신 'y' 짧은 시퀀스를 쓰는 옵션(btoa 지원; PDF 표준은 미지원).wrapcol이 0이 아니면 각 출력 줄이 최대 그만큼의 문자 길이가 되도록b'\n'을 추가.pad는 btoa처럼 출력에서 zero-padding을 완전히 유지할지(출력이 정확히 5바이트 배수).adobe는<~와~>로 프레이밍할지(PDF의 ASCII85Decode 스트림은~>로 끝나야 하지만 선행<~는 쓰면 안 되요). (3.4 추가)base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b'): Ascii85 디코딩.foldspaces는 'y' 짧은 시퀀스를 4개 공백으로 받아들일지.adobe는<~~>마커 존재 여부(선행<~는 필수 아니지만 입력은~>로 끝나야 함, 아니면ValueError).ignorechars는 입력에서 무시할 문자 바이트 문자열(기본은 ASCII 공백 문자 전부). (3.4 추가)base64.b85encode(b, pad=False): base85로 인코딩(git 스타일 바이너리 diff 등). 인코딩 전 입력을b'\0'으로 패딩해 길이를 4바이트 배수로 만들어요.pad가 true면 결과 모든 문자를 출력에 유지(항상 5바이트 배수라 디코딩 시 길이가 보존되지 않을 수 있음). (3.4 추가)base64.b85decode(b): base85 디코딩. (3.4 추가)base64.z85encode(s)/base64.z85decode(s): Z85(ZeroMQ)로 인코딩/디코딩. ZeroMQ 사양은 Z85 인코딩 데이터 길이가 5바이트 배수여야 해요. 준수 데이터 프레임을 만들려면 입력을 4바이트 배수로 패딩해야 해요. (3.13 추가)
레거시 인터페이스 (Legacy Interface)
base64.decode(input, output): 바이너리 input 파일의 내용을 디코딩해 output 파일에 써요. 둘 다 파일 객체여야 해요.input.readline()이 빈 bytes를 반환할 때까지 읽어요.base64.decodebytes(s): base64 인코딩 데이터의 한 줄 이상을 담은 s를 디코딩해 bytes 반환. (3.1 추가)base64.encode(input, output): 바이너리 input 파일 내용을 인코딩해 output 파일에 써요. RFC 2045(MIME)에 따라 출력 76바이트마다b'\n'을 넣고 항상 새 줄로 끝나도록 해요.base64.encodebytes(s): 임의 바이너리 데이터를 담을 수 있는 s를 인코딩해 base64 인코딩 데이터 bytes를 반환. 76바이트마다 개행, RFC 2045(MIME). (3.1 추가)
예제를 보면:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'
보안 고려사항
RFC 4648에 새 보안 고려사항 섹션(섹션 12)이 추가됐어요. 프로덕션에 배포하는 어떤 코드든 보안 섹션을 검토하는 걸 권장해요.
참고: binascii 모듈(ASCII↔바이너리 변환 지원), RFC 1521(MIME의 base64 정의), ISO 32000-2 PDF 2.0(Ascii85 정의), ZeroMQ RFC 32/Z85(문자 집합 정의)도 함께 보세요.