기술 · 실용 가이드
Python validate=True가 두 Base64 표기를 허용하나요? canonical padding bits 강제하기
엄격한 alphabet 검사와 RFC 4648 canonical encoding은 다릅니다. Python 3.15+는 canonical=True, 이전 버전은 strict decode 후 exact re-encode 비교를 사용하세요.

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를 테스트하세요.
