Base64URL로 인코딩하는 방법
- 입력 · 텍스트에 텍스트를 입력하거나 붙여넣으세요.
- 출력 · Base64에서 Base64URL을 복사하세요. 이 페이지에서는 URL-safe (- _) 옵션과 패딩 없음 (=) 옵션이 이미 체크되어 있습니다.
- 받는 쪽이 패딩을 원하면 패딩 없음 (=) 체크를 해제하세요. 표준 Base64를 원하면 URL-safe도 해제하거나 Base64 인코딩을 사용하세요.
- 출력을 복사하거나
base64.txt로 다운로드하세요.
값을 디코딩하려면 Base64URL 디코더를 쓰고, 이미 있는 문자열을 두 알파벳 사이에서 변환하려면 Base64를 Base64URL로를 쓰세요.
표준 Base64와 무엇이 다른가
다른 문자는 세 개뿐입니다. 3바이트를 4문자로 바꾸는 규칙을 비롯한 나머지는 모두 같습니다.
| 표준 Base64 | Base64URL | |
|---|---|---|
| 값 62 | + | - |
| 값 63 | / | _ |
| 패딩 | = 필수 | 보통 생략 |
| 정의 | RFC 4648 4절 | RFC 4648 5절 |
짧은 문자열은 대개 두 변형이 패딩에서만 다릅니다. 알파벳 차이는 6비트 그룹의 값이 62나 63일 때 나타나는데, ?나 > 같은 문자와 비 ASCII 바이트 상당수가 이런 값을 만듭니다.
| 입력 | 표준 | Base64URL, 패딩 없음 |
|---|---|---|
Hi! | SGkh | SGkh |
?>?> | Pz4/Pg== | Pz4_Pg |
subjects?_d | c3ViamVjdHM/X2Q= | c3ViamVjdHM_X2Q |
https://example.com/?q=1 | aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT0x | aHR0cHM6Ly9leGFtcGxlLmNvbS8_cT0x |
역사와 디코딩 차이는 Base64와 Base64URL 비교에서 더 깊이 다룹니다.
URL에 별도의 알파벳이 필요한 이유
표준 문자 세 개는 URL 안에서 각각 의미를 가집니다. /는 경로 세그먼트를 나누고, =는 쿼리 문자열에서 이름과 값을 나누며, +는 폼 디코더가 공백으로 읽습니다. 쿼리 파라미터에 넣은 a+b/c== 같은 표준 Base64 값은 모든 문자를 이스케이프하지 않으면 a b/c==로 도착합니다. 퍼센트 인코딩으로 해결할 수 있지만 각 문자가 세 글자(%2B, %2F, %3D)가 됩니다.
Base64URL은 URL에서 예약되지 않은 두 문자를 고르고 패딩을 빼므로, 값을 경로, 쿼리 문자열, 프래그먼트, 쿠키, 파일 이름에 그대로 붙여넣을 수 있습니다. -와 _는 /와 달리 흔히 쓰는 모든 파일 시스템에서 파일 이름에 안전합니다.
Base64URL이 쓰이는 곳
- JWT와 JOSE. JSON Web Token의 모든 부분은 RFC 7515에 정의된 패딩 없는 Base64URL입니다. JWT 디코더로 토큰을 읽을 수 있고, 구조는 JWT 속 Base64에서 설명합니다.
- OAuth PKCE.
code_challenge는code_verifier의 SHA-256 해시를 Base64URL로 인코딩한 값입니다. - WebAuthn과 패스키. 자격 증명 ID와 챌린지가 JSON 안에서 Base64URL로 오갑니다.
- 링크와 ID. 공유 링크, 서명된 URL 파라미터, 랜덤 바이트로 만든 짧은 ID가 URL을 깔끔하게 유지하려고 Base64URL을 씁니다.
코드에서 Base64URL
Node.js에는 내장 base64url 인코딩이 있고, Python에는 URL-safe 함수가 있지만 패딩은 직접 제거해야 합니다.
// Node.js
Buffer.from("subjects?_d").toString("base64url"); // "c3ViamVjdHM_X2Q"
// Browsers with Uint8Array.prototype.toBase64
new TextEncoder().encode("subjects?_d").toBase64({ alphabet: "base64url", omitPadding: true });
import base64, hashlib
base64.urlsafe_b64encode(b"subjects?_d").rstrip(b"=").decode() # 'c3ViamVjdHM_X2Q'
# PKCE code_challenge, example from RFC 7636 appendix B
verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
digest = hashlib.sha256(verifier.encode("ascii")).digest()
base64.urlsafe_b64encode(digest).rstrip(b"=").decode()
# 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM'
자세한 내용은 Node.js에서 Base64, JavaScript, Python에 있으며, 브라우저 API는 Uint8Array.toBase64에서 다룹니다.
자주 묻는 질문
Base64URL이란 무엇인가요?
RFC 4648 5절에 정의된, URL과 파일 이름에 안전한 Base64 변형입니다. 알파벳의 마지막 두 문자로 +와 / 대신 -와 _를 쓰며, 보통 = 패딩 없이 표기합니다.
일반 Base64를 퍼센트 인코딩하면 안 되나요?
작동은 하지만 +, /, = 하나마다 세 글자가 들고, 이스케이프를 하나라도 빠뜨리면 쿼리 문자열을 파싱할 때 +가 공백으로 바뀝니다. Base64URL은 두 문제를 모두 피합니다.
= 패딩을 남겨 둬야 하나요?
JWT와 대부분의 URL-safe 형식은 패딩을 생략합니다. =도 URL에서 이스케이프가 필요하고, 디코더가 길이에서 패딩을 계산할 수 있기 때문입니다. 받는 시스템이 요구할 때만 남기세요. 패딩 없음 체크를 해제하면 됩니다.
PKCE code_challenge는 어떻게 만드나요?
code_verifier를 SHA-256으로 해시하고, 해시 32바이트를 패딩 없이 Base64URL로 인코딩합니다. 이 페이지는 해시 바이트가 아니라 텍스트를 인코딩하므로 코드로 처리하세요. 아래 코드가 RFC 7636의 예시를 재현합니다.