Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

Python validate=True가 두 Base64 표기를 허용하나요? canonical padding bits 강제하기

엄격한 alphabet 검사와 RFC 4648 canonical encoding은 다릅니다. Python 3.15+는 canonical=True, 이전 버전은 strict decode 후 exact re-encode 비교를 사용하세요.

Base64 syntax, byte decode, canonical gate를 나눈 원본 흐름도.
원본 일러스트: alphabet, bytes, canonical spelling을 차례로 검증하세요. Watch at Ease

validate=True는 alphabet과 padding 구조를 검사하지만 Python 3.14 이하에서는 사용하지 않는 pad bits가 0이 아닌 alias를 허용할 수 있습니다. 여러 문자열이 같은 bytes로 decode됩니다.

Python 3.15에서는 canonical=True를 쓰고, 이전 버전에서는 같은 protocol policy로 strict decode 후 exact re-encode를 비교하세요. canonical text는 authentication이 아닙니다.

1. 실제로 재현되는 결과

CPython 3.12.14에서 세 입력은 모두 c1로 decode됩니다. validate=True는 이전 버전의 zero-pad-bit check가 아닙니다.

encoder는 한 canonical spelling을 만들지만 decoder가 남는 bits를 버리면 many-to-one이 됩니다.

2. pad bits가 alias를 만드는 이유

입력이 1 byte면 두 번째 Base64 symbol의 상위 2 bits만 data이고 나머지 4 bits는 pad bits입니다.

syntax valid, decoded bytes correct, canonical text를 구분하세요.

3. Python 3.15

base64.b64decode(value, validate=True, canonical=True)를 사용하면 alias는 binascii.Error가 됩니다.

padding, whitespace, URL-safe alphabet 정책도 명시하세요.

4. 이전 버전 fallback

validate=True로 decode한 뒤 base64.b64encode로 re-encode하고 ASCII input과 완전히 같아야 합니다.

임의로 equals를 붙이지 말고 unpadded/URL-safe protocol에는 전용 canonical form을 정의하세요.

5. canonical identity가 필요한 곳

database key, cache key, dedupe, allow-list, signature input, audit id에서 alias는 identity를 분리합니다.

가능하면 decoded bytes를 저장·비교하고 text가 필요하면 boundary에서 canonicalize하세요.

6. authentication과 분리

악성 bytes도 canonical encoding을 가질 수 있습니다. MAC 또는 digital signature를 검증하세요.

canonical value, alias, invalid alphabet, bad padding, 모든 variant를 테스트하세요.

validate, canonical, re-encode, authentication 보장을 비교한 원본 표.
원본 일러스트: canonicalization은 한 표기를, signature/MAC는 신뢰를 제공합니다. Watch at Ease