같은 바이트, 다른 문자표
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-문자열만 보고 형식을 단정하지 않기
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== ZgMoyoutil은 Base64url 자동 변환이나 JWS 서명 검증을 제공하지 않습니다. 아래 코드는 형식 비교용입니다. 읽을 수 있는 텍스트를 얻었다고 서명이 유효하다는 뜻은 아닙니다. JWS 서명 입력에는 원래의 인코딩된 헤더와 페이로드가 들어가므로, 서명 검증용 입력을 다시 인코딩해 바꾸지 마세요.
자주 묻는 질문
-와 _를 지우면 디코딩할 수 있나요?
지우지 마세요. 각각 값 62와 63을 나타내는 데이터 문자입니다. 삭제하면 원래 데이터를 바꿀 수 있습니다. 이 도구가 받는 표준 Base64가 필요하다면 원래 시스템에서 표준 형식으로 내보내세요.