같은 바이트, 다른 문자표

RFC 4648의 표준 Base64는 값 62와 63에 +와 /를 쓰고, Base64url은 -와 _를 씁니다. 텍스트 ???는 표준 방식에서 Pz8/, URL 방식에서 Pz8_입니다. >>>는 Pj4+와 Pj4-입니다. Moyoutil의 텍스트 Base64 도구로 표준 문자열은 복원되지만 -나 _가 있는 문자열은 형식 오류가 납니다. 아래 Node.js 코드는 두 방식의 차이를 따로 재현합니다.

for (const text of ["???", ">>>"]) {
  const bytes = Buffer.from(text, "utf8");
  console.log(bytes.toString("base64"),
              bytes.toString("base64url"));
}
// Pz8/ Pz8_
// Pj4+ Pj4-
값 62와 63에 대응하는 Base64 및 Base64url 문자와 두 텍스트 예시
직접 제작한 문자표 비교도. 아래 행은 가상 입력의 실제 인코딩 결과입니다.

RFC 4648 §5: Base64url alphabet

문자열만 보고 형식을 단정하지 않기

foo는 두 방식 모두 Zm9v입니다. +, /, -, _가 없다고 표준 Base64라고 단정할 수 없습니다. 입력을 만든 시스템의 형식 명세를 확인하세요. 패딩도 별개의 규칙입니다. RFC 4648은 참조 명세가 달리 정하지 않으면 패딩을 요구하고, RFC 7515의 JWS Base64url 정의는 끝의 =를 생략합니다. 예를 들어 f는 표준 방식에서 Zg==, 패딩 없는 URL 방식에서 Zg입니다.

for (const text of ["foo", "f"]) {
  const bytes = Buffer.from(text, "utf8");
  console.log(bytes.toString("base64"),
              bytes.toString("base64url"));
}
// Zm9v Zm9v
// Zg== Zg

Moyoutil은 Base64url 자동 변환이나 JWS 서명 검증을 제공하지 않습니다. 아래 코드는 형식 비교용입니다. 읽을 수 있는 텍스트를 얻었다고 서명이 유효하다는 뜻은 아닙니다. JWS 서명 입력에는 원래의 인코딩된 헤더와 페이로드가 들어가므로, 서명 검증용 입력을 다시 인코딩해 바꾸지 마세요.

RFC 7515 §2–3: Base64url and JWS signing input

자주 묻는 질문

-와 _를 지우면 디코딩할 수 있나요?

지우지 마세요. 각각 값 62와 63을 나타내는 데이터 문자입니다. 삭제하면 원래 데이터를 바꿀 수 있습니다. 이 도구가 받는 표준 Base64가 필요하다면 원래 시스템에서 표준 형식으로 내보내세요.