Base64는 암호가 아니라 표기법
Base64는 임의의 바이트를 A~Z, a~z, 0~9와 기호 두 개로만 적는 방식입니다. 3바이트를 6비트씩 넷으로 쪼개 각각 한 글자로 바꾸므로, 결과 길이는 원본의 약 4/3이 됩니다. 남는 자리는 끝에 등호를 붙여 채웁니다.
쓰는 이유는 텍스트만 통과하는 통로에 이진 데이터를 실어 보내기 위해서입니다. 메일 첨부, 웹페이지에 박아 넣는 이미지, HTTP 헤더에 담는 인증 정보가 대표적입니다. 중간 시스템이 바이트를 건드려 깨뜨리는 일을 막아 줍니다.
한글처럼 여러 바이트를 쓰는 문자는 먼저 UTF-8로 바뀐 뒤 인코딩됩니다. '안녕'은 6바이트이므로 Base64 결과는 8글자가 되고, 영문 6글자와 같은 길이가 나옵니다. 길이만 보고 원문 글자 수를 짐작하면 틀리는 이유입니다.
인코딩을 보안으로 착각하지 않기
Base64는 누구나 즉시 되돌릴 수 있습니다. 비밀번호나 토큰을 Base64로 적어 두는 것은 감추는 것이 아니라 읽기 불편하게 만드는 것뿐이고, 저장소나 로그에 남으면 그대로 노출됩니다. 감춰야 할 값에는 암호화나 해시를 써야 합니다.
URL에 Base64 결과를 그대로 넣으면 깨집니다. 표준 Base64가 쓰는 더하기와 빗금은 URL에서 다른 뜻을 가지므로, 웹 주소에 담을 때는 이를 대체 문자로 바꾼 URL-safe 변형을 써야 합니다.
디코딩이 실패하는 경우는 대부분 길이나 패딩 문제입니다. Base64 문자열의 길이는 4의 배수여야 하고, 복사하는 과정에서 줄바꿈이나 공백이 섞여 들어가면 파서가 거부합니다.